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

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

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

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

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


person Domenic    schedule 06.07.2011    source источник
comment
reopen: я полагаю, что то, что я должен назвать этим каталогом, может быть основано на мнении, но на самом деле это не дает более широкого контекста вопроса - и это не самый важный аспект этого вопроса. Кажется, что все ответы здесь согласуются друг с другом, и здесь много фактов, ссылок и конкретного опыта.   -  person Brent Bradburn    schedule 10.01.2018


Ответы (6)


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

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

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

person Arsalan Ahmed    schedule 12.07.2011

Прокладка

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

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

Полифилл

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

person Kjetil Klaussen    schedule 30.07.2015
comment
Таким образом, в то время как прокладки используются для прикрытия старых грехов, полифиллы используются для того, чтобы вернуть будущие улучшения в прошлое. Это подводит меня ко всему. Спасибо за четкое объяснение. - person JohnnyQ; 08.11.2015
comment
Этот ответ полезен, спасибо. Но мне кажется, что эти два термина часто не используются именно в Интернете, включая es5-shim. Я думаю, что es5-shim - это смесь прокладок и полифиллов по вашему определению. - person Matt Browne; 04.03.2017
comment
WOW - ›Таким образом, в то время как прокладки используются для прикрытия старых грехов, полифиллы используются для того, чтобы вернуть будущие улучшения в прошлое. <- Большое спасибо! - person zeppelin; 26.03.2018
comment
Date-Example мне кажется полифиллом. Почему я думаю, что это Полифилл? Потому что Date.now - это нативный вызов. Polyfill добавит эту функцию с тем же API в браузер. Прокладка поставляется с новым API, например: MyShim.Date.now(); Исправьте меня, если я ошибаюсь. - person TatzyXY; 12.11.2018

Насколько я понимаю:

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

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

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

person Šime Vidas    schedule 26.06.2013

Ссылаясь на Акселя Раушмайера из его книги Speaking JavaScript < / а>:

person Bergi    schedule 24.06.2014

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

Что такое Polyfill?

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

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

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

person atconway    schedule 06.11.2014
comment
Я думаю, что это вводящее в заблуждение представление как об общем использовании, так и о том, что на самом деле говорит Реми Шарп в сообщении блога, на которое вы ссылались. Shim в настоящее время чаще всего используется как синоним polyfill (см., в частности, es5-shim и es6-shim), а Реми - в частности о том, что для него слово "прокладка" относится к пользовательскому API (по сравнению с shim.gif). Он совершенно не требует, чтобы слова использовались таким образом, и, говоря мне, он молчаливо признает, что его использование не является универсальным. - person Mark Amery; 29.11.2014

Polyfill - это просто скрипт, который проверяет наличие определенного API в браузере, хорошо? Если API не существует в браузере, polyfill (который представляет собой простой скрипт) будет действовать примерно так:

например, я собираюсь использовать Bluetooth API в браузере, и я знаю, что в каком-то браузере нет такого API, поэтому я напишу что-то вроде этого, чтобы проверить наличие моего API:

if(!navigator.bluetooth) { // write polyfill here } 

Shim - это тоже скрипт, который в основном предоставляется в виде плагина или библиотеки, и как он работает?

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

person Hamid    schedule 29.11.2020