Day.js использует систему плагинов, в которой порядок подключения
напрямую влияет на доступность методов, поведение экземпляров и
корректность работы расширений. Базовое ядро библиотеки изначально
минималистично и не включает большую часть функциональности — она
добавляется через последовательное расширение прототипа Day.js с помощью
extend().
Подключение плагина в Day.js выполняется через вызов:
import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
dayjs.extend(utc)
Каждый вызов extend() модифицирует глобальный экземпляр
Day.js, добавляя новые методы или изменяя поведение существующих. Это
означает, что порядок вызова extend() становится частью
архитектуры приложения, а не просто формальностью.
Плагин не изолирован: он встраивается в общий прототип и может зависеть от других уже подключённых расширений.
Плагины должны подключаться в порядке зависимости: сначала низкоуровневые расширения, затем надстройки, которые используют их функциональность.
Типичная последовательность выглядит так:
Нарушение этой последовательности приводит к частичной или полной неработоспособности функций.
Некоторые плагины в Day.js предполагают наличие других расширений.
Плагин UTC часто используется как фундамент:
import utc from 'dayjs/plugin/utc'
dayjs.extend(utc)
Он создаёт основу для корректной работы временных зон. Плагины, работающие с часовыми поясами, ожидают наличие UTC-логики, и подключение их до UTC может привести к некорректным вычислениям.
Timezone-плагин должен подключаться после UTC:
import timezone from 'dayjs/plugin/timezone'
dayjs.extend(utc)
dayjs.extend(timezone)
Причина заключается в том, что timezone расширяет методы, добавленные UTC, а не заменяет их. Если поменять порядок, часть методов останется неинициализированной.
Плагин customParseFormat расширяет возможности разбора
строк:
import customParseFormat from 'dayjs/plugin/customParseFormat'
dayjs.extend(customParseFormat)
Он должен подключаться до использования любых нестандартных форматов дат. При наличии других плагинов, которые используют парсинг (например, относительное время), он должен быть подключён раньше них.
Плагин isBetween добавляет метод сравнения диапазонов
дат. Он не имеет строгих зависимостей, но логически должен подключаться
после базовых расширений времени:
import isBetween from 'dayjs/plugin/isBetween'
dayjs.extend(isBetween)
Если подключить его до расширений, изменяющих поведение дат (например, UTC), результат сравнения может отличаться от ожидаемого из-за различий в интерпретации временных зон.
Плагин relativeTime зависит от корректной работы
базового ядра и локализации:
import relativeTime from 'dayjs/plugin/relativeTime'
dayjs.extend(relativeTime)
Он использует внутренние механизмы форматирования, поэтому его следует подключать после плагинов, влияющих на представление дат и локали.
Локали в Day.js не являются плагинами в классическом смысле, но их подключение также влияет на результат работы расширений:
import 'dayjs/locale/ru'
dayjs.locale('ru')
Если локаль устанавливается до подключения relativeTime,
итоговые строки могут быть сформированы с дефолтной локалью, а не с
заданной.
Правильная последовательность:
Каждый плагин в 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() не создаёт изолированных
версийВ модульной архитектуре это особенно важно: импорт одного модуля может изменить поведение даты в другом, если порядок загрузки отличается.