O uso de polyfills ao escrever aplicativos entre navegadores

Recentemente, uma história engraçada aconteceu comigo. Fiz um projeto na Web e ampliei os recursos de um aplicativo existente, que meu pessoal usa na minha organização. Tudo parecia ótimo, fiquei feliz que o projeto foi lançado, ansioso por cartas de agradecimento.

Alguns dias após o primeiro lançamento, eu realmente comecei a receber cartas. Mas agradecimentos não foram observados neles. Gerentes, funcionários de recursos humanos e todos aqueles que tentaram usar meu programa escreveram para mim. Todos eles disseram que seu aplicativo não funciona corretamente.



Qual é o problema? Mas o fato é que, quando criei o projeto, testei no Chrome. Mas os usuários deste projeto usam constantemente o Firefox e o IE. Trabalhar com meu aplicativo não foi uma exceção. No final, fiquei completamente infeliz por o projeto, lançado alguns dias atrás, ter sido finalizado.

De fato, aqui os polyfills vieram em meu auxílio.

Polyfills


Um polyfill (polyfill ou polyfiller) é um pedaço de código (ou um determinado plug-in) que implementa o que o desenvolvedor espera entre os recursos padrão do navegador. Os polyfills permitem, por assim dizer, "suavizar" as irregularidades das APIs do navegador.

Em um ambiente da web, os polyfills geralmente são representados pelo código JavaScript. Esse código é usado para equipar navegadores herdados com recursos modernos aos quais esses navegadores não suportam.

Por exemplo, usando o polyfill, você pode simular a funcionalidade do elemento HTML do Canvas no Microsoft Internet Explorer 7. Para isso, o plug-in Silverlight é usado. O Polyfill pode ser usado para oferecer suporte a unidades de medida rem em CSS, ou o atributo text-shadow , ou qualquer outra coisa. As razões pelas quais os desenvolvedores não usam exclusivamente polyfills, não prestando atenção aos recursos internos dos navegadores, são que os recursos padrão dos navegadores fornecem melhor funcionalidade e maior desempenho. As implementações do navegador de várias APIs têm mais recursos do que os polyfills e funcionam mais rapidamente.

Às vezes, os polyfills são usados ​​para resolver problemas associados ao fato de que diferentes navegadores implementam os mesmos recursos de maneiras diferentes. Esse polyfill interage com alguns navegadores, usando seus recursos não padrão, e dá a outros programas JavaScript acesso a certos mecanismos que estão em conformidade com os padrões. Deve-se notar que essas razões para o uso de polyfills hoje não são mais tão relevantes quanto antes. Os polyfills foram especialmente prevalentes nos dias do IE6, Netscape e NNav, quando cada navegador implementou os recursos JavaScript de maneira diferente dos outros.

Exemplo


Publiquei recentemente um guia de desenvolvimento para um aplicativo que converte arquivos CSV e Excel em JSON usando JavaScript. Aqui você pode ver o aplicativo finalizado.

Para lidar com o que falaremos mais adiante, você pode fazer tudo o que é discutido no manual ou clonar meu repositório com o seguinte comando:

 git clone https://github.com/YannMjl/jsdemo-read-cvs-xls-json cd jsdemo-read-cvs-xls-json 

Eu recomendo usar o VS Code no processo. Você pode iniciar o aplicativo Web localmente usando a extensão do VS Code Live Server .

Vamos modificar esse aplicativo da web e examinar os problemas que surgem ao trabalhar com ele usando diferentes navegadores.

Crie uma ramificação polyfill no repositório e alterne para ele:

 git checkout -b polyfill 

Vou investigar uma situação em que recebemos dados de dois ou mais arquivos CSV e, depois de processar os resultados das solicitações para as APIs correspondentes, produzimos esses dados em uma tabela HTML.

▍ Finalização do projeto


Crie um novo arquivo CSV ( team2.csv ) no diretório raiz do projeto, como resultado do qual deve haver dois arquivos. Aqui está o arquivo que eu adicionei ao projeto.

