Day.js распространяется как модульная библиотека, поддерживающая
CommonJS, ESM и подключение через CDN. В основе лежит функция
dayjs(), которая создаёт и возвращает неизменяемые объекты
даты. Библиотека спроектирована так, чтобы минимизировать размер бандла
за счёт системы плагинов, подключаемых явно.
В большинстве современных проектов Day.js устанавливается через менеджер пакетов:
npm install dayjs
или
yarn add dayjs
После установки библиотека доступна в модульной системе проекта и может быть импортирована в зависимости от типа сборки.
В среде Node.js, использующей CommonJS, подключение осуществляется
через require:
const dayjs = require('dayjs');
const now = dayjs();
console.log(now.format());
Объект dayjs представляет собой фабричную функцию.
Каждый вызов возвращает новый экземпляр даты, не изменяющий исходные
данные.
В современных сборщиках и Node.js с поддержкой ES Modules
используется синтаксис import:
import dayjs from 'dayjs';
const date = dayjs('2026-01-01');
console.log(date.format('YYYY-MM-DD'));
ESM-импорт обеспечивает лучшую совместимость с tree-shaking, что особенно важно при использовании плагинов и уменьшении размера итогового бандла.
Для браузерных сценариев без сборщика применяется подключение через CDN:
<script src="https://unpkg.com/dayjs"></script>
<script>
const now = dayjs();
console.log(now.format());
</script>
После подключения библиотека доступна через глобальный объект
dayjs.
Базовая функциональность Day.js намеренно минимальна. Дополнительные возможности реализуются через плагины, которые подключаются вручную.
Плагин в Day.js — это функция, которая расширяет прототип библиотеки или добавляет новые методы. Подключение плагина выполняется через метод:
dayjs.extend(plugin);
Плагин должен быть зарегистрирован до его использования. После подключения он становится частью глобального состояния Day.js в рамках текущего окружения.
Плагины импортируются отдельно и подключаются к основной библиотеке:
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
const d = dayjs().utc();
console.log(d.format());
В CommonJS аналогичный процесс выглядит следующим образом:
const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc');
dayjs.extend(utc);
console.log(dayjs().utc().format());
Плагин не активируется автоматически. Даже если он установлен в
проекте, его функциональность недоступна без явного вызова
extend.
Метод extend модифицирует внутреннюю структуру Day.js,
добавляя новые методы или изменяя поведение экземпляров. После
регистрации плагина все создаваемые объекты начинают поддерживать
расширенный функционал.
Пример с добавлением поддержки временных зон:
import dayjs from 'dayjs';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(timezone);
const moscow = dayjs().tz('Europe/Moscow');
console.log(moscow.format());
Важно, что extend влияет на глобальный экземпляр Day.js
в рамках текущего модуля. Повторное подключение одного и того же плагина
не создаёт новых экземпляров, но может привести к непредсказуемому
поведению при неправильной организации импортов.
Некоторые плагины зависят друг от друга. В таких случаях порядок регистрации имеет значение. Например, расширения, работающие с UTC и временными зонами, часто требуют предварительного подключения базового функционала:
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(utc);
dayjs.extend(timezone);
Нарушение порядка может привести к отсутствию методов или ошибкам выполнения.
Day.js поддерживает одновременное использование нескольких расширений. Каждый плагин регистрируется отдельно:
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import advancedFormat from 'dayjs/plugin/advancedFormat';
import relativeTime from 'dayjs/plugin/relativeTime';
dayjs.extend(utc);
dayjs.extend(advancedFormat);
dayjs.extend(relativeTime);
console.log(dayjs().fromNow());
console.log(dayjs().format('Do MMMM YYYY'));
Плагины не конфликтуют между собой при корректной реализации, поскольку каждый расширяет отдельные части API.
При подключении через CDN плагины доступны как отдельные глобальные переменные. Каждый плагин добавляется вручную:
<script src="https://unpkg.com/dayjs"></script>
<script src="https://unpkg.com/dayjs/plugin/utc"></script>
<script>
dayjs.extend(dayjs_plugin_utc);
console.log(dayjs().utc().format());
</script>
Имена глобальных переменных формируются по шаблону
dayjs_plugin_<name>.
После вызова extend функциональность становится частью
экземпляров, создаваемых через dayjs(). Уже созданные
объекты также получают доступ к новым методам, поскольку Day.js
использует прототипное расширение.
import dayjs from 'dayjs';
import isLeapYear from 'dayjs/plugin/isLeapYear';
dayjs.extend(isLeapYear);
const date = dayjs('2024-01-01');
console.log(date.isLeapYear());
Плагины не могут быть удалены после регистрации. Day.js не предоставляет механизма отката расширений. Это означает, что порядок загрузки модулей становится критически важным при работе в сложных приложениях.
Повторный вызов extend с тем же плагином обычно
безопасен, но не является обязательной практикой и может увеличивать
накладные расходы при инициализации.
ESM-импорт плагинов позволяет сборщикам удалять неиспользуемый код.
Однако сам факт вызова extend фиксирует использование
функциональности, поэтому каждый подключённый плагин увеличивает
итоговый размер бандла.
import dayjs from 'dayjs';
import customParseFormat from 'dayjs/plugin/customParseFormat';
dayjs.extend(customParseFormat);
Если плагин не используется в коде, но импортирован и зарегистрирован, он всё равно попадёт в сборку.
Каждый плагин получает доступ к объекту Day.js и может:
Модель расширения основана на инъекции зависимостей, где ядро библиотеки остаётся неизменным, а функциональность добавляется внешними модулями.
Подключение UTC и временных зон:
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(utc);
dayjs.extend(timezone);
Поддержка относительного времени:
import relativeTime from 'dayjs/plugin/relativeTime';
dayjs.extend(relativeTime);
dayjs().fromNow();
Поддержка расширенного форматирования:
import advancedFormat from 'dayjs/plugin/advancedFormat';
dayjs.extend(advancedFormat);
dayjs().format('Q Do kkkk');
Регистрация плагина действует глобально в рамках импортированного экземпляра Day.js. При использовании нескольких модулей важно учитывать, что повторный импорт Day.js в разных частях приложения может привести к необходимости повторной регистрации расширений в каждом контексте.
Это особенно заметно в микрофронтендах и изолированных сборках, где каждый модуль может иметь собственный экземпляр библиотеки.
В тестовых средах или serverless-функциях Day.js может инициализироваться многократно. В таких условиях регистрация плагинов выполняется при каждом запуске среды исполнения, что делает порядок подключения критичным для воспроизводимости поведения.
Плагины должны подключаться до первого использования любых методов, зависящих от их функциональности, иначе возможны ошибки отсутствующих методов или некорректного парсинга дат.