Tenho testado meu aplicativo React.js no Internet Explorer e descobri que algum código ES6 / 7 como o Array.prototype.includes()
quebra.
Estou usando criar-reagir-app e, aparentemente, eles optaram por não incluir muitos polyfills, já que nem todo mundo precisa deles, e eles diminuem os tempos de construção (veja por exemplo aqui e aqui ). A documentação (no momento da redação) sugere:
Se você usar qualquer outro recurso ES6 + que precise de suporte de tempo de execução (como Array.from () ou Symbol), certifique-se de incluir os polyfills apropriados manualmente ou de que os navegadores que você está almejando já os suportem.
Então ... qual é a melhor maneira de incluí-los 'manualmente'?
javascript
reactjs
ecmascript-6
create-react-app
ecmascript-7
Daniel Loiterton
fonte
fonte
babel-polyfill
um polyfill ES6 + fácil.Array.prototype.includes()
na verdade está no ES7, não no ES6Respostas:
Atualização : a abordagem e os documentos do polyfill criar-reagir-app mudaram desde esta pergunta / resposta. Agora você deve incluir
react-app-polyfill
( aqui ) se deseja oferecer suporte a navegadores mais antigos, como o ie11. No entanto, isso inclui apenas os " ... requisitos mínimos e recursos de linguagem comumente usados ", então você ainda vai querer usar uma das abordagens abaixo para recursos menos comuns do ES6 / 7 (comoArray.includes
)Essas duas abordagens funcionam:
1. Importações manuais de react-app-polyfill e core-js
Instale react-app-polyfill e core-js (3.0+):
npm install react-app-polyfill core-js
ouyarn add react-app-polyfill core-js
Crie um arquivo chamado (algo como) polyfills.js e importe-o em seu arquivo index.js raiz. Em seguida, importe os polyfills básicos do react-app, além de quaisquer recursos específicos necessários, como:
/* polyfills.js */ import 'react-app-polyfill/ie11'; import 'core-js/features/array/find'; import 'core-js/features/array/includes'; import 'core-js/features/number/is-nan'; /* index.js */ import './polyfills' ...
2. Serviço Polyfill
Use o CDN polyfill.io para recuperar polyfills personalizados específicos do navegador, adicionando esta linha a index.html:
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=default,Array.prototype.includes"></script>
observe que tive de solicitar explicitamente o
Array.prototype.includes
recurso, pois ele não está incluído no conjunto de recursos padrão.fonte
core-js
e importar polyfills globais individuais de seupolyfills.js
. Fora isso, ambas as abordagens parecem boas.<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=default,es6"></script>
(repare noes6
) e agora está funcionando perfeitamente. Acredito que o principal problema era a necessidade de um polyfill para o Symbol.Use o react-app-polyfill que tem polyfills para os recursos ES6 comuns usados no React. E faz parte do aplicativo criar-reagir . Certifique-se de incluí-lo no início de index.js conforme definido no README.
fonte
Array.prototype.includes()
ou outros.Usei yarn para baixar o polyfill e importei-o diretamente no meu index.js.
No prompt de comando:
E então, no topo de
index.js
:import 'array.prototype.fill' // <-- newly added import import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; ...
Gosto dessa abordagem, pois estou importando especificamente o que preciso para o projeto.
fonte
Eu estava tendo problemas com o novo Google Search Console e meu aplicativo React (criar-reagir-aplicativo). Depois de adicionar o es6shim, tudo foi resolvido.
Eu adicionei o seguinte à minha página index.html pública.
<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>
fonte
Ejetar do seu projeto de aplicativo Create React
Depois, você pode colocar todos os seus polyfills em seu
/config/polyfills.js
arquivoColoque o seguinte no final do arquivo
Object.values = Object.values ? Object.values : o=>Object.keys(o).map(k=>o[k]);
Webpack irá corrigir isso automaticamente para você;)
fonte
Eu tive o mesmo problema. Uma solução de Daniel Loiterton não funcionou para mim. Mas! Eu adicionei mais uma importação de core-js
import 'core-js/modules/es6.symbol';
e isso funciona para mim no IE11.fonte