Миграция с других библиотек

Переход с других библиотек выбора даты на Flatpickr обычно связан с отказом от тяжёлых зависимостей, упрощением DOM-структуры и унификацией поведения календаря в разных браузерах. Flatpickr работает как лёгкий, самодостаточный компонент без необходимости в jQuery, что радикально меняет подход к интеграции.

Ключевая особенность миграции заключается в том, что Flatpickr не навязывает сложную разметку и не требует внешних CSS-фреймворков. Вместо этого используется конфигурация через JavaScript, а все визуальные и поведенческие аспекты управляются через единый API.

Миграция с jQuery UI Datepicker

jQuery UI Datepicker использует тесную интеграцию с jQuery и изменяет DOM через цепочки вызовов. Flatpickr полностью отказывается от этой модели.

Замена инициализации

jQuery UI:

$("#date").datepicker({
  dateFormat: "yy-mm-dd"
});

Flatpickr:

flatpickr("#date", {
  dateFormat: "Y-m-d"
});

Различие проявляется не только в синтаксисе, но и в формате дат. Flatpickr использует собственные токены форматирования (Y, m, d вместо yy, mm, dd).

Поведение и события

jQuery UI опирается на событийную модель jQuery:

$("#date").on("change", function () {
  console.log(this.value);
});

Flatpickr предоставляет собственные хуки:

flatpickr("#date", {
  onChange: function(selectedDates, dateStr, instance) {
    console.log(dateStr);
  }
});

Ключевое отличие — события передаются через конфигурацию, а не через внешние обработчики DOM.

Работа с локализацией

jQuery UI требует подключения дополнительных файлов локализации и их ручного назначения:

$.datepicker.setDefaults($.datepicker.regional["ru"]);

Flatpickr использует модульную систему:

import { Russian } from "flatpickr/dist/l10n/ru.js";

flatpickr("#date", {
  locale: Russian
});

Миграция с Bootstrap Datepicker

Bootstrap Datepicker тесно связан с DOM-структурой Bootstrap и часто зависит от CSS-классов и HTML-разметки.

Упрощение структуры

Bootstrap Datepicker:

$("#date").datepicker({
  format: "yyyy-mm-dd",
  autoclose: true
});

Flatpickr:

flatpickr("#date", {
  dateFormat: "Y-m-d"
});

Параметр autoclose становится избыточным, так как Flatpickr закрывает календарь автоматически при выборе даты.

Управление стилями

Bootstrap Datepicker требует согласования с CSS Bootstrap. Flatpickr использует собственную систему стилей, что устраняет конфликты классов:

  • отсутствует зависимость от .form-control логики
  • не используется модификация Bootstrap DOM
  • календарь рендерится независимо от контейнера

Поведение диапазонов

Bootstrap Datepicker:

$("#start").datepicker();
$("#end").datepicker();

Flatpickr:

flatpickr("#range", {
  mode: "range"
});

Концепция разделения полей заменяется встроенным режимом диапазона.

Миграция с Pikaday

Pikaday ближе к Flatpickr по философии, но отличается архитектурой и API.

Инициализация

Pikaday:

new Pikaday({
  field: document.getElementById("date"),
  format: "YYYY-MM-DD"
});

Flatpickr:

flatpickr("#date", {
  dateFormat: "Y-m-d"
});

Основное отличие — отсутствие необходимости вручную передавать DOM-элемент.

Работа с Moment.js

Pikaday часто используется вместе с Moment.js для форматирования дат. Flatpickr не требует сторонних библиотек:

dateFormat: "Y-m-d H:i"

Это снижает сложность сборки и уменьшает размер бандла.

Управление состоянием

Pikaday хранит экземпляр явно:

var picker = new Pikaday({...});
picker.setDate(new Date());

Flatpickr:

const instance = flatpickr("#date");
instance.setDate(new Date());

API остаётся похожим, но Flatpickr унифицирует методы управления через единый объект инстанса.

Миграция с нативного input[type=“date”]

Нативный input[type="date"] кажется самым простым решением, но имеет различия в браузерах и ограниченную кастомизацию.

Ограничения нативного поведения

  • различия в UI между браузерами
  • ограниченная локализация
  • невозможность расширенной кастомизации
  • нестабильное форматирование значения

