Библиотека Luxon построена вокруг нативных возможностей
JavaScript-окружения и опирается не только на объект Date,
но и на международные API, предоставляемые средой выполнения. В отличие
от библиотек, которые полностью абстрагируют работу со временем и
включают собственные реализации, Luxon использует системные механизмы
форматирования, локализации и работы с часовыми поясами.
Ключевая особенность архитектуры заключается в зависимости от ECMAScript Internationalization API (Intl). Это означает, что корректность работы форматирования дат, относительного времени и локалей напрямую связана с наличием соответствующих реализаций в среде.
Luxon использует следующие компоненты стандарта
Intl:
Intl.DateTimeFormatIntl.NumberFormatIntl.RelativeTimeFormatIntl.LocaleIntl.PluralRulesЕсли окружение не поддерживает один или несколько компонентов
Intl, возникают следующие ограничения:
toLocaleString,
toRelative, toFormat.Luxon не реализует альтернативную систему локализации, поэтому
отсутствие Intl приводит к неполной функциональности.
В устаревших браузерах основная проблема заключается в частичной или
полностью отсутствующей реализации Intl. Особенно это
касается:
В таких средах могут отсутствовать:
Intl.RelativeTimeFormat (наиболее часто);В результате Luxon либо снижает функциональность, либо возвращает форматирование в базовом виде без локализации.
В Node.js ситуация зависит от того, как собрана среда выполнения.
Некоторые сборки Node включают small-icu, где
доступны только базовые локали (часто только en).
Последствия:
Полная сборка Node включает полноценные данные ICU, обеспечивая:
Intl.RelativeTimeFormat;Luxon в таких условиях функционирует без дополнительных полифиллов.
Основной источник несовместимости в браузерах — отсутствие или
неполная реализация Intl.DateTimeFormat.
Для компенсации применяются полифиллы:
@formatjs/intl-datetimeformatintl (устаревший пакет, но иногда используемый в
legacy-проектах)Полифилл подменяет глобальный объект:
import '@formatjs/intl-datetimeformat/polyfill';
import '@formatjs/intl-datetimeformat/add-all-tz';
После подключения Luxon получает доступ к полноценному API форматирования.
Intl.RelativeTimeFormat используется Luxon для
формирования выражений типа:
В старых окружениях этот API отсутствует полностью.
Используется пакет:
@formatjs/intl-relativetimeformatimport '@formatjs/intl-relativetimeformat/polyfill';
При необходимости добавляются локали:
import '@formatjs/intl-relativetimeformat/locale-data/ru';
При отсутствии реализации Luxon:
Luxon не содержит собственной базы временных зон и использует:
Intl.DateTimeFormat с
таймзонами.В минимальных сборках:
Использование полного ICU или подключение полных данных через сборки Node решает проблему без необходимости внешних полифиллов.
Luxon сознательно не включает полифиллы в свою поставку.
Причины:
Таким образом, ответственность за совместимость ложится на проект.
При использовании Webpack, Vite или Rollup полифиллы подключаются на этапе входного файла приложения.
import '@formatjs/intl-datetimeformat/polyfill';
import '@formatjs/intl-relativetimeformat/polyfill';
import { DateTime } from 'luxon';
Важно, чтобы:
Полифиллы Intl обычно:
При сборке важно учитывать:
Проявляется как:
toLocaleString;Типичное поведение:
При неполных ICU данных:
Оценка необходимости опирается на три фактора:
Современные браузеры + современный Node
Старые браузеры
Intl.DateTimeFormat;RelativeTimeFormat.Контролируемые корпоративные среды
Использование полифиллов для Luxon влияет на:
В SSR-окружениях дополнительно учитывается:
Luxon не дублирует функциональность Intl, а
интегрируется с ней. Это делает библиотеку:
Поддержка корректной работы достигается не внутри библиотеки, а на
уровне окружения, где ключевую роль играет наличие и корректность
реализации Intl API.