Qual è la differenza tra uno spessore e un polyfill?


406

Entrambi sembrano essere utilizzati nei circoli di sviluppo web, vedi ad esempio HTML5 Polyfill per browser incrociati , che dice:

Quindi qui stiamo raccogliendo tutti gli spessori, i fallback e i polyfill ...

Oppure c'è il progetto es5-shim .

Nel mio progetto attuale stiamo usando un numero di questi e voglio incollarli tutti nella stessa directory. Quindi, come dovrei chiamare questa directory --- shimso polyfills?


6
riaprire: suppongo che "come dovrei chiamare questa directory" potrebbe essere basato sull'opinione, ma in realtà non viene dato il contesto più ampio della domanda - né è questo l'aspetto più importante di questa domanda. Tutte le risposte qui sembrano essere in accordo e c'è un uso significativo di fatti, riferimenti e competenze specifiche.
nobar

Risposte:


386
  • Uno shim è qualsiasi pezzo di codice che esegue l'intercettazione di una chiamata API e fornisce un livello di astrazione. Non è necessariamente limitato a un'applicazione Web o HTML5 / CSS3.

  • Un polyfill è un tipo di spessore che aggiorna i browser legacy con le moderne funzionalità HTML5 / CSS3 che di solito utilizzano Javascript o Flash.

Per rispondere alla tua domanda specifica, chiama la tua directory shimsse vuoi mantenere la directory generica.


234

shim

Se hai familiarità con il modello di adattatore, allora sai cos'è uno spessore. Shims intercetta le chiamate API e crea un livello astratto tra il chiamante e la destinazione. Tipicamente gli spessori vengono utilizzati per la compatibilità all'indietro. Ad esempio, il pacchetto npm es5-shim ti consentirà di scrivere la sintassi ECMAScript 5 (ES5) e di non preoccuparti se il browser esegue ES5 o meno. Prendi Date.now come esempio. Questa è una nuova funzione in ES5 in cui la sintassi in ES3 sarebbe new Date (). GetTime () . Se usi es5-shim puoi scrivere Date.now e se il tuo browser supporta ES5 funzionerà. Tuttavia, se il browser esegue il motore ES3 es5-shim intercetterà la chiamata a Date.nowe restituisce semplicemente la nuova data (). getTime () invece. Questa intercettazione si chiama shimming. Il codice sorgente rilevante di es5-shim è simile al seguente:

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

polyfill

Polyfilling è davvero solo una versione specializzata dello shimming. Polyfill riguarda l'implementazione di funzionalità mancanti in un'API, mentre uno shim non dovrebbe essere tanto importante per l'implementazione di funzionalità mancanti quanto per la correzione di funzionalità. So che questi sembrano eccessivamente vaghi, ma laddove gli shim sono usati come un termine più ampio, il polyfill è usato per descrivere gli shim che forniscono una compatibilità all'indietro per i browser più vecchi. Quindi, mentre gli spessori vengono utilizzati per nascondere vecchi peccati, i polifilloli vengono utilizzati per riportare i miglioramenti futuri nel tempo. Ad esempio, non esiste supporto per sessionStorage in IE7, ma il polyfill nel pacchetto npm sessionstorage aggiungerà questa funzione in IE7 (e precedenti) utilizzando tecniche come la memorizzazione di dati nella proprietà name della finestra o l'uso di cookie.


107
Quindi, mentre gli spessori vengono utilizzati per nascondere vecchi peccati, i polifilloli vengono utilizzati per riportare i miglioramenti futuri nel tempo. Questo riassume tutto per me. Grazie per una chiara spiegazione.
JohnnyQ,

Questa risposta è utile, grazie. Ma mi sembra che i due termini spesso non vengano utilizzati precisamente sul web, incluso es5-shim. Penso che es5-shim sia un mix di spessori e polyfill secondo la tua definizione.
Matt Browne,

WOW -> Quindi, mentre gli spessori vengono utilizzati per nascondere vecchi peccati, i polifilloli vengono utilizzati per riportare i miglioramenti futuri nel tempo. <- Mille grazie!
Zeppelin,

3
Il Date-Example sembra un Polyfill per me. Perché penso che sia un Polyfill? Perché Date.now è una chiamata nativa. Un Polyfill aggiungerà quella funzionalità con la stessa API senza soluzione di continuità al browser. Uno shim include una nuova API come: MyShim.Date.now(); Per favore, correggimi se sbaglio.
TatzyXY,

99

Da quello che ho capito:

Un polyfill è un codice che rileva se manca una determinata API "prevista" e la implementa manualmente. Per esempio

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

Uno shim è un codice che intercetta le chiamate API esistenti e implementa comportamenti diversi. L'idea qui è quella di normalizzare alcune API in ambienti diversi. Pertanto, se due browser implementano la stessa API in modo diverso, è possibile intercettare le chiamate API in uno di quei browser e allineare il suo comportamento con l'altro browser. In alternativa, se un browser presenta un bug in una delle sue API, è possibile intercettare nuovamente le chiamate a tale API e quindi aggirare il bug.


66

Citando Axel Rauschmayer dal suo libro Speaking JavaScript :

  • Uno shim è una libreria che porta una nuova API in un ambiente più vecchio, usando solo i mezzi di quell'ambiente.
  • Un polyfill è uno spessore per un'API del browser. In genere controlla se un browser supporta un'API. In caso contrario, il polyfill installa la propria implementazione. Ciò consente di utilizzare l'API in entrambi i casi. Il termine polyfill deriva da un prodotto per la casa; secondo Remy Sharp :

    Polyfilla è un prodotto del Regno Unito noto come Pasta Spackling negli Stati Uniti. Con questo in mente: pensa ai browser come a un muro con delle crepe. Questi [polyfill] aiutano ad appianare le crepe e ci danno una parete liscia di browser con cui lavorare.


9

Shim. Uno shim è una libreria che porta una nuova API in un ambiente più vecchio, usando solo i mezzi di quell'ambiente.

Polyfill. Nell'ottobre 2010, Remy Sharp ha scritto sul blog il termine "polyfill" [via Rick Waldron]:

Un polyfill è un pezzo di codice (o plugin) che fornisce la tecnologia che tu, lo sviluppatore, ti aspetti che il browser fornisca in modo nativo. Appiattire il panorama delle API, se vuoi.


8

Un fantastico articolo scritto a riguardo di alcuni anni fa che lo spiega bene:

Che cos'è un Polyfill?

Nell'articolo i (2) sono semplicemente contrastati come tali:

Shim: un pezzo di codice che potresti aggiungere (ad es. JavaScript) Per correggere alcune funzionalità, ma molto spesso avrebbe la sua API .

Polyfill: qualcosa che potresti inserire (ad esempio JavaScript) e funzionerebbe silenziosamente per imitare le API del browser esistenti che altrimenti non sono supportate.


1
Penso che questa sia una rappresentazione fuorviante sia dell'uso comune che di ciò che Remy Sharp effettivamente dice nel post sul blog a cui sei collegato. Shim è più spesso utilizzato come sinonimo di polyfill al giorno d'oggi (si veda in particolare l'ES5-spessore e ES6-spessore ) e Remy è particolare circa dicendo che a lui la parola 'spessore' allude a un'API personalizzata (per confronto con shim.gif). Non sta molto imponendo che le parole vengano usate in questo modo, e dicendo "a me" sta tacitamente riconoscendo che il suo uso non è universale.
Mark Amery,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.