Flatpickr заменяет нативное поведение полностью:

flatpickr("#date", {
  altInput: true,
  altFormat: "d.m.Y",
  dateFormat: "Y-m-d"
});

Альтернативное отображение

altInput создаёт дополнительное поле отображения, сохраняя машинный формат отдельно от пользовательского интерфейса.

Нативный input:

<input type="date">

Flatpickr:

flatpickr("#date", {
  altInput: true
});

Это позволяет отделить пользовательский формат от формата хранения.

Миграция логики диапазонов дат

Во многих библиотеках диапазоны реализуются через два поля. Flatpickr объединяет этот сценарий.

Два поля (legacy подход)

$("#start").datepicker();
$("#end").datepicker();

Ручная логика сравнения дат, проверки пересечений и синхронизации.

Flatpickr range mode

flatpickr("#range", {
  mode: "range",
  dateFormat: "Y-m-d"
});

Внутренняя логика:

  • автоматическое определение начала и конца диапазона
  • защита от некорректных значений
  • единое поле хранения значения

Миграция кастомных форматов дат

Разные библиотеки используют несовместимые токены форматов.

Библиотека Формат
jQuery UI yy-mm-dd
Moment.js YYYY-MM-DD
Flatpickr Y-m-d

Пример преобразования:

jQuery UI:

dateFormat: "yy-mm-dd"

Flatpickr:

dateFormat: "Y-m-d"

При миграции требуется полное переписывание форматов, так как токены не совместимы.

Миграция событийной модели

События в старых библиотеках часто завязаны на DOM:

$("#date").on("change", handler);

Flatpickr использует жизненный цикл инстанса:

flatpickr("#date", {
  onOpen: () => {},
  onClose: () => {},
  onChange: (selectedDates, dateStr) => {}
});

Разница проявляется в следующем:

  • события привязаны к конфигурации, а не DOM
  • передаются структурированные данные (Date[], строка, инстанс)
  • отсутствует необходимость парсинга значения вручную

Миграция динамического обновления конфигурации

В старых библиотеках изменение настроек часто требует пересоздания компонента.

jQuery UI:

$("#date").datepicker("option", "minDate", new Date());

Flatpickr:

instance.set("minDate", new Date());

Или:

instance.setDate(new Date());

Конфигурация становится изменяемой на лету без реинициализации.

Миграция ограничения дат

Во многих библиотеках логика ограничений разрознена.

jQuery UI

minDate: 0,
maxDate: "+1M"

Flatpickr

minDate: "today",
maxDate: new Date().fp_incr(30)

Дополнительно поддерживаются:

  • относительные даты
  • функции вычисления
  • динамическое обновление диапазона

Миграция кастомного рендера

Некоторые библиотеки используют шаблоны или callback-рендеринг.

Flatpickr поддерживает минимальную кастомизацию через hooks:

flatpickr("#date", {
  onDayCreate: function(dObj, dStr, fp, dayElem) {
    if (dayElem.dateObj.getDay() === 0) {
      dayElem.classList.add("sunday");
    }
  }
});

В отличие от тяжёлых шаблонизаторов, здесь используется прямое управление DOM-элементами дня.

Миграция мультиязычных приложений

Старые библиотеки требуют глобальной настройки локалей.

Flatpickr использует явное подключение:

import { Russian } from "flatpickr/dist/l10n/ru.js";

flatpickr("#date", {
  locale: Russian
});

В приложениях с динамической сменой языка:

instance.set("locale", French);

Миграция производительности и архитектуры

Flatpickr отличается отсутствием:

  • jQuery-обёрток
  • глобальных namespace конфликтов
  • тяжёлых CSS-фреймворков
  • избыточного DOM-дерева

Это влияет на миграцию крупных приложений:

  • уменьшается время инициализации
  • упрощается сборка
  • снижается вероятность конфликтов зависимостей

Миграция пользовательских форматов ввода

Старые библиотеки часто позволяют ввод вручную без строгой валидации.

Flatpickr вводит строгую синхронизацию:

flatpickr("#date", {
  allowInput: true,
  dateFormat: "Y-m-d"
});

При этом выполняется автоматический парсинг и нормализация значения, что снижает количество ошибок ввода в формах.