"Символ" не визначено в IE після використання babel


87

У мене є reactjsпрограма, написана за стандартами ES6, і я використовую її webpackдля її створення. У webpackзавантажує jsмодулі , що використовують babel-loader. Якщо конкретно, я використовую такі версії пакетів: ├── babel@5.8.34 ├── babel-core@5.8.34 ├── babel-loader@5.4.0 └── webpack@1.12.6

Однак після його побудови IE 10 видає таку помилку 'Symbol' is undefined. Чи не babelслід передбачати визначення Symbol? Чи є якийсь - або зміни для конкретних webpackабо babelмені потрібно встановити для того , щоб змусити його працювати? Я використовую {stage: 0}конфігурацію у своєму .babelrc.

Будь-яка допомога буде вдячна, дякую!


1
Чи можете ви також додати стек-трасування?

Відповіді:


94

Ви можете зажадати polyfill у точці входу до вашого коду, щоб він був пов’язаний з рештою JavaScript.

Одним із варіантів є використання:

require('babel-polyfill');

Або:

import 'babel-polyfill';

Все це пояснюється в документації .


2
Я боровся з цією помилкою годинами! ДЯКУЮ
P.Brian.Mackey

чомусь це не працює для мене в IE10, IE11, тому я просто включаю його як окремий сценарій для IE, як згадував Юром. Я, мабуть, все одно розділив би його з мого основного пакета в webpack.
svnm

1
Привіт @Jurom та @ Lukasz, я стикаюся з тією ж проблемою, що Symbol та його функції, такі як Symbol.Iterator не визначено в IE, за допомогою цього Babel Polyfill моя сторінка не завантажується, але виникає помилка збою IE і прохання перезавантажити.
Рахул,

1
babel-polyfillвирішив цю проблему для мене. Дякую!
daveaspinall

68

Гаразд, я врешті-решт з’ясував, що babelлише поліпшення не заповнює. В тому числі сценарій <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.6.15/browser-polyfill.min.js"></script>вирішив цю проблему для мене.


4
чи є метод, за допомогою якого я можу включити цей сценарій лише в HTML, наприклад: <! - [if IE]> script (type = 'text / javascript'). require ('babel-core / browser-polyfill.js') <! [endif] ->
PinkyJie

У мене була така сама проблема в IE11, і це також вирішило це для мене. Дякую!
Waterskier19

@Jurom, Коли я додаю цей файл у свій html, мій IE виходить з ладу :-(. Будь ласка, допоможіть
Rahul

@Rahul яка версія IE? Що ви маєте на увазі під крахом? Чи можете ви надати журнал помилок?
Jurom

IE Edge. Це показує, що Internet Explorer не працює. І я не можу створити жодного журналу.
Рахул,

8

Це рішення буде працювати точно, воно працювало для мене, коли я зіткнувся з помилкою: "Символ" не визначений в IE. Раніше це працювало в Chrome і Firefox, але IE викидав цю помилку. Мені знадобилося кілька годин, щоб знайти це рішення. На даний момент я використовую останню версію React, реагуючу на "реакцію": "^ 16.5.0" на машині 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';

Проблему слід вирішити


5
Якщо ви імпортуєте Babel polyfill у своєму index.js, ви повинні встановити його як звичайну залежність, а не як залежність від розробника
Patrick Hund

Дякую! Це, здається, єдиний спосіб змусити ie11 працювати з поточним способом, яким Babel і Webpack працюють разом над компіляцією коду. Чому Babel використовує es6 Symbols для побудови модулів es5, загадкою є загадка, оскільки вона явно несумісна зі старими браузерами, а сумісність із старими браузерами є причиною існування Babel.
d13

5

Добре, у мене була та сама проблема, але в моєму випадку це було зовсім інакше, тому в основному вам потрібно включити скрипт у файл індексу, як показано нижче:

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

Але в моєму випадку я вже включив це, після деяких розслідувань я виявив, що мій проксі заблокував сценарій ...

Тож обов’язково включіть його в index.html, а також переконайтеся, що у вас є доступ до сценарію звідти, де вам це потрібно, щоб уникнути помилки ... найкращий спосіб просто скопіювати та вставити URL-адресу в браузер ...

Але тепер, коли ми дійшли до цього моменту, мова не йде про сам символ, який символ неможливо розпізнати в IE?

Функція Symbol () повертає значення символу типу, має статичні властивості, що відкривають кілька членів вбудованих об'єктів, має статичні методи, що відкривають глобальний реєстр символів, і нагадує вбудований клас об'єктів, але є неповним як конструктор, оскільки він не підтримує синтаксис "new Symbol ()".

Кожне значення символу, яке повертається із Symbol (), є унікальним. Значення символу може використовуватися як ідентифікатор властивостей об’єкта; це єдине призначення типу даних. Деякі додаткові пояснення щодо призначення та використання можна знайти в глосарії для символу.

Символ типу даних - примітивний тип даних.


1
Це також виправило це для мене. Я використав онлайн-компілятор Babel і включив цей сценарій у свій HTML, вуаля.
ViktorMS

1
я не можу повірити що ця одна лінія працює! переслідуючи поліфіли для реакції + матеріал ui протягом днів, і це фіксувало все це однією лінією.
jpro

4

в документації про час виконання

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

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

редагувати: ще краще на герою в режимі продукту використовувати --save замість --save-dev


Цей модуль зараз називається@babel/plugin-transform-runtime
Кевін Рейлі,

0

Якщо ви отримуєте цю помилку в програмі Angular, вам потрібно скасувати коментування наступних рядків у 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';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.