'Symbol' n'est pas défini dans IE après l'utilisation de babel


87

J'ai une reactjsapplication écrite en utilisant les normes ES6, et je l'utilise webpackpour la créer. Le webpackcharge les jsmodules en utilisant babel-loader. Pour être précis, j'utilise les versions de packages suivantes: ├── babel@5.8.34 ├── babel-core@5.8.34 ├── babel-loader@5.4.0 └── webpack@1.12.6

Cependant, après l'avoir construit, l'IE 10 donne l'erreur suivante 'Symbol' is undefined. Ne devrait-il pas babelêtre censé définir le Symbol? Existe-t-il une configuration spécifique webpackou babeldois-je définir pour la faire fonctionner? J'utilise la {stage: 0}configuration dans mon .babelrc.

Toute aide serait appréciée, merci!


1
Pourriez-vous aussi ajouter un stacktrace?

Réponses:


94

Vous pouvez exiger polyfill dans le point d'entrée de votre code afin qu'il soit intégré au reste de JavaScript.

Une option consiste à utiliser:

require('babel-polyfill');

Ou:

import 'babel-polyfill';

Tout cela est expliqué dans la documentation .


2
Je combattais ce bug pendant des heures! MERCI
P.Brian.Mackey

pour une raison quelconque, cela ne fonctionne pas pour moi dans IE10, IE11, donc je l'inclus simplement en tant que script séparé pour IE, comme mentionné par Jurom. Je le diviserais probablement de toute façon de mon bundle principal dans webpack.
svnm

1
Bonjour @Jurom et @ Lukasz, je suis confronté au même problème que Symbol et ses fonctions comme Symbol.Iterator ne sont pas définis dans IE, en utilisant ce Babel Polyfill, ma page ne se charge pas mais une erreur survient lorsque IE plante et demande à recharger.
Rahul le

1
babel-polyfillcorrigé ce problème pour moi. Merci!
daveaspinall

68

Ok, j'ai finalement découvert que babelseul ne fait pas de polyfill. Y compris le script a <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.6.15/browser-polyfill.min.js"></script>résolu ce problème pour moi.


4
existe-t-il une méthode que je ne peux utiliser que dans ce script en HTML comme: <! - [if IE]> script (type = 'text / javascript'). require ('babel-core / browser-polyfill.js') <! [endif] ->
PinkyJie

J'ai eu le même problème dans IE11 et cela l'a corrigé pour moi également. Merci!
Waterskier19

@Jurom, lorsque j'ajoute ce fichier dans mon html, mon IE plante :-(. S'il vous plaît aider
Rahul le

@Rahul quelle version d'IE? Qu'entendez-vous par crash? Pouvez-vous fournir le journal des erreurs?
Jurom

IE Edge. Cela montre qu'Internet Explorer ne fonctionne pas. Et je suis incapable de générer un journal.
Rahul

8

Cette solution fonctionnera à coup sûr, cela a fonctionné pour moi lorsque j'ai rencontré l'erreur: «Symbole» n'est pas défini dans IE. Cela fonctionnait plus tôt dans Chrome et Firefox, mais IE lançait cette erreur. Il m'a fallu quelques heures pour trouver cette solution. J'utilise le dernier React en ce moment react "react": "^ 16.5.0" sur la machine 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';

Le problème devrait être résolu


5
Si vous importez le polyfill Babel dans votre index.js, vous devez l'installer en tant que dépendance normale, pas en tant que dépendance de développement
Patrick Hund

Merci! Cela semble être le seul moyen de faire fonctionner ie11 avec la manière actuelle dont Babel et Webpack travaillent ensemble pour compiler du code. Pourquoi Babel utilise es6 Symbols pour construire des modules es5 en premier lieu est un mystère, car il est clairement incompatible avec les navigateurs plus anciens, et la compatibilité avec les navigateurs plus anciens est la raison pour laquelle Babel existe.
d13

5

OK, j'ai eu le même problème, mais dans mon cas, c'était assez différent, donc fondamentalement, vous devez inclure le script dans le fichier d'index comme ci-dessous:

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

Mais dans mon cas, j'ai déjà inclus cela, après quelques investigations, j'ai découvert que mon proxy bloquait le script ...

Donc , assurez- vous d' inclure dans index.html et aussi assurez - vous que vous avez accès au script où vous en avez besoin pour éviter l'erreur qui se passe ... meilleure façon simplement copier et coller l'URL dans le navigateur ...

Mais maintenant que nous arrivons à ce point, il ne s'agit pas de Symbol lui-même, quel est le symbole qui ne peut pas être reconnu dans IE?

La fonction Symbol () renvoie une valeur de type symbol, a des propriétés statiques qui exposent plusieurs membres d'objets intégrés, a des méthodes statiques qui exposent le registre de symboles global et ressemble à une classe d'objets intégrée mais est incomplète en tant que constructeur car il ne prend pas en charge la syntaxe "new Symbol ()".

Chaque valeur de symbole renvoyée par Symbol () est unique. Une valeur de symbole peut être utilisée comme identificateur pour les propriétés d'objet; c'est le seul objectif du type de données. Vous trouverez des explications supplémentaires sur l'objectif et l'utilisation dans l'entrée du glossaire pour Symbol.

Le symbole de type de données est un type de données primitif.


1
Cela l'a corrigé pour moi aussi. J'ai utilisé le compilateur en ligne Babel et j'ai inclus ce script dans mon HTML, voila.
ViktorMS

1
Je ne peux pas croire que cette ligne fonctionne! chasser polyfills pour react + material ui pendant des jours et cela a tout réglé avec une seule ligne.
jpro

4

dans la documentation sur Runtime

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

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

edit: mieux encore sur heroku en mode prod utilisez --save au lieu de --save-dev


Ce module s'appelle maintenant@babel/plugin-transform-runtime
Kevin Reilly

0

Si vous obtenez cette erreur dans une application angulaire, vous devez annuler le commentaire des lignes suivantes dans 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';
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.