Полифиллы

Библиотека Luxon построена вокруг нативных возможностей JavaScript-окружения и опирается не только на объект Date, но и на международные API, предоставляемые средой выполнения. В отличие от библиотек, которые полностью абстрагируют работу со временем и включают собственные реализации, Luxon использует системные механизмы форматирования, локализации и работы с часовыми поясами.

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


Зависимость от Intl и последствия для окружений

Luxon использует следующие компоненты стандарта Intl:

  • Intl.DateTimeFormat
  • Intl.NumberFormat
  • Intl.RelativeTimeFormat
  • Intl.Locale
  • частично Intl.PluralRules

Критические точки зависимости

Если окружение не поддерживает один или несколько компонентов Intl, возникают следующие ограничения:

  • невозможность форматирования дат в локализованном виде;
  • отсутствие поддержки относительного времени (например, «3 дня назад»);
  • деградация функциональности локалей;
  • некорректная работа методов toLocaleString, toRelative, toFormat.

Luxon не реализует альтернативную систему локализации, поэтому отсутствие Intl приводит к неполной функциональности.


Поддержка старых браузеров

В устаревших браузерах основная проблема заключается в частичной или полностью отсутствующей реализации Intl. Особенно это касается:

  • старых версий Safari;
  • Internet Explorer;
  • ранних мобильных браузеров Android;
  • некоторых встроенных webview-окружений.

Типичные ограничения

В таких средах могут отсутствовать:

  • Intl.RelativeTimeFormat (наиболее часто);
  • корректная поддержка локалей вне английского языка;
  • полноценные наборы данных ICU.

В результате Luxon либо снижает функциональность, либо возвращает форматирование в базовом виде без локализации.


Node.js и ICU: ключевой источник несовместимости

В Node.js ситуация зависит от того, как собрана среда выполнения.

Минимальная ICU-сборка

Некоторые сборки Node включают small-icu, где доступны только базовые локали (часто только en).

Последствия:

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

Full ICU

Полная сборка Node включает полноценные данные ICU, обеспечивая:

  • корректную работу всех локалей;
  • поддержку Intl.RelativeTimeFormat;
  • стабильное форматирование дат и времени.

Luxon в таких условиях функционирует без дополнительных полифиллов.


Полифилл Intl.DateTimeFormat

Основной источник несовместимости в браузерах — отсутствие или неполная реализация Intl.DateTimeFormat.

Для компенсации применяются полифиллы:

  • @formatjs/intl-datetimeformat
  • intl (устаревший пакет, но иногда используемый в legacy-проектах)

Принцип работы полифилла

Полифилл подменяет глобальный объект:

import '@formatjs/intl-datetimeformat/polyfill';
import '@formatjs/intl-datetimeformat/add-all-tz';

После подключения Luxon получает доступ к полноценному API форматирования.

Особенности подключения

  • требуется подключение до инициализации приложения;
  • важно учитывать размер бандла;
  • часто необходимо включение данных локалей отдельно.

Полифилл RelativeTimeFormat

Intl.RelativeTimeFormat используется Luxon для формирования выражений типа:

  • «5 минут назад»
  • «через 2 часа»

В старых окружениях этот API отсутствует полностью.

Подключение

Используется пакет:

  • @formatjs/intl-relativetimeformat
import '@formatjs/intl-relativetimeformat/polyfill';

При необходимости добавляются локали:

import '@formatjs/intl-relativetimeformat/locale-data/ru';

Поведение без полифилла

При отсутствии реализации Luxon:

  • либо не предоставляет относительное форматирование;
  • либо возвращает базовую строку без локализации.

Поддержка временных зон и ICU данные

Luxon не содержит собственной базы временных зон и использует:

  • встроенные данные окружения (ICU);
  • системные механизмы Intl.DateTimeFormat с таймзонами.

Проблема неполных ICU данных

В минимальных сборках:

  • отсутствует поддержка IANA time zone database;
  • некорректно работают зоны вне UTC/GMT;
  • возможны ошибки при преобразованиях между зонами.

Решение

Использование полного ICU или подключение полных данных через сборки Node решает проблему без необходимости внешних полифиллов.


Политика Luxon в отношении полифиллов

Luxon сознательно не включает полифиллы в свою поставку.

Причины:

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

Таким образом, ответственность за совместимость ложится на проект.


Полифиллы и сборщики модулей

При использовании Webpack, Vite или Rollup полифиллы подключаются на этапе входного файла приложения.

Типичная схема подключения

import '@formatjs/intl-datetimeformat/polyfill';
import '@formatjs/intl-relativetimeformat/polyfill';

import { DateTime } from 'luxon';

Важно, чтобы:

  • полифиллы загружались первыми;
  • не происходило ленивой загрузки после использования Luxon;
  • отсутствовали дубли глобальных определений.

Tree-shaking и побочные эффекты полифиллов

Полифиллы Intl обычно:

  • имеют side effects;
  • не поддаются tree-shaking;
  • увеличивают итоговый бандл.

При сборке важно учитывать:

  • необходимость явного включения;
  • невозможность частичного импорта без побочных эффектов.

Ошибки при отсутствии полифиллов

Ошибка форматирования дат

Проявляется как:

  • падение функций toLocaleString;
  • исключения при вызове форматтеров;
  • некорректные строки вывода.

Ошибка RelativeTimeFormat

Типичное поведение:

  • отсутствует метод;
  • Luxon переключается на fallback;
  • локализация теряется.

Ошибка локалей

При неполных ICU данных:

  • язык может игнорироваться;
  • возвращается английский по умолчанию;
  • формат времени становится упрощённым.

Практика определения необходимости полифиллов

Оценка необходимости опирается на три фактора:

  • целевая аудитория браузеров;
  • наличие Node full ICU;
  • требования к локализации.

Типовые сценарии

Современные браузеры + современный Node

  • полифиллы не требуются;
  • Luxon работает нативно.

Старые браузеры

  • требуется минимум Intl.DateTimeFormat;
  • часто добавляется RelativeTimeFormat.

Контролируемые корпоративные среды

  • часто требуется полный набор ICU;
  • полифиллы подключаются явно для стабильности.

Влияние полифиллов на архитектуру приложения

Использование полифиллов для Luxon влияет на:

  • размер начального бандла;
  • порядок загрузки модулей;
  • стратегию код-сплиттинга;
  • совместимость с SSR.

В SSR-окружениях дополнительно учитывается:

  • наличие ICU в серверной среде;
  • синхронизация локалей между сервером и клиентом;
  • отсутствие различий в форматировании при гидрации.

Совместимость Luxon и экосистемы Intl

Luxon не дублирует функциональность Intl, а интегрируется с ней. Это делает библиотеку:

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

Поддержка корректной работы достигается не внутри библиотеки, а на уровне окружения, где ключевую роль играет наличие и корректность реализации Intl API.