Polyfills ir koda kom­po­nen­ti, kas padara jaunākas tīmekļa funkcijas lie­to­ja­mas pār­lūkprog­ram­mās, kuras šādas funkcijas ne­at­bal­sta. Šajā rakstā ir iz­skaid­rots, kas ir šie prak­tis­kie koda kom­po­nen­ti un kā tos var izmantot.

Kas ir polyfills un kādās valodās tos var rakstīt?

Polyfill, ko dažkārt sauc arī par Polyfil­ler, ir dažādas sa­rež­ģī­tī­bas koda bloks, kas padara mūs­die­nī­gas HTML, CSS vai Ja­vaScript funkcijas pieejamas vecākās pār­lūkprog­ram­mās, kuras tās nespēj atbalstīt. Lielākā daļa polyfill ir rakstīti Ja­vaScript, tomēr arī citas tīmekļa prog­ram­mē­ša­nas valodas var kalpot par pamatu aiz­pil­dī­ša­nas skriptiem. Dažas no sva­rī­gā­ka­jām funkcijām, ko polyfill padara pieejamas dažādās tīmekļa pār­lūkprog­ram­mās, ir HTML5 kom­po­nen­ti, piemēram, bitmap balstīti canvas elementi grafikai, diag­ram­mām un ani­mā­ci­jām.

Note

Termins „polyfill” ir cēlies no populārā britu zīmola Polyfilla, kas ir pildviela re­no­vā­ci­jas un res­tau­rā­ci­jas darbiem. Tīmekļa iz­strā­dā­tājs Remy Sharp saskatīja at­bil­sto­šu sa­lī­dzi­nā­ju­mu starp pildvielu un šiem no­de­rī­ga­jiem apvedceļu kodiem, jo abu mērķis ir aizpildīt robus. Pēdējā gadījumā aiz­pil­dā­mie robus ir robus pārlūka fun­kcio­na­li­tā­tē. Šis jēdziens tika ieviests Sharp 2009. gada grāmatā „In­tro­du­cing HTML5”, ko viņš sa­rak­stī­ja kopā ar Bruce Lawson. Polyfill vēlāk kļuva par oficiālo nosaukumu šādiem koda kom­po­nen­tiem.

Kādi ir polifilu veidi?

Tas, ka termins „polyfill” ir cieši saistīts ar HTML5, nav nejaušība. Ar savām uz­la­bo­ta­jām funkcijām, kas, cita starpā, pa­da­rī­ju­šas flash video ne­pie­cie­ša­mī­bu par pagātni, piektā versija hi­per­tek­sta at­zī­mē­ju­mu valodai ir kļuvusi par pastāvīgu tīmekļa funkciju. Tomēr atbalsts HTML5 pār­lūkprog­ram­mās ir at­tīs­tī­jies diezgan lēni. Papildus polyfill, kas izveidots HTML5 ele­men­tiem, polyfill koda bloki tiek izmantoti arī, lai integrētu šādus tīmekļa elementus:

  • SVG grafika: SVG formāts SVG (Scalable Vector Graphics), ko W3C kon­sor­cijs 2001. gadā sāka ieteikt kā standarta formātu vek­torgra­fi­kai, vispirms ieguva po­pu­la­ri­tā­ti ar HTML5. Taču, tā kā daudzas pārlūkas vēl nesniedz atbalstu šim formātam, ir pieejami SVG polyfills, piemēram, svgweb.
  • ECMAScript: ECMAScript ir stan­dar­ti­zēts Ja­vaScript kodols, kas tiek regulāri at­jau­ni­nāts, lai pa­pla­ši­nā­tu valodas fun­kcio­na­li­tā­ti. Funkcijas, piemēram, Promise objekti vai Symbol funkcijas, vecākās pār­lūkprog­ram­mās ir pieejamas, iz­man­to­jot polyfills, piemēram, Ja­vaScript standarta bib­lio­tē­ku core-js.
  • Tīmekļa uz­gla­bā­ša­na: sīkdatņu al­ter­na­tī­vas, piemēram, vietējā uz­gla­bā­ša­na (ilgter­mi­ņa uz­gla­bā­ša­na klienta pusē) un sesijas uz­gla­bā­ša­na (uz­gla­bā­ša­na, kas ie­ro­be­žo­ta ar pa­šrei­zē­jo sesiju), kopā pa­zīs­ta­mas kā tīmekļa uz­gla­bā­ša­na vai DOM uz­gla­bā­ša­na, netiek at­bal­stī­tas visās pārlūku versijās. MIT li­cen­cē­tais websto­rage-polyfill ir labi pazīstams ri­si­nā­jums šai problēmai.
  • Cross-Origin Resource Sharing (CORS): CORS ļauj tīmekļa lie­to­jum­prog­ram­mām piekļūt tīmekļa resursiem, kas atrodas ārpus paša servera. Daudzas vecākas pārlūkas ne­at­bal­sta šo datu apmaiņu. Ja­vaScript pakete XDomain un CORS polyfill XHook var palīdzēt risināt šo problēmu.
  • CSS (Cascading Style Sheets): gadiem ilgi CSS ir bijis viens no sva­rī­gā­ka­jiem rīkiem tīmekļa vietņu vizuālā iz­kār­to­ju­ma vei­do­ša­nai. Laika gaitā stilu lapas ir kļuvušas daudzfun­kcio­nā­lā­kas, padarot polyfills populārus saskarnē ar vecākām pār­lūkprog­ram­mām. Viens no pa­zīs­ta­mā­ka­jiem rīkiem ir css-polyfills.js.
  • Ģeo­lo­kā­ci­ja: ilgu laiku ģeo­lo­kā­ci­jas API (ko izmanto, lai pār­rai­dī­tu lietotāja atrašanās vietu) netika at­bal­stīts pār­lūkprog­ram­mās un to varēja izmantot tikai ar papildu pār­lūkprog­ram­mas spraudņa palīdzību. Ar polyfill jūs varat no­dro­ši­nāt šo fun­kcio­na­li­tā­ti lie­to­tā­jiem ar vecākām pār­lūkprog­ram­mu versijām, kas ne­at­bal­sta API.

