'Símbolo' é indefinido no IE após usar o babel

87

Eu tenho um reactjsaplicativo escrito usando os padrões ES6 e uso webpackpara criá-lo. O webpackcarrega os jsmódulos usando babel-loader. Para ser mais específico, uso as seguintes versões de pacotes: ├── [email protected] ├── [email protected] ├── [email protected] └── [email protected]

Porém, após compilá-lo, o IE 10 dá o seguinte erro 'Symbol' is undefined. O não babeldeveria definir o Symbol? Existe alguma configuração específica webpackou babelpreciso definir para que funcione? Eu uso {stage: 0}configuração no meu .babelrc.

Qualquer ajuda seria apreciada, obrigado !

Jurom
fonte
1
Você poderia adicionar um rastreamento de pilha também?

Respostas:

94

Você pode exigir polyfill no ponto de entrada do seu código para que seja agrupado com o resto do JavaScript.

Uma opção é usar:

require('babel-polyfill');

Ou:

import 'babel-polyfill';

Tudo isso é explicado na documentação .

Łukasz
fonte
2
Eu estava lutando contra esse bug por horas! OBRIGADO
P.Brian.Mackey
por algum motivo, isso não funciona para mim no IE10, IE11, então estou apenas incluindo como um script separado para o IE, conforme mencionado por Jurom. Eu provavelmente iria dividi-lo do meu pacote principal no webpack de qualquer maneira.
svnm
1
Olá @Jurom e @ Lukasz, estou enfrentando o mesmo problema que o símbolo e suas funções como o Symbol.Iterator são indefinidos no IE, usando este Babel Polyfill minha página não está carregando, mas um erro está aparecendo do IE travando e perguntando para recarregar.
Rahul
1
babel-polyfillcorrigiu esse problema para mim. Obrigado!
daveaspinall
68

Ok, acabei descobrindo que babelsozinho não faz polyfill. Incluir o script <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.6.15/browser-polyfill.min.js"></script>resolveu esse problema para mim.

Jurom
fonte
4
existe um método que eu só posso inlucde este script em HTML como: <! - [if IE]> script (type = 'text / javascript'). require ('babel-core / browser-polyfill.js') <! [endif] ->
PinkyJie
Tive o mesmo problema no IE11 e isso também o corrigiu para mim. Obrigado!
Waterskier19
@Jurom, quando adiciono este arquivo em meu html meu IE trava :-(. Por favor, ajude
Rahul
@Rahul qual versão do IE? O que você quer dizer com acidente? Você pode fornecer o log de erros?
Jurom
IE Edge. Mostra que o Internet Explorer não está funcionando. E não consigo gerar nenhum log.
Rahul
8

Esta solução funcionará com certeza, funcionou para mim quando encontrei o erro: 'Symbol' is undefined in IE. Funcionou anteriormente no Chrome e no Firefox, mas o IE estava gerando esse erro. Levei algumas horas para encontrar essa solução. Estou usando o React mais recente neste momento, react "react": "^ 16.5.0" na máquina Windows.

1. Install babel-polyfill
npm install --save-dev babel-polyfill
In package.json, it should have the following entries

"devDependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "^8.0.2",
    "babel-polyfill": "^6.26.0",
    "babel-preset-react": "^6.24.1"
  }

2. In index.js, add

    import babelPolyfill from 'babel-polyfill';

O problema deve ser resolvido

Kiran Chaudhari
fonte
5
Se você importar o polyfill Babel em seu index.js, deverá instalá-lo como uma dependência regular, não como uma dependência dev
Patrick Hund,
Obrigado! Esta parece ser a única maneira de fazer o ie11 funcionar com a forma atual em que Babel e Webpack estão trabalhando juntos para compilar o código. Por que Babel está usando símbolos es6 para construir módulos es5 em primeiro lugar é um mistério, já que é claramente incompatível com navegadores mais antigos, e a compatibilidade com navegadores mais antigos é a razão de o Babel existir.
d13 de
5

OK, eu tive o mesmo problema, mas no meu caso foi bem diferente, então basicamente você precisa incluir o script no arquivo de índice conforme abaixo:

<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.6.15/browser-polyfill.min.js"></script>

Mas no meu caso já incluí isso, depois de algumas investigações descobri que meu proxy bloqueou o script ...

Portanto, certifique-se de incluí-lo no index.html e também certifique-se de ter acesso ao script de onde você precisa para evitar que o erro aconteça ... a melhor maneira é apenas copiar e colar a url no navegador ...

Mas agora que chegamos a este ponto, não se trata do símbolo em si, o que é o símbolo que não pode ser reconhecido no IE?

A função Symbol () retorna um valor do tipo símbolo, tem propriedades estáticas que expõem vários membros de objetos integrados, tem métodos estáticos que expõem o registro de símbolo global e se assemelha a uma classe de objeto integrada, mas é incompleta como construtor porque ele não suporta a sintaxe "new Symbol ()".

Cada valor de símbolo retornado de Symbol () é exclusivo. Um valor de símbolo pode ser usado como um identificador para propriedades de objeto; este é o único propósito do tipo de dados. Alguma explicação adicional sobre o propósito e uso pode ser encontrada na entrada do glossário para Symbol.

O símbolo de tipo de dados é um tipo de dados primitivo.

Alireza
fonte
1
Isso também consertou para mim. Usei o compilador online Babel e incluí este script no meu HTML, voila.
ViktorMS
1
Eu não posso acreditar que essa linha funciona! perseguindo polyfills para react + material ui por dias e isso consertou tudo com uma única linha.
jpro
4

na documentação sobre Runtime

// in bash
npm install babel-transform-runtime --save-dev

// in gulpfile
.pipe(babel({
  plugins: ['transform-runtime']
}))

editar: melhor ainda no heroku no modo prod, use --save em vez de --save-dev

Jacek Pietal
fonte
Este módulo agora é chamado@babel/plugin-transform-runtime
Kevin Reilly
0

Se você está recebendo esse erro em um aplicativo Angular, precisa descomentar as seguintes linhas em polyfills.ts -

/** IE9, IE10 and IE11 requires all of the following polyfills. **/
import 'core-js/es6/symbol';
import 'core-js/es6/object';
import 'core-js/es6/function';
import 'core-js/es6/parse-int';
import 'core-js/es6/parse-float';
import 'core-js/es6/number';
import 'core-js/es6/math';
import 'core-js/es6/string';
import 'core-js/es6/date';
import 'core-js/es6/array';
import 'core-js/es6/regexp';
import 'core-js/es6/map';
import 'core-js/es6/weak-map';
import 'core-js/es6/set';
David Lindon
fonte