В чем разница между прокладкой и полифилом? - PullRequest
367 голосов
/ 06 июля 2011

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

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

Или есть проект es5-shim .

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

Ответы [ 6 ]

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

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

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

200 голосов
/ 30 июля 2015

Шим

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

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

Polyfill

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

95 голосов
/ 27 июня 2013

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

Полифилл - это код, который обнаруживает отсутствие определенного «ожидаемого» API и реализует его вручную.Например,

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

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

63 голосов
/ 24 июня 2014

Цитируя Аксель Раушмайер из своей книги Говоря JavaScript :

  • Shim - это библиотека, которая переносит новый API в более старую среду, используя только средства этой среды.
  • Полифилл - это прокладка для браузера API. Обычно он проверяет, является ли браузер поддерживает API. Если это не так, полифилл устанавливает свой собственный реализация. Это позволяет использовать API в любом случае. термин polyfill происходит от продукта домашнего улучшения; в соответствии с Реми Sharp :

    Polyfilla - это британский продукт, известный как Spackling Paste в США. Имея это в виду: думайте о браузерах как о стене с трещинами в ней. Эти [polyfills] помогают сгладить трещины и дают нам хорошую гладкую стену браузеров для работы.

9 голосов
/ 09 июня 2015

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

Polyfill. В октябре 2010 года Реми Шарп написал в блоге термин «полифилл» [через Рика Уолдрона]:

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

6 голосов
/ 06 ноября 2014

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

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

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

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

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

...