Библиотека Globalize в современной JavaScript-экосистеме построена вокруг модульного подхода и использования данных CLDR (Common Locale Data Repository). Основной фактор, влияющий на размер итогового бандла, — раздельная загрузка функциональности и локализационных данных.
Базовая особенность заключается в том, что сама библиотека не содержит языковых данных. Все локали, форматы чисел, дат, валют и правила склонений подключаются отдельно. Это делает невозможным «случайное» раздувание бандла, но требует осознанной сборки.
Ключевая идея минимизации размера — подключение только тех модулей Globalize, которые реально используются, и только тех CLDR-данных, которые необходимы приложению.
Globalize разбит на набор независимых модулей:
Каждый модуль подключается отдельно:
import Globalize from "globalize";
import "globalize/number";
import "globalize/date";
Такой подход позволяет исключить неиспользуемые части библиотеки на этапе сборки через tree-shaking.
Современные сборщики (Webpack, Rollup, Vite) позволяют удалять неиспользуемый код, если используется ES Modules.
Для эффективной минимизации:
Пример корректного импорта:
import Globalize from "globalize/dist/globalize.runtime.esm";
import "globalize/number";
Важно, что runtime-версия не содержит встроенных CLDR-данных и дополнительных утилит разработки, что уменьшает базовый размер пакета.
CLDR — основной источник локализационной информации. Его объём значительно превышает размер самого Globalize, поэтому стратегия загрузки данных критична.
Подключение выполняется явно:
import likelySubtags from "cldr-core/supplemental/likelySubtags.json";
import timeData from "cldr-core/supplemental/timeData.json";
import numbers from "cldr-numbers-full/main/ru/numbers.json";
import currencies from "cldr-numbers-full/main/ru/currencies.json";
Globalize.load(likelySubtags, timeData, numbers, currencies);
Минимизация достигается за счёт:
cldr-*-minimal пакетов вместо
full, когда это возможноОдним из наиболее эффективных способов уменьшения стартового бандла является отложенная загрузка локализаций.
Основной бандл содержит только базовую локаль (например,
en), остальные загружаются по требованию:
async function loadLocale(locale) {
const cldrData = await import(`cldr-numbers-full/main/${locale}/numbers.json`);
Globalize.load(cldrData);
Globalize.locale(locale);
}
Такой подход особенно важен для приложений с большим количеством языков, где пользователь использует только один.
Globalize позволяет подключать только необходимые категории форматирования.
import "globalize/number";
Если в приложении используется только форматирование валют, но не
обычных чисел, подключение number может быть избыточным,
хотя на практике часто используется вместе.
import "globalize/currency";
При отсутствии валютной логики этот модуль исключается полностью, что уменьшает размер бандла.
import "globalize/date";
Даты являются одним из самых «тяжёлых» модулей из-за зависимости от календарных данных CLDR. При минимизации важно избегать загрузки календарей для всех локалей.
CLDR распространяется в нескольких вариантах:
cldr-corecldr-numbers-fullcldr-dates-fullcldr-misc-fullДля уменьшения размера предпочтение отдаётся:
main/<locale>)full-наборов, если функциональность
ограниченаПример минимального набора для чисел:
import numbers from "cldr-numbers-full/main/ru/numbers.json";
Исключение ненужных категорий (например, percent patterns или scientific format) уменьшает итоговый размер JSON-данных.
В SPA-приложениях Globalize часто подключается на уровне маршрутов:
Пример динамического импорта:
route.onEnter(async () => {
const { default: Globalize } = await import("globalize");
await import("globalize/date");
const cldr = await import("cldr-dates-full/main/ru/ca-gregorian.json");
Globalize.load(cldr);
});
Модуль сообщений часто воспринимается как лёгкий, однако при использовании ICU-синтаксиса и plural rules он тянет дополнительные зависимости.
Для уменьшения размера:
import "globalize/message";
import "globalize/plural";
Если plural logic не используется, соответствующий модуль исключается полностью.
Даже внутри одной локали CLDR содержит множество секций:
Минимизация достигается ручным отбором JSON:
Разные инструменты сборки по-разному обрабатывают Globalize:
sideEffects: falsecldr-full вместо частичных данныхglobalize/dist/globalize.jsСценарий минимальной конфигурации для одного языка и числового форматирования:
import Globalize from "globalize/dist/globalize.runtime.esm";
import "globalize/number";
import likelySubtags from "cldr-core/supplemental/likelySubtags.json";
import numbers from "cldr-numbers-full/main/ru/numbers.json";
Globalize.load(likelySubtags, numbers);
Globalize.locale("ru");
Такой набор исключает:
и оставляет только базовое форматирование чисел.
При росте приложения используется комбинация подходов:
Архитектура обычно строится вокруг принципа: «данные локали — это контент, а не код приложения», что позволяет эффективно кешировать и обновлять их независимо от логики интерфейса.