Совместимость API

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

Взаимодействие с Date

Luxon обеспечивает двунаправленную конвертацию:

  • DateTime.fromJSDate(date) — создание экземпляра Luxon из нативного Date
  • dateTime.toJSDate() — преобразование обратно в Date

При этом сохраняется точность временной метки (epoch milliseconds), однако теряются специфические свойства Luxon, такие как таймзона и локаль, если они не были явно учтены.

Особенность архитектуры заключается в том, что Luxon не расширяет Date, а полностью его абстрагирует, что исключает конфликт прототипов и несовместимость с другими библиотеками.

Ограничения нативного Date

Нативный Date не поддерживает:

  • явное управление часовыми поясами
  • неизменяемость (immutable state)
  • строгий парсинг строк
  • локализацию форматов

Luxon компенсирует эти ограничения, но при обмене данными с Date необходимо учитывать потерю контекстной информации.


Совместимость с ECMAScript и стандартами Intl

Luxon активно использует Intl API, в частности:

  • Intl.DateTimeFormat
  • Intl.NumberFormat
  • Intl.RelativeTimeFormat (в некоторых сценариях)

Требования к окружению

Работа библиотеки зависит от наличия полноценной реализации Intl. Это влияет на:

  • Node.js версии (требуется современная ветка с актуальным ICU)
  • браузерные окружения с ограниченным ICU
  • серверные среды с минимальной сборкой ICU

Если Intl отсутствует или урезан, Luxon теряет часть возможностей форматирования, но базовые операции с датами продолжают работать.

ICU-данные

Критически важный аспект совместимости связан с ICU (International Components for Unicode). Luxon не включает ICU самостоятельно и полагается на среду выполнения.

В Node.js возможны три режима:

  • small-icu — ограниченные локали
  • full-icu — полная поддержка
  • system-icu — системная библиотека

От этого напрямую зависит корректность локализации и форматирования дат.


Модульная совместимость (ESM и CommonJS)

Luxon поддерживает оба основных формата модулей Jav * aScript:

ESM (ECMAScript Modules)

import { DateTime } from "luxon";

ESM является предпочтительным форматом в современных сборках, так как обеспечивает корректный tree-shaking и оптимизацию бандла.

CommonJS

const { DateTime } = require("luxon");

CommonJS используется в Node.js-окружениях и старых сборщиках. При этом возможны особенности:

  • менее эффективное tree-shaking
  • увеличение размера бандла при сборке фронтенда
  • более ранняя инициализация модуля

Гибридные окружения

Некоторые сборщики (Webpack, Vite, Rollup) корректно интерпретируют обе системы, но поведение может зависеть от конфигурации package.json (type: module).


Совместимость с временными зонами

Luxon опирается на Intl и базу IANA Time Zone Database.

Поддержка IANA

Форматы:

  • Europe/Berlin
  • Asia/Almaty
  • UTC

Работа с таймзонами реализована через DateTime.setZone() и DateTime.fromObject().

Ограничения среды

Корректность работы зависит от:

  • наличия актуальной базы временных зон в Node.js
  • поддержки системных таймзон в браузере
  • корректной конфигурации окружения в контейнерах (Docker, минимальные Linux-образы)

При отсутствии данных Luxon может откатываться к UTC или системной зоне.


Совместимость с Moment.js и миграционные различия

Luxon часто рассматривается как современная альтернатива Moment.js, однако API несовместимы напрямую.

Основные различия моделей

Сущность Moment.js Luxon
Изменяемость mutable immutable
Основной объект moment DateTime
Таймзоны plugin-based встроенные
Локализация частично встроенная через Intl

Проблемы миграции

Наиболее критичные несовместимости:

  • отсутствие мутабельных операций (add, subtract возвращают новый объект)
  • различие в форматировании строк
  • изменение модели парсинга дат
  • отказ от глобального состояния локали