script.js arquivo script.js para que ele leia dados de 2 arquivos e exiba todos os dados em uma tabela HTML. Aqui está o meu script.js :

 // ******************************************************************** //                         * //   ,      * // ******************************************************************** var csv_file_API_1 = "./UsersSample.csv"; var csv_file_API_2 = "./team2.csv"; var APIs_array = [csv_file_API_1, csv_file_API_2]; //       $(document).ready(function () {    $("#headerTitle").hide(300).show(1500);    makeAPICalls(); }); // end: document.ready() function makeAPICalls() {    // ,      API    var calls = [];    //  API  CSV-     APIs_array.forEach(function (csv_file_API) {        //             calls.push(new Promise(function (resolve, reject) {            //   API   AJAX            $.ajax({                type: "GET",                url: csv_file_API,                dataType: "text",                cache: false,                error: function (e) {                    alert("An error occurred while processing API calls");                    console.log("API call Failed: ", e);                    reject(e);                },                success: function (data) {                    var jsonData = $.csv.toObjects(data);                    console.log(jsonData);                    resolve(jsonData);                } // end:       API            }); // end: AJAX-        })); // end:         }); // end:   API    //      API    Promise.all(calls).then(function (data) {        //           var flatData = data.map(function (item) {            return item;        }).flat();        console.log(flatData);        dislayData(flatData);    }); } function dislayData(data) {       $.each(data, function (index, value) {        $('#showCSV').append(            '<li class="list-group-item d-flex justify-content-between align-items-center">' +                '<span style="width: 15%; font-size: 1rem; font-weight: bold; color: #37474F">' +                    value['FIRST NAME'] +                '</span>' +                '<span style="width: 15%; font-size: 1rem; color: #37474F">' +                    value['LAST NAME'] +                '</span>' +                '<span class="badge warning-color-dark badge-pill">' +                    value['PHONE NUMBER'] +                '</span>' +                '<span class="badge success-color-dark badge-pill">' +                    value['EMAIL ADDRESS'] +                '</span>' +                '<span class="badge badge-primary badge-pill">' +                    value.CITY +                '</span>' +                '<span class="badge badge-primary badge-pill">' +                    value.STATE +                '</span>' +            '</li>'        );    }); } 

Agora, depois de copiar o endereço da página, abra o projeto em todos os navegadores que você possui. No meu caso, eram o Internet Explorer, Firefox Mozilla, Microsoft Edge e Google Chrome. Verificou-se que o aplicativo parou de funcionar normalmente no Internet Explorer e no Microsoft Edge. Somente cabeçalhos foram exibidos lá.


Página de projeto do Chrome


Página do Projeto Microsoft Edge

Não há dados na página exibidos por alguns navegadores por dois motivos:

  1. Eu usei promessas e retornos de chamada que nem todos os navegadores suportam. Por exemplo, entre esses navegadores estão o IE e o Edge.
  2. Eu usei o método de matriz flat() para criar uma nova matriz "plana" a partir de uma matriz existente. Este método não é suportado por alguns navegadores. Entre eles, como no caso anterior, IE e Edge.

Aplicação de polyfills


Corrigimos o problema de promessas e retornos de chamada usando a biblioteca Bluebird . Esta é uma implementação JS completa de mecanismos relacionados a promessas. A característica mais interessante da biblioteca Bluebird é que ela permite "sobrecarregar" outros módulos do Nó, processando-os para que você possa trabalhar com eles de forma assíncrona. Esse tipo de processamento pode ser aplicado ao código que usa retornos de chamada.

Faça o download da biblioteca Bluebird para a página usando o recurso CDN apropriado. Para fazer isso, coloque o seguinte no cabeçalho do arquivo index.html (no elemento head ):

 <script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.7.0/bluebird.min.js"></script> 

Para corrigir o problema referente ao método da matriz flat() , adicione o seguinte código na parte superior do arquivo script.js :

 Object.defineProperty(Array.prototype, 'flat',    {        value: function (depth) {            depth = 1;            return this.reduce(                function (flat, toFlatten) {                    return flat.concat((Array.isArray(toFlatten) && (depth > 1)) ? toFlatten.flat(depth - 1) : toFlatten);                }, []            );        },        configurable: true }); 

Agora o aplicativo deve funcionar em todos os navegadores conforme o esperado. Aqui, por exemplo, é como agora fica no Microsoft Edge.


Página refinada do projeto no Microsoft Edge

Eu implantei este projeto aqui . Você pode experimentar isso.

Se você não conseguiu fazer o projeto funcionar, consulte meu repositório .

E aqui - por exemplo - mais alguns polyfills.

 //   String.prototype.startsWith() if (!String.prototype.startsWith) {    Object.defineProperty(String.prototype, 'startsWith', {        value: function (search, rawPos) {            pos = rawPos > 0 ? rawPos | 0 : 0;            return this.substring(pos, pos + search.length) === search;        }    }); } //   String.prototype.includes() if (!String.prototype.includes) {    String.prototype.includes = function (search, start) {        'use strict';        if (typeof start !== 'number') {            start = 0;        }        if (start + search.length > this.length) {            return false;        } else {            return this.indexOf(search, start) !== -1;        }    }; } 

Sumário


Os polyfills eram especialmente relevantes antes, mas ainda hoje podem ajudar no desenvolvimento de projetos da web para vários navegadores. Esperamos que o exemplo dado aqui permita àqueles que não conheciam o polyfill dar uma nova olhada no problema de criar sites projetados para diferentes navegadores.

Caros leitores! Você usa polyfill?


Source: https://habr.com/ru/post/pt475248/


All Articles