Polyfill
Коротко
Фрагмент JavaScript-кода, который добавляет в старый браузер стандартную возможность, уже описанную в спецификации, но в этом браузере ещё не реализованную.
Что такое «Polyfill»
Слово придумал британский разработчик Реми Шарп в 2009 году, по названию шпатлёвки Polyfilla, которой в Великобритании заделывают трещины в стенах. Метафора точная: полифил «замазывает дыры» в браузере, чтобы разработчик писал код по стандарту, не оглядываясь на старые версии. Когда браузер обновится и получит возможность сам, полифил просто перестанет срабатывать.
Как устроен полифил
Принцип всегда один: сначала проверить, есть ли возможность в браузере (это называют feature detection, родственный приём в CSS — правило @supports), и только если её нет, добавить свою реализацию. Важно, чтобы реализация вела себя так же, как стандартная, — иначе при переходе на встроенную версию код начнёт работать по-другому.
Пример: метод Array.prototype.at
if (!Array.prototype.at) {
Object.defineProperty(Array.prototype, 'at', {
value: function (index) {
const i = Math.trunc(index) || 0;
return this[i < 0 ? this.length + i : i];
},
writable: true,
configurable: true
});
}
Метод at(-1) возвращает последний элемент массива. Полифил добавляет его, только если метода нет. Object.defineProperty используется не случайно: при простом присваивании Array.prototype.at = … новое свойство станет перечисляемым и вылезет в циклах for…in по всем массивам сайта.
Вручную полифилы сейчас пишут редко. Обычно их подключает сборка: Babel с библиотекой core-js добавляет только то, что нужно для браузеров из списка поддержки проекта. Синтаксис, которого старый браузер не понимает, например новые операторы, полифилом не добавить — его переписывает транспилятор.
Риски и сторонние CDN
Полифилы удобно было брать с внешних сервисов, которые отдавали набор под конкретный браузер. В 2024 году домен популярного сервиса polyfill.io сменил владельца, и тысячи сайтов, подключавших скрипт с него, начали получать вредоносный код. Вывод: полифилы лучше хранить у себя и собирать вместе с проектом, а внешние скрипты подключать только с доверенных адресов. И ещё одно: каждый полифил — лишний вес для всех посетителей. Если доля старых браузеров в аналитике ничтожна, часть полифилов можно смело убрать. Родственные понятия — shim и prolyfill.

