Библиотека Pikaday спроектирована как лёгкий date picker без жёстких внешних зависимостей, что позволяет использовать её в разных окружениях: от простых HTML-страниц до современных сборщиков модулей.
Ключевая идея архитектуры заключается в следующем:
Date;Такой подход делает Pikaday предсказуемым и минималистичным с точки зрения runtime-зависимостей.
В базовой конфигурации Pikaday не требует установки дополнительных пакетов. Это означает:
moment.js;Работа полностью основана на:
Date;Минимальная конфигурация может выглядеть так:
import Pikaday from 'pikaday';
const picker = new Pikaday({
field: document.getElementById('date-input')
});
В этом режиме все операции форматирования и парсинга дат выполняются через стандартные средства JavaScript.
Поддержка moment.js реализована как опциональный
слой совместимости, предназначенный для проектов, где уже
используется moment или требуется его функциональность.
Основные сценарии использования:
Pikaday не включает moment.js внутрь своего пакета. Это
критический момент: библиотека не тащит moment как транзитивную
зависимость.
Pikaday поддерживает два способа интеграции с moment:
Если moment доступен в глобальной области видимости
(window.moment), Pikaday автоматически использует его:
window.moment = moment;
const picker = new Pikaday({
field: document.getElementById('date-input'),
format: 'DD.MM.YYYY'
});
В этом случае:
moment.format;moment.parse.Более предсказуемый вариант — передача зависимости напрямую:
import moment from 'moment';
import Pikaday from 'pikaday';
const picker = new Pikaday({
field: document.getElementById('date-input'),
moment: moment
});
Такой подход:
Когда moment подключён, Pikaday может делегировать ему форматирование строки даты.
Основной параметр:
format: 'YYYY-MM-DD'
При наличии moment логика выглядит так:
Date;moment(date).format(format);Пример поведения:
const picker = new Pikaday({
field: input,
format: 'DD MMMM YYYY',
moment: moment
});
Результат в поле ввода:
15 January 2026
Одной из сложных задач date picker является преобразование строки в дату.
Без moment Pikaday использует:
Date.parseС moment логика становится значительно богаче:
moment('15-01-2026', 'DD-MM-YYYY')
Если парсинг успешен:
Date через
.toDate();Если нет:
Pikaday поддерживает несколько способов подключения:
import Pikaday from 'pikaday';
import moment from 'moment';
const Pikaday = require('pikaday');
const moment = require('moment');
<script src="pikaday.js"></script>
<script src="moment.js"></script>
В каждом случае интеграция с moment зависит от способа экспорта:
window.moment;Одним из ключевых архитектурных решений Pikaday является отсутствие принудительной зависимости от moment.js, поскольку:
При подключении moment:
В современных проектах это часто приводит к замене moment на более лёгкие аналоги, однако Pikaday сохраняет обратную совместимость.
Если moment не подключён:
Date.Пример:
const picker = new Pikaday({
field: input,
format: 'YYYY-MM-DD'
});
Особенности:
Date в конкретной среде.Moment использует собственную систему токенов, но Pikaday частично её повторяет. Возможны различия:
Pikaday работает исключительно в рамках локального времени
Date. Moment может использовать:
Это приводит к различиям при:
Во многих современных проектах moment считается устаревшим инструментом. Pikaday не зависит от него напрямую, поэтому миграция возможна без изменения core-логики.
Типовые сценарии:
Intl.DateTimeFormat;При этом Pikaday продолжает работать без изменений, поскольку:
Date;Pikaday допускает подмену moment-объекта на совместимый интерфейс. Это означает, что можно передать объект с методами:
formatparsetoDateПример упрощённого аналога:
const fakeMoment = (date) => ({
format: (fmt) => date.toISOString(),
toDate: () => date
});
Использование:
new Pikaday({
field: input,
moment: fakeMoment
});
Такой подход применяется:
Архитектура зависимостей Pikaday строится на трёх уровнях:
Date;moment.js;Эта модель обеспечивает предсказуемость поведения при любом варианте подключения и позволяет использовать библиотеку как в минимальных, так и в тяжёлых enterprise-окружениях без изменения ядра.