„Symbol” jest niezdefiniowany w IE po użyciu babel

87

Mam reactjsaplikację napisaną przy użyciu standardów ES6 i używam webpackdo jej tworzenia. Te webpackładunki z jsmodułów używających babel-loader. Mówiąc konkretnie, używam następujących wersji pakietów: ├── [email protected] ├── [email protected] ├── [email protected] └── [email protected]

Jednak po zbudowaniu IE 10 wyświetla następujący błąd 'Symbol' is undefined. Czy nie powinien babelpowinien określać Symbol? Czy jest jakaś konkretna konfiguracja webpacklub babelmuszę ją ustawić, aby działała? Używam {stage: 0}konfiguracji w moim .babelrc.

Każda pomoc byłaby doceniona, dziękuję!

Jurom
źródło
1
Czy możesz dodać również ślad stosu?

Odpowiedzi:

94

Możesz wymagać wypełnienia polyfill w punkcie wejścia do kodu, aby został powiązany z resztą JavaScript.

Jedną z opcji jest użycie:

require('babel-polyfill');

Lub:

import 'babel-polyfill';

Wszystko to jest wyjaśnione w dokumentacji .

Łukasz
źródło
2
Walczyłem z tym błędem przez wiele godzin! DZIĘKUJĘ
P.Brian.Mackey
z jakiegoś powodu to nie działa dla mnie w IE10, IE11, więc dołączam go jako oddzielny skrypt dla IE, jak wspomniał Jurom. Prawdopodobnie i tak oddzieliłbym go od mojego głównego pakietu w pakiecie webpack.
svnm
1
Cześć @Jurom i @ Łukasz, mam ten sam problem, co Symbol i jego funkcje, takie jak Symbol. Iterator jest niezdefiniowany w IE, używając tego Babel Polyfill moja strona nie ładuje się, ale pojawia się błąd z awarią IE i pytaniem o przeładować.
Rahul
1
babel-polyfillnaprawiłem ten problem dla mnie. Dziękuję Ci!
daveaspinall
68

Ok, w końcu odkryłem, że babelsam nie ma polyfillu. Dołączenie skryptu <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.6.15/browser-polyfill.min.js"></script>rozwiązało ten problem za mnie.

Jurom
źródło
4
czy istnieje metoda, którą mogę włączyć tylko do tego skryptu w HTML, na przykład: <! - [jeśli IE]> skrypt (type = 'text / javascript'). require ('babel-core / browser-polyfill.js') <! [endif] ->
PinkyJie
Miałem ten sam problem w IE11 i to też go rozwiązało. Dzięki!
Waterskier19
@Jurom, Kiedy dodam ten plik do mojego html, mój IE przestaje działać :-(. Proszę o pomoc
Rahul
@Rahul jaka wersja IE? Co masz na myśli mówiąc o wypadku? Czy możesz podać dziennik błędów?
Jurom
IE Edge. Pokazuje, że Internet Explorer nie działa. I nie mogę wygenerować żadnego dziennika.
Rahul
8

To rozwiązanie na pewno zadziała, zadziałało, gdy napotkałem błąd: „Symbol” nie jest zdefiniowany w IE. Wcześniej działało w Chrome i Firefox, ale IE wyrzucał ten błąd. Znalezienie tego rozwiązania zajęło mi kilka godzin. Używam najnowszego Reacta w tej chwili reaguj "reaguj": "^ 16.5.0" na komputerze z systemem 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';

Problem powinien zostać rozwiązany

Kiran Chaudhari
źródło
5
Jeśli zaimportujesz wypełnienie Babel do pliku index.js, musisz zainstalować go jako zwykłą zależność, a nie zależność dev
Patrick Hund
Dziękuję Ci! Wydaje się, że jest to jedyny sposób, aby ie11 działał z obecnym sposobem, w jaki Babel i Webpack współpracują przy kompilacji kodu. Dlaczego Babel używa symboli es6 do budowania modułów es5 w pierwszej kolejności, jest tajemnicą, ponieważ jest wyraźnie niezgodny ze starszymi przeglądarkami, a zgodność ze starszymi przeglądarkami jest przyczyną istnienia Babel.
d13
5

OK, miałem ten sam problem, ale w moim przypadku było to zupełnie inne, więc w zasadzie musisz dołączyć skrypt do pliku indeksu, jak poniżej:

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

Ale w moim przypadku już to uwzględniłem, po kilku dochodzeniach okazało się, że mój serwer proxy zablokował skrypt ...

Więc upewnij się , że umieścisz go w index.html, a także upewnij się, że masz dostęp do skryptu z miejsca, w którym go potrzebujesz, aby uniknąć błędu ... najlepiej po prostu skopiuj i wklej adres URL w przeglądarce ...

Ale teraz, kiedy dochodzimy do tego punktu, nie mówimy o samym symbolu, co to jest symbol, którego nie można rozpoznać w IE?

Funkcja Symbol () zwraca wartość typu symbol, ma statyczne właściwości, które uwidaczniają kilka elementów członkowskich wbudowanych obiektów, ma statyczne metody, które ujawniają globalny rejestr symboli i przypomina wbudowaną klasę obiektów, ale jest niekompletna jako konstruktor, ponieważ nie obsługuje składni „nowy Symbol ()”.

Każda wartość symbolu zwrócona przez Symbol () jest unikalna. Wartość symbolu może służyć jako identyfikator właściwości obiektu; jest to jedyny cel tego typu danych. Dalsze wyjaśnienia dotyczące celu i zastosowania można znaleźć w słowniczku dotyczącym symbolu.

Symbol typu danych to prymitywny typ danych.

Alireza
źródło
1
To również naprawiło to dla mnie. Użyłem kompilatora online Babel i umieściłem ten skrypt w moim HTML, voila.
ViktorMS,
1
Nie mogę uwierzyć, że ta jedna linia działa! gonienie polyfillów dla interfejsu reaguj + materiał przez kilka dni, a to naprawiło to wszystko za pomocą jednej linii.
jpro
4

w dokumentacji o Runtime

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

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

edit: jeszcze lepiej na heroku w trybie prod użyj --save zamiast --save-dev

Jacek Pietal
źródło
Ten moduł nazywa się teraz@babel/plugin-transform-runtime
Kevin Reilly
0

Jeśli otrzymujesz ten błąd w aplikacji Angular, musisz usunąć komentarz z następujących wierszy w pliku 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
źródło