Библиотека Pikaday в процессе эволюции претерпела несколько критических изменений, которые затрагивают инициализацию, поведение календаря, работу с датами и интеграцию с внешними библиотеками. Основные breaking changes связаны с переходом от ранних версий, завязанных на Moment.js, к более гибкой архитектуре, а также с переработкой внутренних событий и конфигурационных опций.
Одним из ключевых архитектурных изменений стало постепенное отделение Pikaday от обязательной зависимости Moment.js. В ранних версиях Moment.js использовался как основной механизм форматирования и парсинга дат. Это приводило к тесной связке API календаря с объектами Moment, что ограничивало использование стандартного JavaScript Date.
В более поздних версиях:
Это изменение ломает обратную совместимость для кода, который
напрямую использует moment() в конфигурациях
toString или parse.
Пример несовместимого подхода:
new Pikaday({
toString(date) {
return moment(date).format('YYYY-MM-DD');
}
});
В новых версиях такой код требует либо явного подключения Moment.js, либо замены на нативные методы.
Актуальная замена:
new Pikaday({
toString(date) {
return date.toISOString().split('T')[0];
}
});
Ранние версии Pikaday допускали нестрогий парсинг строковых дат. Встроенный механизм пытался интерпретировать входные значения через Date.parse, что приводило к разному поведению в различных браузерах.
В breaking changes введены следующие ограничения:
parse больше не гарантирует
одинаковый результатЭто означает, что следующий код может вести себя непредсказуемо:
new Pikaday({
field: document.getElementById('input'),
defaultDate: '01-02-2024'
});
Корректный подход после изменений:
new Pikaday({
field: document.getElementById('input'),
parse(dateString) {
const [day, month, year] = dateString.split('-');
return new Date(year, month - 1, day);
}
});
Существенные изменения затронули систему событий календаря. В старых версиях использовались прямые колбэки без стандартизированного контекста вызова. Позднее структура событий была унифицирована.
Изменения:
onSelect теперь всегда получает объект
Date, а не строкуthis больше не гарантирован как экземпляр
PikadayРанее допустимый код:
new Pikaday({
onSelect(dateString) {
console.log(this.getDate(), dateString);
}
});
После изменений:
new Pikaday({
onSelect(date) {
console.log(date);
console.log(this?.getDate?.());
}
});
Особенно критично изменение поведения this, так как
старые реализации могли полагаться на него для доступа к методам
экземпляра.
Некоторые параметры конфигурации были удалены или заменены, что привело к поломке обратной совместимости.
Основные изменения:
bound — изменилось поведение привязки к
input-элементуcontainer — переработана логика рендеринга в DOMreposition — изменена стратегия позиционированияkeyboardInput — частично ограничена поддержка
кастомного вводаПример устаревшей конфигурации:
new Pikaday({
field: input,
bound: false,
container: document.getElementById('calendar-container')
});
В новых версиях требуется учитывать, что рендеринг календаря может игнорировать часть DOM-контейнеров, если не соблюдены условия инициализации.
Логика ограничения диапазона дат была переработана. Ранее допускались строки, числа timestamp и объекты Date без строгой нормализации.
После изменений:
Старый подход:
new Pikaday({
minDate: '2024-01-01',
maxDate: '2024-12-31'
});
Новый подход:
new Pikaday({
minDate: new Date(2024, 0, 1),
maxDate: new Date(2024, 11, 31)
});
Функция formatDate и связанные с ней механизмы были
переработаны. Ранее форматирование часто зависело от Moment.js, теперь
оно полностью делегировано пользовательскому коду.
Изменения:
YYYY-MM-DDtoStringПример старого поведения:
new Pikaday({
format: 'DD/MM/YYYY'
});
После изменений:
new Pikaday({
toString(date) {
return `${date.getDate()}/${date.getMonth() + 1}/${date.getFullYear()}`;
}
});
Внутренняя система построения DOM была изменена с императивного на более структурированный рендеринг. Это затронуло:
Ключевые последствия:
Пример старого селектора:
.pika-day {
background: #fff;
}
В новой структуре требуется учитывать возможные изменения вложенности и дополнительных классов состояния:
.pika-button.pika-day {
background: #fff;
}
Механизм выбора даты стал более строгим в отношении валидных значений:
Ранее повторный выбор мог триггерить onSelect, теперь
это поведение зависит от внутреннего состояния и настроек.
При использовании кастомных сборок или бандлинга через Webpack/Rollup появились ограничения:
Пример устаревшего импорта:
import Pikaday from 'pikaday/pikaday';
Актуальный вариант:
import Pikaday from 'pikaday';
Система локализации была переработана и стала более декларативной. Старые локали перестали поддерживать автоматическое наследование.
Изменения:
i18nПример старого подхода:
new Pikaday({
i18n: {
previousMonth: 'Prev',
nextMonth: 'Next'
}
});
После изменений требуется полный набор ключей:
new Pikaday({
i18n: {
previousMonth: 'Prev',
nextMonth: 'Next',
months: [...],
weekdays: [...],
weekdaysShort: [...]
}
});