Обратная совместимость

Floating UI — библиотека для управления позиционированием всплывающих элементов в JavaScript. Одной из ключевых задач при её использовании является обеспечение обратной совместимости при обновлении версий и работе с различными браузерами. Floating UI строится модульно: ядро и плагины разделены, что позволяет выбирать только необходимые части и снижать риск конфликтов при обновлениях.

Основные принципы обратной совместимости:

  1. Сохранение API Floating UI придерживается стабильного API для основных функций позиционирования (computePosition, flip, shift, offset). Обновления библиотеки стараются не нарушать сигнатуры функций, чтобы существующий код не требовал изменений. При добавлении новых параметров рекомендуется использовать опциональные свойства конфигурации, которые не влияют на старое поведение.

  2. Модульность и замена плагинов Каждый плагин Floating UI (например, flip, shift, arrow) можно подключать отдельно. Если плагин изменяется, стараются сохранить старые сигнатуры функций и поведение, обеспечивая работу старых проектов без модификации кода.

  3. Обработка устаревших свойств В библиотеке предусмотрена поддержка устаревших свойств через deprecated warnings в консоли. Например, при использовании старого варианта опции placement: 'auto' библиотека может предложить обновленный формат, но при этом старый код продолжит работать.


Примеры обратной совместимости

Старый способ установки позиции:

import { computePosition, autoPlacement } from '@floating-ui/dom';

computePosition(referenceElement, floatingElement, {
  middleware: [autoPlacement()]
}).then(({ x, y }) => {
  Object.assign(floatingElement.style, {
    left: `${x}px`,
    top: `${y}px`
  });
});

Новый способ с сохранением старого API:

import { computePosition, autoPlacement } from '@floating-ui/dom';

computePosition(referenceElement, floatingElement, {
  middleware: [autoPlacement({ alignment: 'start' })]
}).then(({ x, y }) => {
  Object.assign(floatingElement.style, { left: `${x}px`, top: `${y}px` });
});

В этом примере новое свойство alignment добавлено, но существующий код без alignment продолжает работать корректно.


Совместимость с разными версиями браузеров

Floating UI учитывает особенности работы CSS и DOM в старых браузерах:

  • IE11 и Edge Legacy: поддержка ограничена, но базовое позиционирование сохраняется. Для middleware, использующих strategy: 'fixed', автоматически применяется fallback на absolute.
  • Мобильные браузеры: библиотека корректно обрабатывает touch events и размеры viewport, сохраняя старое API для вычисления позиции и смещения.
  • CSS-свойства: при изменении спецификации transform, contain и will-change библиотека проверяет поддержку и использует полифиллы при необходимости.

Управление устаревшими методами

Floating UI предоставляет механизм оберток для устаревших функций:

import { computePosition as oldComputePosition } from '@floating-ui/dom';

oldComputePosition(reference, floating, { middleware: [] })
  .then(({ x, y }) => {
    floating.style.transform = `translate(${x}px, ${y}px)`;
  });

Такая обертка сохраняет старый метод transform, даже если внутренние алгоритмы вычисления позиции изменились. Это позволяет постепенно мигрировать код к новым подходам без полной переработки существующих компонентов.


Стратегии обеспечения совместимости при обновлениях

  1. Версионирование Floating UI придерживается семантического версионирования. Патч-версии исправляют баги, минорные версии добавляют новые middleware, а мажорные версии могут включать изменения API. Старые версии middleware продолжают работать в новых релизах через адаптеры.

  2. Middleware adapters Для обеспечения совместимости с новыми версиями используются адаптеры, позволяющие подключать старые middleware без изменения их кода. Например, адаптер для flip обеспечивает работу старых конфигураций с новыми вычислениями позиции.

  3. Fallback-стратегии Для браузеров с ограниченной поддержкой новых CSS-свойств используется fallback на простые вычисления top/left без transform. Это обеспечивает стабильное отображение всплывающих элементов на старых устройствах.


Важные моменты

  • Сохраняется поведение по умолчанию middleware: старые комбинации flip + shift + offset продолжают работать после обновления библиотеки.
  • Обратная совместимость не гарантирует поддержку устаревших браузеров бесконечно, но обеспечивает плавный переход к новым версиям с минимальными изменениями.
  • Документация Floating UI регулярно обновляется, включая разделы о deprecated свойствах и примеры миграции к новым API.

Обеспечение обратной совместимости в Floating UI сочетает строгую модульность, использование адаптеров и стратегий fallback, что позволяет проектам оставаться стабильными при обновлениях библиотеки и работе с разными браузерами.