Яка різниця між шим і поліфілом?


406

І , здається, використовується в колах веб - розробки, см наприклад Polyfills Браузер HTML5 Cross , який говорить:

Отож, тут ми збираємо всі лайки, резервні запаси та поліфіли ...

Або є проект es5-shim .

У моєму поточному проекті ми використовуємо ряд таких, і я хочу вставити їх у один каталог. Отже, як я повинен називати цей каталог --- shimsабо polyfills?


6
повторно: я вважаю, що "те, що я повинен називати в цьому каталозі", може бути засноване на думці, але це дійсно не надається більш широкому контексту питання - і це не найважливіший аспект цього питання. Усі відповіді тут, здається, узгоджуються, і тут значне використання фактів, посилань та конкретної експертизи.
nobar

Відповіді:


386
  • Прокладка є будь-який шматок коду , який виконує перехоплення виклику API і забезпечує рівень абстракції. Це не обов'язково обмежується веб-програмою або HTML5 / CSS3.

  • Polyfill є типом прокладки , що дооснащення застарілих браузерів із сучасною HTML5 / CSS3 функцій , які зазвичай з допомогою Javascript або Flash.

Відповідаючи на ваше конкретне питання, зателефонуйте до свого каталогу, shimsякщо ви хочете зберегти каталог загальним.


234

Шим

Якщо ви знайомі з схемою адаптера, знаєте, що таке лайка. Shims перехоплює виклики API і створює абстрактний шар між абонентом і ціллю. Зазвичай прокладки використовують для зворотної сумісності. Наприклад, пакет es5-shim npm дозволить вам написати синтаксис ECMAScript 5 (ES5), і не буде байдуже, у браузері працює ES5 чи ні. Візьміть Date.now як приклад. Це нова функція в ES5, де синтаксис у ES3 буде новим Date (). GetTime () . Якщо ви використовуєте es5-shim, ви можете написати Date.now, і якщо браузер, який ви працюєте, підтримує ES5, він просто запуститься. Однак якщо у браузері працює двигун ES3, es5-shim перехопить виклик Date.nowі просто поверніть новий Date (). getTime () замість цього. Таке перехоплення називається мерехтливим. Відповідний вихідний код від es5-shim виглядає так:

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

Поліфіл

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


107
Тоді як обшивки використовуються для приховування старих гріхів, поліфіли використовуються для повернення майбутніх удосконалень у часі. Це все підводить до мене. Дякую за чітке пояснення.
JohnnyQ

Ця відповідь корисна, дякую. Але мені здається, що два терміни часто не використовуються саме в Інтернеті, включаючи es5-shim. Я думаю, що es5-shim - це суміш шим і поліфілів за вашим визначенням.
Метт Браун

WOW -> Отже, коли покриття використовуються для приховування старих гріхів, поліфіли використовуються для повернення майбутніх удосконалень у часі. <- Велике спасибі!
зеппелін

3
Приклад Дати для мене схожий на поліфункцію. Чому я думаю, що це поліфіл? Тому що Date.now - це рідний дзвінок. Polyfill додасть цю функцію в той самий безпрограшний API для браузера. Шина поставляється з новим API, наприклад: MyShim.Date.now(); Будь ласка, виправте мене, якщо я помиляюся.
TatzyXY

99

З того, що я розумію:

Поліфайл - це код, який виявляє, якщо певний "очікуваний" API відсутній, і вручну реалізує його. Напр

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

Шина - це код, який перехоплює існуючі виклики API та реалізує різні поведінки. Ідея тут полягає в нормалізації певних API в різних середовищах. Отже, якщо два браузери реалізують один і той же API по-різному, ви можете перехопити виклики API в одному з цих браузерів і змусити його поведінку вирівнятись з іншим браузером. Або якщо у веб-переглядача є помилка в одному з його API, ви можете знову перехопити виклики до цього API, а потім обійти помилку.


66

Посилаючись на Акселя Раушмаєра з його книги, що говорить JavaScript :

  • Шим - це бібліотека, яка приносить новий API в старе середовище, використовуючи лише засоби цього середовища.
  • Поліфайл - це приналежність для API браузера. Зазвичай перевіряє, чи підтримує браузер API. Якщо цього немає, поліфіл встановлює власну реалізацію. Це дозволяє використовувати API в будь-якому випадку. Термін «поліфіл» походить від продукту для домашнього вдосконалення; згідно Ремі Шарп :

    Polyfilla - це продукт у Великобританії, відомий як "Spackling Paste" в США. Зважаючи на це: уявляйте браузери як стіну з тріщинами. Ці [поліфіли] допомагають згладити тріщини і дають нам приємну гладку стіну браузерів для роботи.


9

Шим. Шим - це бібліотека, яка приносить новий API в старе середовище, використовуючи лише засоби цього середовища.

Поліфіл. У жовтні 2010 р. Ремі Шарп порозмовляв над терміном «поліфіл» [через Ріка Уолдрона]:

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


8

Фантастична стаття, написана про це з декількох років тому, що це добре пояснює:

Що таке поліфіл?

У статті (2) просто протиставляється як таке:

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

Polyfill: щось, у що ви можете потрапити (тобто JavaScript), і воно мовчки працює, щоб імітувати існуючі API браузера , які інакше не підтримуються.


1
Я думаю, що це вводить в оману уявлення як про звичайне використання, так і про те, що насправді говорить Ремі Шарп у публікації блогу, до якого ви пов’язані. Shim найбільш часто використовується в якості синоніма polyfill в даний час (див особливо ES5-підкладку і ES6-підкладку ) і Ремі зокрема про те, що говорив йому слово «прокладка» натякало API користувача (в порівнянні з shim.gif). Він дуже не диктує, що слова вживаються таким чином, і, кажучи "мені", він мовчки визнає, що його використання не є універсальним.
Марк Амері
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.