Polyfill: módulos de código para a web moderna
Os chamados polyfills permitem usar novas funcionalidades da web em navegadores que já não têm suporte nativo. Neste artigo, descobrirá o que são esses módulos de código e como pode usar essa tecnologia.
O que significa polyfill?
Um polyfill ou polyfiller é um módulo de código mais ou menos extenso que torna as funções modernas de HTML, CSS ou JavaScript disponíveis em navegadores antigos que já não são compatíveis com elas. Na maioria dos casos, os polyfills são escritos em JavaScript, mas existem outras linguagens de programação web que podem ser usadas como base para esses scripts de preenchimento. Entre as funções mais importantes que podem ser adaptadas aos navegadores com polyfills estão componentes HTML5 como o canvas-element, baseado em mapas de bits, para gráficos, diagramas e animações.
O termo «polyfill» vem da marca polyfilla, amplamente utilizada na Grã-Bretanha e que, na realidade, é uma pasta de enchimento para trabalhos de renovação e recondicionamento. Devido à sua função como massa para preencher buracos nas paredes, o programador web Remy Sharp encontrou nela a comparação adequada para os códigos paliativos para resolver problemas, razão pela qual os batizou assim no seu livro Introducing HTML5, escrito com Bruce Lawson em 2009. polyfill foi então adotado como o nome oficial.
Que tipos de polyfills existem?
O facto de o termo polyfill estar tão intimamente ligado ao HTML5 não é uma coincidência: com as suas características avançadas, que tornaram obsoletos os vídeos em flash, entre outras coisas, a quinta versão da linguagem de marcação de hipertexto tornou-se rapidamente um elemento permanente na web. No que diz respeito à compatibilidade do HTML5 com os navegadores, no entanto, o desenvolvimento foi relativamente lento. Além dos polyfills para HTML5, também são necessários módulos de código polyfill para a integração dos seguintes elementos web:
- Gráficos SVG: embora o formato SVG (Scalable Vector Graphics) tenha sido recomendado pelo W3C Konsortium como formato padrão para gráficos vetoriais desde 2001, ele só avançou a partir do HTML5. Como muitos navegadores ainda não oferecem compatibilidade, existem polyfills de SGV, como o svgweb.
- ECMAScript: ECMAScript é o núcleo da linguagem declarada padrão do JavaScript, que passa por revisões periódicas para ampliar gradualmente a funcionalidade da linguagem de scripting. As funcionalidades mais recentes, como objetos-promessa ou funções-símbolo, também funcionam nas versões mais antigas dos navegadores graças aos polyfills da biblioteca padrão do Java Script core-js.
- Armazenamento web: as alternativas aos cookies Local Storage (armazenamento permanente nas páginas do cliente) e Session Storage (armazenamento apenas da sessão atual), que podem ser resumidas sob o termo genérico de armazenamento web (Web Storage) ou armazenamento DOM (DOM Storage), também não são compatíveis com todas as versões dos navegadores. Um polyfill famoso, escrito para responder a estes problemas, é o polyfill de armazenamento web, licenciado pelo MIT.
- Cross-Origin Resource Sharing (CORS): o CORS permite que as aplicações web acedam a recursos web fora do seu próprio servidor. Muitos navegadores antigos já não são compatíveis com esta troca de dados. Isto é resolvido com uma combinação do pacote JavaScript XDomain e do polyfill CORS XHook.
- CSS (Cascading Style Sheets): o CSS é uma das ferramentas mais importantes para o design gráfico de páginas web há muitos anos. Com o passar dos anos, as folhas de estilo tornaram-se cada vez mais versáteis, pelo que são cada vez mais utilizados polyfills como interface para os modelos de navegadores mais antigos. Uma das soluções mais famosas é o css-polyfills.js.
- Geolocalização: durante muitos anos, a API de geolocalização, usada para enviar a própria localização, só podia ser utilizada com a ajuda de complementos adicionais do navegador e não era compatível com os navegadores padrão. Se quiser que a função esteja disponível para utilizadores de versões anteriores de clientes web sem extensões, pode utilizar um polyfill.
Como se utilizam os polyfills? Exemplos incluídos
Os polyfills JavaScript, ou os scripts polyfill em geral, podem ser incorporados diretamente no documento HTML de um projeto web. Eles se integram perfeitamente ao código-fonte existente e, se programados corretamente, só são executados se o navegador de acesso não for compatível com a função web correspondente. Para isso, o JavaScript utiliza, por exemplo, a expressão if, que pode ser usada para definir a compatibilidade ausente como condição para ativar o script. Estes dois exemplos ilustram como isso deve ser registrado exatamente no código e como é a estrutura de um polyfill em geral.
Exemplo 1: polyfill para o método JavaScript startsWith()
if (!String.prototype.startsWith) {
String.prototype.startsWith = function (searchString, position) {
position = position || 0;
return this.indexOf(searchString, position) === position;
};javascriptEste pequeno fragmento de JavaScript permite que o navegador chamado utilize o método JavaScript startsWith(), mesmo que não seja compatível com ele. Este método, que faz parte da especificação ECMAScript 6, determina se uma determinada cadeia ou string começa com os caracteres ou com a sequência de outra string. Se for esse o caso, retorna o valor true, caso contrário, retorna o valor false. A primeira linha de código faz com que o script seja desativado se o navegador suportar o método de forma nativa.
O programador Mathias Bynens disponibilizou uma variante mais complexa e otimizada do polyfill para integrar o método startsWith() no GitHub.
O código indicado não funciona se o cliente web de acesso bloquear o JavaScript ou se esta linguagem de script estiver desativada nas configurações.
Exemplo 2: polyfill de armazenamento web
O segundo exemplo de polyfill JavaScript apresenta uma solução de código simples que permite que o armazenamento local ou de sessão esteja disponível em modelos de navegadores mais antigos.
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');
})();
}javascriptO código aqui indicado é uma Immediately Invoked Function Expression (IIFE), ou seja, uma expressão de função executada imediatamente. No entanto, antes que o navegador a carregue, verifica-se se o cliente é compatível de forma nativa com as tecnologias de armazenamento web, como no primeiro exemplo, utilizando a expressão if na primeira linha de código. Se for esse o caso, a expressão if retorna false (não aplicável), uma vez que os tipos de armazenamento local e de sessão estão definidos. Consequentemente, o polyfill é descartado.