Переход между версиями Pikaday чаще всего затрагивает инициализацию календаря, работу с датами, подключение зависимостей и поведение некоторых опций по умолчанию. На практике миграция сводится не только к замене версии пакета, но и к пересмотру логики взаимодействия с датами, форматированием и событиями.
Ключевой проблемой при обновлении становится не сам API, а его поведение в деталях: обработка null-значений, различия в парсинге строк дат, изменения в интеграции с Moment.js и способы подключения библиотеки в современных сборщиках.
Ранние версии Pikaday ориентировались на глобальный объект и
подключение через <script>:
<script src="pikaday.js"></script>
Инициализация выглядела следующим образом:
var picker = new Pikaday({
field: document.getElementById('date')
});
В современных версиях, ориентированных на bundler’ы, предпочтительным становится импорт:
import Pikaday from 'pikaday';
const picker = new Pikaday({
field: document.getElementById('date')
});
При миграции важно учитывать:
В старых проектах CSS часто подключался вручную:
<link rel="stylesheet" href="pikaday.css">
В современных сборках стили необходимо импортировать явно:
import 'pikaday/css/pikaday.css';
или из альтернативного пути в зависимости от сборщика.
При миграции важно проверить:
.pika-*Изменения структуры DOM календаря в разных версиях могут приводить к тому, что кастомные стили перестают работать корректно, особенно если они были завязаны на вложенность элементов.
Ранние версии Pikaday допускали передачу строковых значений:
new Pikaday({
field: input,
defaultDate: '2020-01-01',
setDefaultDate: true
});
В новых версиях поведение стало более строгим: предпочтение отдается
объекту Date.
Корректный вариант:
new Pikaday({
field: input,
defaultDate: new Date(2020, 0, 1),
setDefaultDate: true
});
Миграция требует пересмотра всех мест, где дата передавалась строкой без явного парсинга.
Ранее Pikaday мог использовать Moment.js для форматирования и парсинга:
new Pikaday({
field: input,
format: 'DD.MM.YYYY',
onSelect: function(date) {
console.log(this.getMoment().format('DD.MM.YYYY'));
}
});
В новых версиях Moment.js перестал быть обязательной зависимостью. Это означает:
getMoment() может отсутствоватьtoString() и parse()
стала предпочтительнойПример замены:
new Pikaday({
field: input,
toString: function(date) {
return date.toLocaleDateString('ru-RU');
},
parse: function(str) {
const [day, month, year] = str.split('.');
return new Date(year, month - 1, day);
}
});
Поведение этих параметров стало более предсказуемым:
defaultDate больше не применяется к input автоматически
без setDefaultDatesetDefaultDate теперь явно управляет синхронизацией
поляМиграционный паттерн:
Было:
new Pikaday({
field: input,
defaultDate: new Date(2020, 0, 1)
});
Стало:
new Pikaday({
field: input,
defaultDate: new Date(2020, 0, 1),
setDefaultDate: true
});
Опция format перестала быть универсальной точкой
контроля. В новых версиях рекомендуется использовать:
toString(date)parse(dateString)Это влияет на миграцию:
new Pikaday({
field: input,
toString: date => `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`,
parse: str => new Date(str)
});
В старых версиях поведение привязки к полю (bound: true)
иногда приводило к неконсистентному позиционированию.
В новых версиях:
getBoundingClientRectПри миграции стоит перепроверить:
Основные события:
onSelectonOpenonCloseonDrawОни остались, но поведение контекста this стало более
строго определенным.
Ранее:
onSelect: function() {
console.log(this.getDate());
}
Теперь рекомендуется явно использовать переданные значения:
onSelect: function(date) {
console.log(date);
}
Особенно важно учитывать, что:
this может не гарантировать доступ ко всем методамПоведение стало более предсказуемым:
picker.setDate(new Date(), true);
Второй параметр (trigger) теперь критичен для синхронизации событий.
При миграции важно проверить:
В новых версиях уничтожение экземпляра стало более «чистым»:
picker.destroy();
При миграции следует учитывать:
В старых версиях календарь иногда «прыгал» при скролле.
В новых версиях:
window.scrollОднако миграция может выявить:
Ранее:
const Pikaday = require('pikaday');
Теперь:
import Pikaday from 'pikaday';
В проектах с Webpack/Vite это влияет на:
Симптомы:
Причина:
Симптомы:
getMoment is not a functionПричина:
Симптомы:
Причина:
Симптомы:
Причина:
Некоторые опции продолжают работать, но считаются устаревшими:
format (частично устаревшая концепция)При сохранении старого поведения требуется явная эмуляция через
toString и parse, иначе логика календаря может
измениться незаметно.