Минификация данных в Globalize связана с уменьшением объёма локализационных ресурсов (CLDR-данных) и пользовательских сообщений, которые попадают в итоговую сборку приложения. Библиотека Globalize опирается на стандартизированные данные Unicode CLDR (Common Locale Data Repository), которые включают числовые форматы, валюты, правила плюрализации, форматы дат и времени, а также локализованные строки. Эти данные в исходном виде достаточно объёмные, и их необдуманное подключение приводит к значительному увеличению размера JavaScript-бандла.
CLDR-структура изначально проектировалась как универсальный источник локализационной информации для всех языков мира. В результате:
Globalize использует подмножество этих данных, но при неправильной конфигурации приложения в сборку попадает весь пакет локалей или значительная его часть. Это особенно критично в браузерных приложениях, где каждый килобайт влияет на скорость загрузки.
Минификация в контексте Globalize строится на принципе подключения только используемых сегментов CLDR. Вместо загрузки полной базы данных используется выборочная загрузка:
en,
ru);CLDR разбит на модули, и Globalize позволяет загружать их независимо. Это создаёт основу для агрессивной оптимизации.
CLDR-данные в Globalize условно делятся на следующие категории:
Минификация заключается в исключении ненужных категорий и локалей.
Например, если приложение не использует валютное форматирование, модуль
currencyData может быть полностью исключён.
Современные сборщики (Webpack, Rollup, Vite) позволяют применять tree-shaking к Globalize-модулям, однако эффективность зависит от структуры импортов.
Правильный подход:
globalize с полным
набором методов;Пример избыточного подключения:
import Globalize from "globalize";
Такой импорт часто приводит к включению большого количества зависимостей.
Оптимизированный вариант:
import Globalize from "globalize/dist/globalize";
import "globalize/dist/globalize/number";
import "globalize/dist/globalize/currency";
Каждый модуль подключается отдельно, что позволяет сборщику исключать неиспользуемые части.
CLDR-данные обычно подключаются явно:
import likelySubtags from "cldr-data/supplemental/likelySubtags";
import plurals from "cldr-data/supplemental/plurals";
import timeData from "cldr-data/supplemental/timeData";
import ruNumbers from "cldr-data/main/ru/numbers";
import ruCurrencies from "cldr-data/main/ru/currencies";
import ruCaGregorian from "cldr-data/main/ru/ca-gregorian";
Такой подход позволяет контролировать состав данных на уровне модулей.
Ключевой принцип минификации — исключение любых main/*,
которые не используются в интерфейсе. Если приложение поддерживает
только одну локаль, остальные полностью удаляются из сборки.
Globalize поддерживает форматирование сообщений через ICU-подобный синтаксис. Эти сообщения также могут стать источником избыточности.
Пример неоптимального набора сообщений:
Globalize.loadMessages({
ru: {
greeting: "Привет",
farewell: "До свидания",
dateFormatLong: "EEEE, d MMMM yyyy"
}
});
При масштабировании приложения количество сообщений растёт, и без оптимизации они начинают занимать значительный объём.
Минификация сообщений достигается за счёт:
Одним из наиболее эффективных методов уменьшения размера начальной загрузки является отложенная загрузка локализационных данных.
Структура приложения:
en;Пример динамического подключения:
async function loadLocale(locale) {
const cldrData = await import(`cldr-data/main/${locale}/numbers`);
Globalize.load(cldrData);
}
Такой подход снижает размер initial bundle, особенно в приложениях с множеством языков.
На уровне сборки можно заранее агрегировать минимальный набор CLDR:
Это особенно полезно в SSR-приложениях, где клиенту передаётся уже подготовленный минимальный набор данных.
Каждый форматтер Globalize (number, date, currency) требует своих зависимостей. Если используются только числа, подключение дат и валют становится избыточным.
Пример:
import "globalize/dist/globalize/number";
Если добавить date, размер увеличится за счёт правил
календарей и временных зон.
Минификация достигается строгим разделением:
number — только числовые форматы;date — только форматирование дат;currency — только валютные представления.Разные версии CLDR имеют различный объём данных. Обновления часто добавляют новые локали и расширяют правила. Это влияет на размер итогового бандла.
При оптимизации важно:
Сокращение данных напрямую влияет на:
Особенно критично это для мобильных устройств, где парсинг больших JSON-структур становится узким местом.
Для управления CLDR часто используется дополнительная конфигурация сборщиков:
IgnorePlugin;Пример ограничения локалей:
new webpack.IgnorePlugin({
resourceRegExp: /^cldr-data\/main\/(?!ru|en)/
});
Это гарантирует, что в сборку попадут только нужные языки.
Globalize можно разделить на два слоя:
Минификация достигается за счёт независимой поставки data-слоя. Runtime остаётся стабильным, а данные могут обновляться или подгружаться отдельно.
Минимизированная конфигурация Globalize обычно включает:
Такая модель позволяет снизить размер локализационного слоя с мегабайтов до десятков килобайт без потери функциональности.