Mitä ovat polyfillit?
Polyfillit ovat koodikomponentteja, jotka mahdollistavat uusien verkkotoimintojen käytön selaimissa, jotka eivät tue näitä toimintoja natiivisti. Tässä artikkelissa selitetään, mitä nämä käytännölliset koodikomponentit ovat ja miten niitä voidaan käyttää.
Mitä polyfillit ovat ja millä kielillä ne voidaan kirjoittaa?
Polyfill, jota joskus kutsutaan myös nimellä Polyfiller, on vaihtelevan monimutkaisuusasteen koodilohko, joka mahdollistaa nykyaikaisten HTML-, CSS- tai JavaScript-toimintojen käytön vanhemmissa selaimissa, jotka eivät tue niitä natiivisti. Useimmat polyfillit on kirjoitettu JavaScript-kielellä, mutta myös muut web-ohjelmointikielet voivat toimia täytescriptien perustana. Tärkeimpiä polyfillien eri selaimissa mahdollistamia ominaisuuksia ovat HTML5- komponentit, kuten bittikarttapohjaiset canvas-elementit grafiikkaa, kaavioita ja animaatioita varten.
Termi “polyfill” on johdettu suositusta brittiläisestä Polyfilla-tuotemerkistä, joka valmistaa täyteaineita remontointi- ja restaurointitöihin. Verkkokehittäjä Remy Sharp näki sopivan vertailun täyteaineen ja näiden hyödyllisten kiertokoodien välillä, koska molempien tarkoitus on täyttää aukkoja. Jälkimmäisessä tapauksessa täytettävät aukot ovat selaimen toiminnallisuuden aukkoja. Käsite keksittiin Sharpin vuonna 2009 julkaisemassa kirjassa Introducing HTML5, jonka hän kirjoitti yhdessä Bruce Lawsonin kanssa. Polyfill vakiinnutti myöhemmin asemansa tällaisten koodikomponenttien virallisena nimityksenä.
Mitä erilaisia polyfill-tyyppejä on olemassa?
Se, että termi polyfill liittyy läheisesti HTML5:een, ei ole sattumaa. Edistyneillä ominaisuuksillaan, jotka ovat muun muassa tehneet flash-videoista tarpeettomia, hypertekstimerkkikielen viides versio on tullut pysyväksi osaksi verkkoa. HTML5:n tuki selaimissa on kuitenkin kehittynyt melko hitaasti. HTML5-elementeille luotujen polyfillien lisäksi polyfill-koodilohkoja käytetään myös seuraavien verkkoelementtien integroimiseen:
- SVG-grafiikka: SVG-muoto SVG (Scalable Vector Graphics), jota W3C-konsortio alkoi suositella vektorigrafiikan vakiomuotona vuonna 2001, sai ensimmäisen kerran suosiota HTML5:n myötä. Koska monet selaimet eivät vielä tue tätä muotoa, on olemassa SVG-polyfillejä, kuten svgweb.
- ECMAScript: ECMAScript on JavaScriptin standardoitu ydin, jota päivitetään säännöllisesti kielen toiminnallisuuden laajentamiseksi. Ominaisuudet, kuten Promise-objektit tai Symbol-funktiot, ovat käytettävissä vanhemmissa selaimissa polyfillien, kuten JavaScript-standardikirjaston core-js, avulla.
- Verkkotallennus: Evästeiden vaihtoehtoja, kuten paikallinen tallennus (pitkäaikainen tallennus asiakaspuolella) ja istuntotallennus (tallennus rajoitettu nykyiseen istuntoon), joita kutsutaan yhdessä verkkotallennukseksi tai DOM-tallennukseksi, eivät kaikki selainversiot tue. MIT-lisensoitu webstorage-polyfill on tunnettu ratkaisu tähän ongelmaan.
- Cross-Origin Resource Sharing (CORS): CORS mahdollistaa web-sovellusten pääsyn oman palvelimen ulkopuolella sijaitseviin web-resursseihin. Monet vanhemmat selaimet eivät tue tätä tiedonsiirtoa. JavaScript-paketti XDomain ja CORS-polyfill XHook voivat auttaa ratkaisemaan tämän ongelman.
- CSS (Cascading Style Sheets): CSS on jo vuosia ollut yksi tärkeimmistä työkaluista verkkosivustojen visuaalisen ulkoasun suunnittelussa. Ajan myötä tyylitiedostot ovat tulleet monipuolisemmiksi, mikä on tehnyt polyfilleistä suosittuja vanhempien selainten kanssa käytettäviä rajapintoja. Yksi tunnetuimmista työkaluista on css-polyfills.js.
- Geolokaatio: pitkään selaimet eivät tukeneet Geolocation API:ta (jota käytetään käyttäjän sijainnin välittämiseen), ja sitä voitiin käyttää vain lisälaajennuksen avulla. Polyfillin avulla voit tarjota tämän toiminnallisuuden käyttäjille, joilla on vanhemmat selainversiot, jotka eivät tue API:ta natiivisti.
Miten polyfillejä käytetään? (Sisältää koodiesimerkkejä)
Voit upottaa polyfill-JavaScript-koodin tai polyfill-skriptit suoraan verkkosivuston HTML-dokumenttiin. Ne integroituvat saumattomasti olemassa olevaan lähdekoodiin ja suoritetaan vain, jos selain ei tue tiettyä verkkotoimintoa. Tämä tehdään tyypillisesti JavaScriptin if, joka tarkistaa puuttuvan tuen. Tuen puuttuminen voidaan sitten muuttaa ehdoksi skriptin aktivoimiseksi. Seuraavissa kahdessa esimerkissä havainnollistamme, miten tämä toteutetaan, ja näytämme, miltä polyfillin yleinen rakenne näyttää.
Esimerkki 1: Polyfill JavaScript-menetelmälle startsWith()
if (!String.prototype.startsWith) {
String.prototype.startsWith = function (searchString, position) {
position = position || 0;
return this.indexOf(searchString, position) === position;
};
}javascriptTämä pieni JavaScript-koodinpätkä mahdollistaa kutsuvan selaimen käyttää startsWith(), vaikka se ei tukisikaan sitä natiivisti. Tämä menetelmä, joka on osa ECMAScript 6 -spesifikaatiota, tarkistaa, alkaako merkkijono toisen merkkijonon merkillä tai merkkijonolla. Jos näin on, se palauttaa arvon “true”, muuten se palauttaa arvon “false”. Löydät monimutkaisemman, optimoidun version startsWith() integroimiseksi kehittäjä Mathias Bynensin GitHub-sivulta.
Tässä esitetty koodi ei toimi, jos verkkosovellus estää JavaScriptin tai jos sen asetuksissa on poistettu käytöstä skriptikieli.
Esimerkki 2: Verkkotallennustilan polyfill
Tämä JavaScript-polyfill on yksinkertainen koodausratkaisu, joka mahdollistaa paikallisen ja istunnon tallennustilan käytön vanhemmissa selainmalleissa.
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');
})();
}javascriptYllä oleva koodi on välittömästi kutsuttu funktiolauseke(IIFE). Ennen kuin selain lataa sen, ensimmäisen rivin komento if tarkistaa, tukeeko asiakas natiivisti web-tallennustekniikoita. Jos tukee, lause if palauttaa arvon false, koska paikallisen ja istunnon tallennustyypit on jo määritelty. Tämä johtaa polyfillin hylkäämiseen.