Polyfills zijn co­de­com­po­nen­ten die nieuwere web­func­ties bruikbaar maken in browsers die der­ge­lij­ke functies niet standaard on­der­steu­nen. In dit artikel wordt uitgelegd wat deze prak­ti­sche co­de­com­po­nen­ten zijn en hoe u ze kunt gebruiken.

Wat zijn polyfills en in welke talen kunnen ze worden ge­schre­ven?

Een polyfill, ook wel po­ly­fil­ler genoemd, is een codeblok van ver­schil­len­de com­plexi­teit dat moderne HTML-, CSS- of Ja­vaScript-functies be­schik­baar maakt in oudere browsers die deze niet standaard on­der­steu­nen. De meeste polyfills zijn ge­schre­ven in Ja­vaScript, maar ook andere web­pro­gram­meer­ta­len kunnen als basis dienen voor fil­ler­scripts. Enkele van de be­lang­rijk­ste functies die polyfills be­schik­baar maken in ver­schil­len­de web­brow­sers zijn HTML5-com­po­nen­ten zoals de op bitmaps ge­ba­seer­de can­va­s­ele­men­ten voor af­beel­din­gen, grafieken en animaties.

Opmerking

De term ‘polyfill’ is afgeleid van het populaire Britse merk Polyfilla, een vulmiddel voor renovatie- en res­tau­ra­tie­werk­zaam­he­den. We­bont­wik­ke­laar Remy Sharp zag een passende ver­ge­lij­king tussen de vulstof en deze handige wor­ka­round-codes, aangezien beide bedoeld zijn om hiaten op te vullen. Bij deze laatste zijn de hiaten die moeten worden opgevuld hiaten in de func­ti­o­na­li­teit van de browser. Het concept werd bedacht in Sharps boek In­tro­du­cing HTML5 uit 2009, dat hij samen met Bruce Lawson schreef. Polyfill werd ver­vol­gens de officiële benaming voor der­ge­lij­ke co­de­com­po­nen­ten.

Welke soorten polyfills zijn er?

Het feit dat de term polyfill nauw verbonden is met HTML5 is geen toeval. Met zijn ge­a­van­ceer­de functies, die onder andere de noodzaak van flas­h­vi­deo’s overbodig hebben gemaakt, is de vijfde versie van de hypertext markup language een vast onderdeel van het web geworden. De on­der­steu­ning voor HTML5 in browsers heeft zich echter vrij langzaam ont­wik­keld. Naast de polyfills die voor HTML5-elementen zijn gemaakt, worden polyfill-co­de­blok­ken ook gebruikt om de volgende we­be­le­men­ten te in­te­gre­ren:

  • SVG-af­beel­din­gen: het SVG-formaat SVG (Scalable Vector Graphics), dat het W3C-con­sor­ti­um in 2001 begon aan te bevelen als stan­daard­for­maat voor vec­to­r­af­beel­din­gen, werd voor het eerst populair met HTML5. Maar omdat veel browsers dit formaat nog niet on­der­steu­nen, zijn er SVG-polyfills zoals svgweb.
  • EC­MAScript: EC­MAScript is de ge­stan­daar­di­seer­de kern van Ja­vaScript en wordt re­gel­ma­tig bij­ge­werkt om de func­ti­o­na­li­teit van de taal uit te breiden. Functies zoals Promise-objecten of Symbol-functies worden in oudere browsers be­schik­baar gemaakt via polyfills zoals de Ja­vaScript-stan­daard­bi­bli­o­theek core-js.
  • Webopslag: al­ter­na­tie­ven voor cookies zoals lokale opslag (lang­du­ri­ge opslag aan de client­zij­de) en ses­sie­op­slag (opslag beperkt tot de huidige sessie), ge­za­men­lijk bekend als webopslag of DOM-opslag, worden niet door alle brow­ser­ver­sies on­der­steund. De MIT-ge­li­cen­ti­eer­de webstor­a­ge-polyfill is een bekende oplossing voor dit probleem.
  • Cross-Origin Resource Sharing (CORS): CORS stelt we­bap­pli­ca­ties in staat om toegang te krijgen tot web­bron­nen die zich buiten de eigen server bevinden. Veel oudere browsers on­der­steu­nen deze ge­ge­vens­uit­wis­se­ling niet. Het Ja­vaScript-pakket XDomain en de CORS-polyfill XHook kunnen hierbij helpen.
  • CSS (Cascading Style Sheets): CSS is al jaren een van de be­lang­rijk­ste tools voor het ontwerpen van de visuele lay-out van websites. In de loop der tijd zijn sty­les­heets veel­zij­di­ger geworden, waardoor polyfills populair zijn geworden voor de koppeling met oudere browsers. Een van de bekendste tools is css-polyfills.js.
  • Ge­o­lo­ca­tie: lange tijd werd de Ge­o­lo­ca­ti­on API (die wordt gebruikt om de locatie van een gebruiker door te geven) niet on­der­steund door browsers en kon deze alleen worden gebruikt met behulp van een extra brow­serplu­gin. Met een polyfill kunt u deze func­ti­o­na­li­teit aanbieden aan ge­brui­kers met oudere brow­ser­ver­sies die de API niet native on­der­steu­nen.