Kā tiek izmantoti polifili? (Iekļauti koda piemēri)

Jūs varat tieši ievietot polyfill Ja­vaScript kodu vai polyfill skriptus tīmekļa vietnes HTML dokumentā. Tie ne­vai­no­ja­mi in­teg­rē­jas esošajā avota kodā un tiek izpildīti tikai tad, ja pārlūks ne­at­bal­sta konkrēto tīmekļa funkciju. Parasti to dara, iz­man­to­jot Ja­vaScript if, lai pār­bau­dī­tu trūkstošo atbalstu. Atbalsta trūkums var tikt pārvērsts par no­sa­cī­ju­mu skripta ak­ti­vi­zē­ša­nai. Turp­mā­ka­jos divos piemēros mēs parādīsim, kā to īstenot, un parādīsim, kā izskatās polyfill vispārējā struktūra.

1. piemērs: Polyfill Ja­vaScript metodei startsWith()

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

Šis nelielais Ja­vaScript fragments ļauj iz­sau­cē­jam pār­lūkprog­ram­mai izmantot startsWith() metodi, pat ja tā to ne­at­bal­sta. Šī metode, kas ir daļa no ECMAScript 6 spe­ci­fi­kā­ci­jas, pārbauda, vai virkne sākas ar cita virknes rakstzīmi vai rakstzīm­ju virkni. Ja tā ir, tā atgriež ‘true’, citādi tā atgriež ‘false’. Sa­rež­ģī­tā­ku, op­ti­mi­zē­tu versiju startsWith() in­teg­rē­ša­nai varat atrast GitHub lapā, ko iz­vei­do­jis iz­strā­dā­tājs Mathias Bynens.

Note

Šeit no­rā­dī­tais kods ne­dar­bo­sies, ja tīmekļa klients bloķē Ja­vaScript vai tā ie­sta­tī­ju­mos ir atspējota skriptu valoda.

2. piemērs: tīmekļa uz­gla­bā­ša­nas polyfill

Šis Ja­vaScript polyfill ir vienkāršs kodēšanas ri­si­nā­jums, kas padara vietējo un sesijas uz­gla­bā­ša­nu pieejamu vecākos pārlūku modeļos.

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

Iepriekš minētais kods ir tūlītēji izsaucama funkciju izteiksme(IIFE). Pirms pārlūks to ielādē, pirmās rindas kodā esošā if komanda pārbauda, vai klients na­ti­vi­tā­ti atbalsta tīmekļa uz­gla­bā­ša­nas teh­no­lo­ģi­jas. Ja atbalsta, if izteiksme atgriezīs nepatiesu vērtību, jo vietējās un sesijas uz­gla­bā­ša­nas tipi jau ir definēti. Rezultātā polyfill tiek izmests.

Go to Main Menu