В чем разница между прокладкой и полифилл?

оба, похоже, используются в кругах веб-разработки, см., например,HTML5 Кросс-браузер Polyfills, который говорит:

Итак, здесь мы собираем все прокладки,резервные и многослойные...

или там в ES5-shim и.

в моем текущем проекте мы используем несколько из них, и я хочу поместить их все в один каталог. Итак, как я должен называть этот каталог - - -shims или polyfills?

6 ответов


  • A сим - это любой фрагмент кода, который выполняет перехват вызова API и предоставляет уровень абстракции. Это не обязательно ограничивается веб-приложением или HTML5 / CSS3.

  • A polyfill это типа ШИМ это модернизирует устаревшие браузеры с современными функциями HTML5 / CSS3, обычно используя Javascript или Flash.

отвечая на ваш конкретный вопрос, я каталог shims Если вы хотите сохранить общий каталог.


сим

Если вы знакомы с шаблоном адаптера, то вы знаете, что такое прокладка. Shims перехватывает вызовы API и создает абстрактный слой между вызывающим и целевым объектом. Обычно прокладки используются для обратной совместимости. Например,в ES5-shim и пакет npm позволит вам написать синтаксис ECMAScript 5 (ES5) и не заботиться, работает ли браузер ES5 или нет. Взять дата.теперь в качестве примера. Это новая функция в ES5, где синтаксис в ES3 будет новая дата().методов gettime(). Если вы используете в ES5-shim и можно писать дата.теперь и если браузер, в котором вы работаете, поддерживает ES5, он просто запустится. Однако, если в браузере запущен движок ES3 в ES5-shim и будет перехватывать вызов дата.теперь и просто вернуть новая дата().методов gettime() вместо. Этот перехват называется shimming. Соответствующий исходный код из es5-shim выглядит так это:

if (!Date.now) {
    Date.now = function now() {
        return new Date().getTime();
    };
}

Polyfill

Polyfilling действительно как раз специализированная версия shimming. Polyfill - это реализация отсутствующих функций в API, тогда как прокладка не обязательно будет столько о реализации отсутствующих функций, сколько об исправлении функций. Я знаю, что они кажутся слишком расплывчатыми, но там, где прокладки используются как более широкий термин, polyfill используется для описания прокладок, которые обеспечивают обратную совместимость для старых браузеров. Так пока прокладки использованы для покрывать вверх по старым грехам, polyfills использованы для приносить будущие повышения назад во времени. В качестве примера нет поддержки sessionStorage в IE7, но polyfill в sessionstorage пакет npm добавит эту функцию в IE7 (и старше), используя такие методы, как хранение данных в свойстве name окна или с помощью cookies.


из того, что я понимаю:

polyfill-это код, который определяет, отсутствует ли определенный" ожидаемый " API, и вручную реализует его. Е. Г.

if (!Function.prototype.bind) { Function.prototype.bind = ...; }

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


со ссылкой на Аксель Rauschmayer из книги Говоря JavaScript:


ШИМ. Прокладка-это библиотека, которая приносит новый API в более старую среду, используя только средства этой среды.

полифилл. В октябре 2010 года Реми Шарп написал в блоге о термине "polyfill" [via Rick Waldron]:

polyfill-это фрагмент кода (или плагин), который предоставляет технологию, которую вы, разработчик, ожидаете от браузера. Сглаживание ландшафта API, если хотите.


фантастическая статья, написанная об этом несколько лет назад, которая хорошо объясняет это:

Что такое полифилл?

в статье (2) просто противопоставляются как таковые:

оболочка: фрагмент кода, который вы можете добавить (т. е. JavaScript) это исправит некоторые функции, но чаще всего будет иметь это собственный API.

Polyfill: что-то, что вы могли бы бросить в (т. е. JavaScript) и он будет молча работать, чтобы имитировать существующие API браузера, которые в противном случае не поддерживается.