Hoe worden polyfills gebruikt? (Inclusief co­de­voor­beel­den)

Je kunt polyfill Ja­vaScript-code of polyfill-scripts recht­streeks in het HTML-document van een website insluiten. Deze worden naadloos ge­ïn­te­greerd in de bestaande broncode en worden alleen uit­ge­voerd als de browser de be­tref­fen­de web­func­tie niet on­der­steunt. Dit gebeurt doorgaans met behulp van if van Ja­vaScript om te con­tro­le­ren of er on­der­steu­ning ontbreekt. Het ontbreken van on­der­steu­ning kan dan worden omgezet in een voor­waar­de voor het activeren van het script. In de volgende twee voor­beel­den laten we zien hoe u dit kunt im­ple­men­te­ren en laten we u zien hoe de algemene structuur van een polyfill eruitziet.

Voorbeeld 1: Polyfill voor de Ja­vaScript-methode startsWith()

if (!String.prototype.startsWith) {
    String.prototype.startsWith = function (searchString, position) {
        position = position || 0;
        return this.indexOf(searchString, position) === position;
    };
}
ja­vascript

Met dit kleine Ja­vaScript-fragment kan de op­roe­pen­de browser de startsWith() gebruiken, zelfs als deze niet standaard wordt on­der­steund. Deze methode, die deel uitmaakt van de EC­MAScript 6-spe­ci­fi­ca­tie, con­tro­leert of een te­ken­reeks begint met het teken of de te­ken­reeks van een andere te­ken­reeks. Als dat het geval is, wordt ‘true’ ge­re­tour­neerd, anders wordt ‘false’ ge­re­tour­neerd. Een com­plexe­re, ge­op­ti­ma­li­seer­de versie voor in­te­gra­tie van startsWith() vindt u op de GitHub-pagina van ont­wik­ke­laar Mathias Bynens.

Opmerking

De hier ge­pre­sen­teer­de code werkt niet als de webclient Ja­vaScript blokkeert of de script­taal in de in­stel­lin­gen heeft uit­ge­scha­keld.

Voorbeeld 2: Polyfill voor webopslag

Deze Ja­vaScript-polyfill is een een­vou­di­ge co­deer­op­los­sing die lokale opslag en ses­sie­op­slag be­schik­baar maakt in oudere brow­ser­mo­del­len.

if (typeof window.localStorage === 'undefined' || typeof window.sessionStorage === 'undefined') {
    (function () {
        var data = {};
        var Storage = function (type) {
            function setData() {
                // Implement the logic to set data into storage
                var storageData = JSON.stringify(data);
                document.cookie = type + '=' + storageData + ';path=/';
            }
            function clearData() {
                data = {};
                setData();
            }
            return {
                length: 0,
                clear: function () {
                    clearData();
                    this.length = 0;
                },
                getItem: function (key) {
                    return data[key] === undefined ? null : data[key];
                },
                key: function (i) {
                    var ctr = 0;
                    for (var k in data) {
                        if (ctr == i) return k;
                        ctr++;
                    }
                    return null;
                },
                removeItem: function (key) {
                    delete data[key];
                    this.length--;
                    setData();
                },
                setItem: function (key, value) {
                    data[key] = value + '';
                    this.length++;
                    setData();
                }
            };
        };
        // Set the local and session storage properties inside the window object
        if (typeof window.localStorage === 'undefined') window.localStorage = new Storage('local');
        if (typeof window.sessionStorage === 'undefined') window.sessionStorage = new Storage('session');
    })();
}
ja­vascript

De bo­ven­staan­de code is een Im­me­di­a­te­ly Invoked Function Ex­pres­si­on(IIFE). Voordat de browser deze laadt, con­tro­leert een if in de eerste regel van de code echter of de client de we­bop­slag­tech­no­lo­gie­ën native on­der­steunt. Als dat het geval is, re­tour­neert de if een false-waarde, omdat de typen voor lokale en ses­sie­op­slag al zijn ge­de­fi­ni­eerd. Dit heeft tot gevolg dat de polyfill wordt ver­wij­derd.

Ga naar hoofdmenu