Одним из ключевых направлений развития Flatpickr стало постепенное изменение подхода к инициализации и управлению экземпляром календаря. Ранние версии библиотеки допускали более «свободную» интеграцию через глобальный объект, тогда как современные подходы ориентированы на модульность и явное создание экземпляра.
В старых интеграциях использовался прямой вызов через глобальный namespace:
flatpickr("#input", {});
Позднее акцент сместился в сторону более явного управления экземпляром:
const instance = flatpickr("#input", {
enableTime: true
});
При этом важно учитывать, что возврат экземпляра стал критически важным элементом API. Ранее многие разработчики игнорировали его, но с ростом сложности приложений это привело к проблемам при повторной инициализации и управлении жизненным циклом.
Изменения коснулись и поведения повторного вызова flatpickr на одном и том же DOM-элементе. В новых версиях библиотека стала более строго обрабатывать повторную инициализацию, предотвращая наложение нескольких инстансов.
Одним из наиболее значимых breaking changes стал переход к модульной архитектуре и поддержке современных сборщиков (Webpack, Vite, Rollup).
Ранее Flatpickr часто подключался как единый UMD-бандл:
<script src="flatpickr.js"></script>
Современный подход предполагает ES-модули:
import flatpickr from "flatpickr";
import "flatpickr/dist/flatpickr.css";
Это изменение повлияло на:
Особенно критичным стало разделение локалей:
import { Russian } from "flatpickr/dist/l10n/ru.js";
flatpickr("#input", {
locale: Russian
});
Ранее локализация могла подключаться глобально, что приводило к неявным зависимостям.
Flatpickr исторически стремился оставаться независимым от внешних библиотек дат. Однако внутренние изменения логики обработки дат приводили к breaking changes в следующих областях:
Ранее библиотека более «прощала» некорректные входные строки. Например:
В новых версиях логика стала более строгой:
dateFormat;Invalid Date;Date.parse.Форматирование стало более детерминированным. Некоторые старые паттерны интерпретации были пересмотрены:
Y, m,
d;Пример:
flatpickr("#input", {
dateFormat: "Y-m-d"
});
Ранее некоторые вариации вроде y-m-d могли вести к
неоднозначным результатам.
Существенные breaking changes затронули event hooks. Основная проблема старых версий заключалась в нестабильности аргументов и их порядка.
Ранее обработчик мог получать разные наборы аргументов в зависимости от режима:
onChange: function(selectedDates, dateStr, instance) {}
В более новых версиях поведение стабилизировано, но важно учитывать:
selectedDates всегда массив;dateStr всегда соответствует
dateFormat;instance всегда является последним аргументом.Изменение, которое часто ломает старый код, связано с тем, что разработчики ранее полагались на неявные дополнительные параметры.
Ранее некоторые версии могли передавать контекст через
this, что считалось устаревшей практикой. Современная
реализация полностью исключает зависимость от this, делая
API функционально-ориентированным.
onOpen: (selectedDates, dateStr, instance) => {
instance.calendarContainer.classList.add("opened");
}
Механизм altInput претерпел несколько несовместимых
изменений, связанных с синхронизацией основного и альтернативного
input.
altInput и исходным
input;flatpickr("#input", {
altInput: true,
altFormat: "F j, Y"
});
Критическое изменение: прямое изменение altInput.value
перестало считаться валидным способом обновления состояния.
Flatpickr поддерживает плагины, однако их модель подключения претерпела значительные изменения.
Плагины могли подключаться как побочные эффекты:
flatpickr("#input", {
plugins: [somePlugin()]
});
Иногда плагины модифицировали внутренние структуры напрямую, что приводило к хрупкости системы.
Плагины стали более изолированными:
Это привело к несовместимости со старыми кастомными плагинами, которые использовали приватные свойства экземпляра.
Одной из частых причин багов стало некорректное уничтожение экземпляров.
instance.destroy();
Однако это привело к breaking change: код, который полагался на сохранение модифицированного DOM после destroy, перестал работать.
Локализация стала строго модульной и явной.
flatpickr.localize(flatpickr.l10ns.ru);
или подключение через глобальный объект.
import { Russian } from "flatpickr/dist/l10n/ru.js";
flatpickr("#input", {
locale: Russian
});
Breaking change заключается в отказе от глобального состояния локали. Это повлияло на:
Логика ограничений дат была уточнена.
flatpickr("#input", {
minDate: "2026-01-01",
maxDate: "2026-12-31"
});
Flatpickr исторически отключал собственный UI на мобильных устройствах, отдавая управление нативным input.
Breaking changes затронули:
disableMobile;disableMobile: true|false;Ранее разработчики могли переопределять внутренние методы форматирования:
formatDateparseDateВ новых версиях:
Breaking change: прямое переопределение функций перестало гарантировать корректную работу всех режимов (особенно time + range + multiple).
Добавление TypeScript-типов привело к уточнению контрактов API:
Date[] вместо гибких массивов;Это сломало часть старых проектов, где использовались кастомные опции без типового расширения.
Режимы выбора дат получили более строгую логику.
Ранее:
Сейчас:
Breaking changes затронули и DOM-структуру:
Пример влияния:
.flatpickr-calendar.open могли
перестать работать;Обновления привели к:
Breaking change: кастомные модификации DOM могли нарушать фокус-менеджмент, так как теперь он строго контролируется библиотекой.