Размер приложения

Размер приложения в экосистеме Globalize напрямую определяется тем, какие части функциональности подключаются и какие данные локализации включаются в сборку. Библиотека построена вокруг модульной архитектуры, где ядро отделено от наборов локализационных данных CLDR и специализированных форматов (числа, даты, валюты, сообщения). Такой подход позволяет контролировать итоговый вес, но требует понимания структуры зависимостей.

Globalize разделяет функциональность на несколько слоёв:

  • базовое ядро (core)
  • модули форматирования (number, date, currency, message)
  • слой CLDR-данных
  • вспомогательные утилиты

Каждый слой существует независимо и подключается только при необходимости. Это означает, что минимальная сборка может включать только числовое форматирование, а полноценная интернационализация — десятки мегабайт локализационных данных при неправильной конфигурации.

Ключевой принцип: размер приложения определяется не библиотекой, а выбранными локалями и типами данных.

CLDR как основной источник раздувания сборки

Centralized Unicode Locale Data Repository (CLDR) является основой Globalize. Он содержит:

  • правила форматирования чисел
  • локализованные шаблоны дат и времени
  • валютные форматы
  • правила плюрализации
  • символы и разделители

CLDR представлен в виде JSON-файлов, и именно они формируют основную массу итогового бандла.

Типичная ошибка — подключение всех доступных локалей:

  • десятки языков
  • полные наборы региональных вариантов
  • неиспользуемые категории данных

В таком случае даже минимальное приложение может увеличиться на сотни килобайт или мегабайты.

Разделение runtime и data слоя

Globalize строго отделяет код библиотеки от данных локализации.

Runtime слой:

  • функции форматирования
  • парсинг
  • управление локалями
  • API для сообщений

Data слой:

  • CLDR JSON
  • загрузка культурных правил
  • таблицы символов

Такое разделение позволяет:

  • использовать tree-shaking для runtime-кода
  • загружать локали динамически
  • уменьшать стартовый bundle

Однако эффективность зависит от сборщика и стратегии импорта.

Влияние ESM и tree-shaking

Современные сборщики (Webpack, Rollup, Vite) позволяют исключать неиспользуемые части Globalize при корректном ESM-импорте.

Пример влияния импорта:

  • импорт всей библиотеки → полный runtime
  • точечный импорт модулей → минимальный набор функций

Факторы, влияющие на tree-shaking:

  • использование ESM вместо CommonJS
  • отсутствие side effects в модулях
  • явное указание используемых функций

При неправильной конфигурации tree-shaking не работает, и в сборку попадает весь runtime слой, даже если используется одна функция форматирования чисел.

Локали и их ленивная загрузка

Наиболее эффективный способ управления размером — динамическая загрузка локалей.

Локали могут:

  • подключаться по требованию
  • загружаться асинхронно
  • кешироваться после первого использования

Подход позволяет разделить приложение на:

  • базовый бандл (core + UI)
  • локализационные чанки

Это особенно критично для приложений с поддержкой десятков языков.

Основной принцип: загружать только те локали, которые реально используются пользователем.

Разделение форматов как способ оптимизации

Globalize предоставляет независимые модули:

  • форматирование чисел
  • форматирование валют
  • форматирование дат
  • обработка сообщений

Подключение только одного типа функциональности существенно снижает размер.

Например:

  • только числа → минимальный набор CLDR
  • числа + валюты → средний набор
  • полный i18n стек → полный CLDR пакет

Каждый дополнительный модуль увеличивает потребление памяти и размер бандла за счёт дополнительных правил и данных.

Влияние сообщений и ICU-подобной логики

Модуль сообщений использует правила плюрализации, основанные на CLDR.

Это означает:

  • для каждого языка добавляются правила выбора форм
  • увеличивается объём локализационных данных
  • растёт сложность парсинга шаблонов

Сообщения с ICU-структурой могут значительно увеличить размер приложения, особенно при поддержке множества языков.

Минимизация CLDR при сборке

Снижение размера достигается за счёт:

  • выбора только необходимых локалей
  • удаления региональных дублей
  • исключения неиспользуемых категорий (например, calendar extensions)
  • предобработки CLDR перед сборкой

Часто применяется стратегия “locale whitelist”, где явно перечисляются поддерживаемые языки.

Пример логики:

  • en
  • ru
  • de
  • fr

Все остальные локали исключаются на этапе сборки.

Влияние сборщиков и конфигурации

Размер итогового приложения сильно зависит от инструментов сборки:

  • Webpack требует ручной настройки tree-shaking и alias
  • Rollup эффективнее удаляет неиспользуемые модули
  • Vite использует ESM и обеспечивает более агрессивную оптимизацию

Ошибки конфигурации приводят к включению:

  • всех локалей
  • всего CLDR
  • полного runtime

что полностью нивелирует преимущества модульности.

Динамическая стратегия загрузки как ключ к минимальному размеру

Оптимальная архитектура включает:

  • базовый Globalize runtime
  • загрузку CLDR по маршрутам
  • lazy-loading языковых пакетов
  • кэширование локалей в браузере

Приложение разделяется на логические блоки:

  • core bundle
  • locale bundles
  • feature bundles (currency/date/message)

Такой подход позволяет удерживать первоначальный размер минимальным, а расширение функциональности происходит по мере использования.

Баланс между функциональностью и размером

Увеличение функциональности Globalize всегда связано с ростом размера, поскольку интернационализация требует данных, а не только кода.

Основные источники роста:

  • количество поддерживаемых языков
  • использование ICU сообщений
  • подключение валютных и календарных форматов
  • полный CLDR dataset

Снижение размера достигается не удалением кода, а ограничением набора данных и точечным импортом модулей.