Порядок загрузки плагинов

Day.js использует систему плагинов, в которой порядок подключения напрямую влияет на доступность методов, поведение экземпляров и корректность работы расширений. Базовое ядро библиотеки изначально минималистично и не включает большую часть функциональности — она добавляется через последовательное расширение прототипа Day.js с помощью extend().

Подключение плагина в Day.js выполняется через вызов:

import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'

dayjs.extend(utc)

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

Плагин не изолирован: он встраивается в общий прототип и может зависеть от других уже подключённых расширений.

Базовый принцип порядка загрузки

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

Типичная последовательность выглядит так:

  1. Плагины базовой инфраструктуры (UTC, timezone)
  2. Парсинг и форматирование (customParseFormat)
  3. Математика дат (duration)
  4. Сравнение и логика (isBetween, isSameOrBefore)
  5. Производные утилиты (relativeTime)

Нарушение этой последовательности приводит к частичной или полной неработоспособности функций.

Зависимости между плагинами

Некоторые плагины в Day.js предполагают наличие других расширений.

UTC как базовый слой

Плагин UTC часто используется как фундамент:

import utc from 'dayjs/plugin/utc'
dayjs.extend(utc)

Он создаёт основу для корректной работы временных зон. Плагины, работающие с часовыми поясами, ожидают наличие UTC-логики, и подключение их до UTC может привести к некорректным вычислениям.

Timezone и его зависимость от UTC

Timezone-плагин должен подключаться после UTC:

import timezone from 'dayjs/plugin/timezone'

dayjs.extend(utc)
dayjs.extend(timezone)

Причина заключается в том, что timezone расширяет методы, добавленные UTC, а не заменяет их. Если поменять порядок, часть методов останется неинициализированной.

Плагины форматирования и парсинга

Custom Parse Format

Плагин customParseFormat расширяет возможности разбора строк:

import customParseFormat from 'dayjs/plugin/customParseFormat'

dayjs.extend(customParseFormat)

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

Плагины логики и сравнения

IsBetween и зависимые расширения

Плагин isBetween добавляет метод сравнения диапазонов дат. Он не имеет строгих зависимостей, но логически должен подключаться после базовых расширений времени:

import isBetween from 'dayjs/plugin/isBetween'

dayjs.extend(isBetween)

Если подключить его до расширений, изменяющих поведение дат (например, UTC), результат сравнения может отличаться от ожидаемого из-за различий в интерпретации временных зон.

Плагины относительного времени

RelativeTime как надстройка

Плагин relativeTime зависит от корректной работы базового ядра и локализации:

import relativeTime from 'dayjs/plugin/relativeTime'

dayjs.extend(relativeTime)

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

Локализация и её влияние на порядок

Локали в Day.js не являются плагинами в классическом смысле, но их подключение также влияет на результат работы расширений:

import 'dayjs/locale/ru'

dayjs.locale('ru')

Если локаль устанавливается до подключения relativeTime, итоговые строки могут быть сформированы с дефолтной локалью, а не с заданной.

Правильная последовательность:

  1. Подключение плагинов
  2. Подключение локалей
  3. Установка активной локали

Каскадное расширение прототипа

Каждый плагин в Day.js модифицирует единый объект dayjs. Это создаёт каскадный эффект:

  • первый плагин расширяет ядро
  • второй плагин может использовать методы первого
  • третий плагин получает уже расширенный интерфейс

Порядок становится частью API, а не просто этапом инициализации.

Ошибки, возникающие при неправильном порядке

Нарушение порядка подключения приводит к типичным проблемам:

Отсутствие методов

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

TypeError: dayjs(...).utc is not a function

Некорректные вычисления времени

При подключении timezone до UTC возможны смещения времени и неверная интерпретация дат.

Потеря локализации

Если relativeTime подключён до установки локали, текстовые представления времени могут остаться на английском языке.

Рекомендованный шаблон инициализации

Часто используемая последовательность подключения:

import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'
import customParseFormat from 'dayjs/plugin/customParseFormat'
import relativeTime from 'dayjs/plugin/relativeTime'
import isBetween from 'dayjs/plugin/isBetween'

dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(customParseFormat)
dayjs.extend(isBetween)
dayjs.extend(relativeTime)

Такой порядок обеспечивает предсказуемое поведение и минимизирует скрытые зависимости между расширениями.

Особенности глобального состояния

Все плагины применяются глобально к единому экземпляру Day.js. Это означает:

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

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