Polyfills machen moderne Web-Features auch in jenen Browsern nutzbar, denen die native Un­ter­stüt­zung dieser Kom­po­nen­ten fehlt. Was diese prak­ti­schen Code-Bausteine genau ausmacht und wie du diese Tech­no­lo­gie einsetzt, erfährst du in diesem Artikel.

Was ist ein Polyfill?

Als Polyfill oder Po­ly­fil­ler be­zeich­net man einen Code-Baustein, der aktuelle HTML-, CSS- oder Ja­va­Script-Funk­tio­nen in älteren Browsern be­reit­stellt, die diese nicht von Haus aus un­ter­stüt­zen. Meistens ist ein Polyfill in Ja­va­Script ge­schrie­ben – prin­zi­pi­ell sind aber auch andere Web-Pro­gram­mier­spra­chen als Basis für diese „Füll“-Skripte möglich. Zu den wich­tigs­ten Features, die durch Polyfills brow­se­r­ü­ber­grei­fend verfügbar gemacht werden, zählen HTML5-Kom­po­nen­ten wie das Canvas-Element für Grafiken, Diagramme und Ani­ma­tio­nen.

Hinweis

Der Begriff „Polyfill“ leitet sich von der bri­ti­schen Marke Polyfilla ab, einer Spach­tel­mas­se für Re­no­vie­rungs­ar­bei­ten. Da diese Masse Löcher in Wänden stopft, sah der Web­ent­wick­ler Remy Sharp darin den perfekten Vergleich für die prak­ti­schen Work­around-Codes. Er prägte den Begriff 2009 in seinem Buch „In­tro­du­cing HTML5“ (gemeinsam mit Bruce Lawson). Danach eta­blier­te sich Polyfill als of­fi­zi­el­le Be­zeich­nung.

Welche Polyfills gibt es?

Dass der Begriff eng mit HTML5 verknüpft ist, kommt nicht von ungefähr: Mit seinen Fort­schrit­ten, die etwa Flash-Videos über­flüs­sig machten, wurde die fünfte Version von HTML schnell zum Standard. Die HTML5-Un­ter­stüt­zung durch die Browser verlief anfangs jedoch schlep­pend. Neben Polyfills für HTML5-Elemente sind solche Code-Bausteine vor allem bei folgenden Web-Elementen gefragt:

  • SVG-Grafiken: Das SVG-Format (Scalable Vector Graphics) ist seit 2001 W3C-Standard für Vek­tor­gra­fi­ken, ver­brei­te­te sich aber erst mit HTML5. Da viele Browser anfangs Probleme hatten, gibt es Polyfills wie svgweb.
  • EC­MA­Script: Als stan­dar­di­sier­ter Kern von Ja­va­Script wird EC­MA­Script laufend ak­tua­li­siert. Neueste Features wie Promise-Objekte laufen dank Polyfills aus der Bi­blio­thek core-js auch in betagten Brow­ser­ver­sio­nen.
  • Web Storage: Die Cookie-Al­ter­na­ti­ven Local Storage und Session Storage werden nicht von jedem Browser un­ter­stützt. Ein bekanntes Hilfs­mit­tel hierfür ist das MIT-li­zen­zier­te websto­rage-polyfill.
  • Cross-Origin Resource Sharing (CORS): CORS erlaubt den Zugriff auf Res­sour­cen außerhalb des eigenen Servers. Ältere Browser blo­ckie­ren dies oft. Hilfe bieten hier Pakete wie XDomain in Kom­bi­na­ti­on mit XHook.
  • CSS (Cascading Style Sheets): Style­sheets sind für das Design von Websites es­sen­zi­ell. Da CSS immer komplexer wird, sind Polyfills als Brücke zu alten Browsern sehr beliebt. Ein bekanntes Tool ist css-polyfills.js.
  • Geo­lo­ca­ti­on: Die Standort-Über­mitt­lung via Geo­lo­ca­ti­on-API brauchte früher oft Plugins. Mit einem Polyfill stellst du diese Funktion auch Nutzer:innen alter Browser zur Verfügung, ohne dass diese Er­wei­te­run­gen in­stal­lie­ren müssen.

Wie werden Polyfills an­ge­wen­det (inkl. Beispiel)?

Du kannst Polyfill-Skripte direkt in das HTML-Dokument einbetten. Sie fügen sich nahtlos in den Quellcode ein und werden nur dann aktiv, wenn der Browser ein Feature tat­säch­lich nicht un­ter­stützt. In Ja­va­Script nutzt man dafür oft die if-Anweisung, um den fehlenden Support als Bedingung fest­zu­le­gen. Wie ein solcher Aufbau eines Polyfills aussieht, zeigen die folgenden Beispiele.

Beispiel 1: Polyfill für die Methode startsWith()

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

Dieses Snippet er­mög­licht die Nutzung der Ja­va­Script-Methode startsWith(), auch wenn der Browser diese nicht nativ be­herrscht. Die Methode prüft, ob ein String mit einer be­stimm­ten Zei­chen­fol­ge beginnt und gibt „true“ oder „false“ zurück. Die erste Codezeile stellt sicher, dass das Skript ignoriert wird, falls der Browser die Funktion bereits kennt.

Eine op­ti­mier­te Version dieser startsWith()-Methode findest du beim Ent­wick­ler Mathias Bynens auf GitHub.

Hinweis

Der Code funk­tio­niert nur dann, wenn Ja­va­Script im Browser der Nutzer:innen aktiviert ist.

Beispiel 2: Web-Storage-Polyfill

Dieses Beispiel zeigt eine Lösung, um Local bzw. Session Storage in alten Browsern verfügbar zu machen.

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­va­script

Hierbei handelt es sich um eine Imme­dia­te­ly Invoked Function Expression (IIFE), also einen sofort aus­ge­führ­ten Funk­ti­ons­aus­druck. Bevor dieser lädt, wird via if-Anweisung geprüft, ob der Client Web-Storage bereits un­ter­stützt. Ist das der Fall, liefert die if-Anweisung „false“, und das Polyfill wird nicht aus­ge­führt.

Zum Hauptmenü