Prolyfill
Коротко
Экспериментальная реализация возможности, которая только обсуждается для будущего веб-стандарта и ещё может измениться или вовсе не попасть в спецификацию.
Что такое «Prolyfill»
Название — игра слов: «polyfill» плюс «probably», «вероятно». Его предложил Брайан Карделл, один из активистов движения за расширяемый веб, в начале 2010-х. Встречается и написание prollyfill. Идея в том, что новые возможности веба выгодно сначала опробовать в виде обычной библиотеки на JavaScript. Разработчики пользуются ею в реальных проектах, находят неудобства, и только потом, с учётом опыта, возможность описывают в стандарте и встраивают в браузеры.
Чем отличается от полифила
Полифил догоняет стандарт: возможность уже описана в утверждённой или почти готовой спецификации, и полифил точно повторяет её поведение для старых браузеров. Prolyfill забегает вперёд: стандарта ещё нет, есть лишь предложение или рабочий черновик. Имена, аргументы и поведение могут поменяться, и код, построенный на ранней версии, придётся переписывать.
Урок истории: flatten и flat
Хороший пример того, почему экспериментальный код опасно встраивать в стандартные объекты. В 2018 году в JavaScript готовили метод массивов flatten для «расплющивания» вложенных массивов. Выяснилось, что старая библиотека MooTools давно добавляла в массивы свой flatten с другим поведением, и стандартный метод ломал тысячи сайтов на ней. Метод пришлось переименовать в flat — этот эпизод вошёл в историю как smooshgate. Похожая судьба постигла группировку массивов: от метода на прототипе отказались из-за конфликтов, и она вошла в язык как Object.groupBy().
Как писать безопасно
// Плохо: занимает имя, которое может появиться в стандарте
Array.prototype.flatten = function () { /* … */ };
// Лучше: своё имя в своём модуле
export function flattenDeep(list) {
return list.reduce((acc, x) =>
acc.concat(Array.isArray(x) ? flattenDeep(x) : x), []);
}
Экспериментальную реализацию держат в собственном модуле или пространстве имён, не трогая встроенные объекты. Тогда появление настоящего стандарта не сломает сайт, а переход на него сводится к замене вызовов. В рабочих проектах такие библиотеки используют осторожно: фиксируют версию и закладывают время на переделку, если спецификация изменится.