Эквиваленты операций

  • moment().add(1, 'day')DateTime.now().plus({ days: 1 })
  • moment().format()DateTime.now().toFormat(...)
  • moment.parseZone()DateTime.fromISO(..., { setZone: true })

Совместимость с браузерами

Luxon ориентирован на современные браузеры.

Поддерживаемые среды

  • Chrome (современные версии)
  • Firefox (актуальные релизы)
  • Safari (последние версии)
  • Edge (Chromium-based)

Ограничения старых браузеров

Основные проблемы возникают из-за:

  • отсутствия Intl.RelativeTimeFormat
  • неполной реализации Intl.DateTimeFormat
  • ограниченного ICU

При отсутствии Intl библиотека теряет значительную часть функциональности форматирования, но вычислительные операции сохраняются.


Совместимость с Node.js

Luxon не требует специфических Node.js API, но зависит от качества ICU.

Ключевые аспекты:

  • Node.js 12+ — минимально допустимая база
  • Node.js 16+ — стабильная полная совместимость
  • Node.js 18+ — оптимальная среда

Особое внимание требуется при использовании:

  • минимальных Docker-образов (node:alpine)
  • серверлесс-сред (AWS Lambda, Cloud Functions)
  • кастомных сборок Node.js

Совместимость с TypeScript

Luxon написан с полной поддержкой TypeScript.

Особенности типизации

  • строгие типы для DateTime, Duration, Interval
  • вывод типов для методов chaining
  • типизация форматов строк через string

Пример корректной типизации:

import { DateTime } from "luxon";

const dt: DateTime = DateTime.now().setZone("UTC");

Ограничения

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

Совместимость с JSON и сериализацией

Luxon не предоставляет встроенную автоматическую сериализацию в JSON, но поддерживает явные методы преобразования.

Основные подходы:

  • toISO() — стандартный ISO-формат
  • toMillis() — числовое представление
  • toObject() — структурированный объект

Обратное восстановление:

  • DateTime.fromISO()
  • DateTime.fromMillis()

Особенность

Объекты Luxon не сериализуются автоматически, что предотвращает неоднозначность при передаче данных между системами.


Совместимость с другими библиотеками дат

Luxon может сосуществовать с:

  • date-fns
  • dayjs
  • moment (в legacy-проектах)

Конфликты интеграции

Основные проблемы возникают при:

  • смешивании типов (DateTime vs Date)
  • двойном управлении таймзоной
  • разной модели мутабельности

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


Обратная совместимость версий Luxon

API Luxon придерживается семантического версионирования.

Принципы стабильности:

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

Потенциальные зоны изменений:

  • форматирование локалей
  • поведение парсинга строк
  • работа с ICU и временными зонами
  • расширение API DateTime

Совместимость с бандлерами и сборщиками

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

Поддерживаемые системы:

  • Webpack
  • Vite
  • Rollup
  • esbuild
  • Parcel

Tree-shaking

При использовании ESM:

  • удаляются неиспользуемые части API
  • уменьшается размер бандла
  • ускоряется загрузка

При CommonJS tree-shaking ограничен из-за динамической природы require.

Side effects

Luxon не имеет побочных эффектов при импорте, что улучшает совместимость с оптимизаторами.


Совместимость с окружениями без браузера

Luxon может работать в:

  • Node.js
  • Deno
  • Bun

Особенности:

  • Deno: требуется корректный ESM импорт
  • Bun: высокая совместимость, но возможны различия в Intl
  • серверные среды: критична конфигурация ICU и TZ

Совместимость с локалями и форматами

Luxon использует BCP 47 языковые теги:

  • en-US
  • ru-RU
  • kk-KZ

Ограничения:

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

Совместимость с часовыми переходами (DST)

Luxon учитывает переходы на летнее/зимнее время при наличии корректной IANA базы.

Возможные расхождения:

  • устаревшие timezone-данные
  • кастомные системные настройки
  • контейнерные окружения без обновлений tzdata

При некорректной базе возможны смещения времени и неоднозначность локальных дат.