Встроенные полифиллы

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

Поддержка старых браузеров

Unpoly включает в себя несколько встроенных полифиллов, которые автоматически активируются при необходимости:

  • Element.matches — метод для проверки, соответствует ли элемент заданному CSS-селектору. Полифилл обеспечивает его поддержку в IE9+ и старых версиях Safari.
  • CustomEvent — полифилл для создания собственных событий в браузерах, где CustomEvent не реализован нативно. Это критично для системы событий Unpoly, которая использует их для уведомления о завершении обновления фрагментов страницы.
  • requestAnimationFrame — обеспечивает плавное выполнение анимаций и визуальных эффектов при обновлении контента. В старых браузерах заменяется тайм-аутом с минимальной задержкой.

Все полифиллы встроены так, чтобы не создавать конфликтов с уже существующими реализациями. Если браузер поддерживает метод нативно, Unpoly его не переопределяет.

Автоматическая загрузка полифиллов

При подключении библиотеки Unpoly проверяет окружение и включает необходимые полифиллы автоматически. Например, если браузер не поддерживает Element.closest, будет подключен соответствующий полифилл.

Ключевые особенности механизма:

  • Ленивая инициализация — полифилл активируется только тогда, когда он реально нужен.
  • Минимальное влияние на производительность — проверка поддержки встроена в момент загрузки библиотеки, а не при каждом вызове методов.
  • Согласованность поведения — все встроенные методы полифиллов ведут себя идентично современным стандартам, что предотвращает неожиданные ошибки при работе с DOM.

Расширение и кастомизация

Хотя большинство полифиллов встроено по умолчанию, есть возможность отключить их и подключать свои версии при необходимости. Это особенно полезно в проектах с жёсткими требованиями к размеру скриптов или при использовании собственных оптимизированных полифиллов.

Пример отключения встроенного полифилла CustomEvent:

up.polyfills = {
  CustomEvent: false
};

После этого можно подключить стороннюю реализацию:

(function() {
  function CustomEventPolyfill(event, params) {
    params = params || { bubbles: false, cancelable: false, detail: null };
    var evt = document.createEvent('CustomEvent');
    evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
    return evt;
  }
  window.CustomEvent = window.CustomEvent || CustomEventPolyfill;
})();

Особенности работы с модулями Unpoly

Полифиллы особенно важны при использовании модульной структуры Unpoly. Функции, такие как up.fragment или up.link, часто опираются на методы DOM, которые могут отсутствовать в старых браузерах. Встроенные полифиллы гарантируют, что эти модули работают корректно без дополнительных настроек.

Например, при динамической подгрузке фрагмента страницы:

up.fragment.fetch('/users/42', { target: '#user-profile' });

Метод использует Element.matches и CustomEvent. В браузерах без поддержки этих методов Unpoly автоматически подключит полифиллы, что обеспечит правильное выполнение скрипта.

Контроль над совместимостью

Для проектов, где необходимо строгий контроль совместимости, Unpoly позволяет проверить, какие полифиллы активированы:

console.log(up.polyfills);

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

Итоговые принципы встроенных полифиллов

  • Минимизация ручного вмешательства: большинство полифиллов включаются автоматически.
  • Полная совместимость с современным API: поведение полифиллов идентично стандартной реализации.
  • Лёгкая кастомизация: есть возможность отключать встроенные решения и подставлять свои.
  • Безопасность для производительности: проверка поддержки выполняется один раз при загрузке, что предотвращает замедление работы страницы.

Встроенные полифиллы являются фундаментом стабильной работы Unpoly на различных браузерах и обеспечивают одинаковый опыт использования для всех пользователей, независимо от версии их браузера.