Babel kullanıldıktan sonra IE'de 'sembol' tanımsız


87

reactjsES6 standartları kullanılarak yazılmış bir uygulamam var ve onu webpackoluşturmak için kullanıyorum. webpackYükleri jskullanarak modülleri babel-loader. Spesifik olmak gerekirse, aşağıdaki paket sürümlerini kullanıyorum: ├── babel@5.8.34 ├── babel-core@5.8.34 ├── babel-loader@5.4.0 └── webpack@1.12.6

Ancak, onu oluşturduktan sonra, IE 10 aşağıdaki hatayı veriyor 'Symbol' is undefined. 'Nin babeltanımlaması gerekmiyor Symbolmu? Çalışması için belirli bir yapılandırma var mı webpackveya babelayarlamam gerekiyor mu? {stage: 0}Yapılandırmasını kullanıyorum .babelrc.

Herhangi bir yardım memnuniyetle karşılanacaktır, teşekkür ederim!


1
Bir yığın izi de ekleyebilir misiniz?

Yanıtlar:


94

Kodunuzun giriş noktasında çoklu doldurmayı zorunlu kılabilirsiniz, böylece JavaScript'in geri kalanıyla birlikte gelir.

Bir seçenek kullanmaktır:

require('babel-polyfill');

Veya:

import 'babel-polyfill';

Bunların tümü belgelerde açıklanmıştır .


2
Bu böcekle saatlerdir savaşıyordum! TEŞEKKÜRLER
P. Brian.Mackey

Bazı nedenlerden dolayı bu benim için IE10, IE11'de çalışmıyor, bu yüzden onu Jurom tarafından belirtildiği gibi IE için ayrı bir komut dosyası olarak ekliyorum. Muhtemelen zaten web paketindeki ana paketimden ayırırdım.
svnm

1
Merhaba @Jurom ve @ Lukasz, Symbol ve Symbol gibi işlevleriyle aynı sorunla karşı karşıyayım. Yineleyici IE'de tanımsızdır, bu Babel Polyfill'i kullanarak sayfam yüklenmiyor ancak IE'nin çökmesi ve sorması nedeniyle bir hata geliyor Tekrar yükle.
Rahul

1
babel-polyfillbu sorunu benim için düzeltti. Teşekkür ederim!
daveaspinall

Bu benim için Angular 10'da işe yaradı, ancak yalnızca import "@babel/polyfill"; ifade daha import 'zone.js/dist/zone';önceyse (bu mantıklı çünkü aldığım Symbol hatası zone.js'den geliyordu)
ewolfman

68

Tamam, sonunda babeltek başına polyfill yapmadığını öğrendim . Komut dosyası dahil etmek <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.6.15/browser-polyfill.min.js"></script>bu sorunu benim için çözdü.


4
Bu komut dosyasını yalnızca HTML'de dahil edebileceğim bir yöntem var mı: <! - [if IE]> script (type = 'text / javascript').
required

IE11'de de aynı sorunu yaşadım ve bu benim için de düzeltildi. Teşekkürler!
Waterskier19

@Jurom, Bu dosyayı html'ime eklediğimde IE'm çöküyor :-(. Lütfen yardım edin
Rahul

@Rahul IE'nin hangi versiyonu? Çarpma ile ne demek istiyorsun? Hata günlüğünü sağlayabilir misiniz?
Jurom

IE Edge. Internet Explorer'ın çalışmadığını gösterir. Ve herhangi bir günlük oluşturamıyorum.
Rahul

8

Bu çözüm kesinlikle işe yarayacak, hatayla karşılaştığımda benim için çalıştı: 'Sembol' IE'de tanımsız. Daha önce Chrome ve Firefox'ta çalıştı ama IE bu hatayı atıyordu.Bu çözümü bulmam birkaç saatimi aldı. Şu anda Windows makinesinde "react": "^ 16.5.0" tepkisini en son React'i kullanıyorum.

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';

Sorun çözülmeli


5
Babel çoklu dolgusunu index.js'ye içe aktarırsanız, bunu bir dev bağımlılığı olarak değil, normal bir bağımlılık olarak yüklemelisiniz
Patrick Hund

Teşekkür ederim! Bu, ie11'in Babel ve Webpack'in kod derlemek için birlikte çalıştığı mevcut yöntemle çalışmasını sağlamanın tek yolu gibi görünüyor. Babel'in es5 modüllerini oluşturmak için neden es6 Sembollerini kullandığı ilk etapta bir gizemdir, çünkü eski tarayıcılarla açıkça uyumsuzdur ve Babel'in var olma nedeni eski tarayıcılarla uyumluluktur.
d13

5

Tamam, ben de aynı sorunu yaşadım, ancak benim durumumda oldukça farklıydı, bu nedenle temelde aşağıdaki gibi indeks dosyasına komut dosyası eklemeniz gerekiyor:

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

Ama benim durumumda bunu zaten ekledim, bazı araştırmalardan sonra proxy'min komut dosyasını engellediğini öğrendim ...

Yani emin olun size index.html içinde yer alıyor ve ayrıca emin olmak iyi yolu sadece kopyalamak ... sen oluyor hatayı önlemek için ihtiyaç duyduğunuz yerden komut dosyasına erişimi olduğunu ve tarayıcıda url yapıştırın ...

Ama şimdi bu noktaya geldiğimizde, Sembol'ün kendisinden bahsetmiyor, IE'de tanınamayan Sembol nedir?

Symbol () işlevi, sembol türü bir değer döndürür, yerleşik nesnelerin birkaç üyesini ortaya çıkaran statik özelliklere sahiptir, global sembol kaydını açığa çıkaran statik yöntemlere sahiptir ve yerleşik bir nesne sınıfına benzer, ancak bir yapıcı olarak eksiktir, çünkü "new Symbol ()" sözdizimini desteklemez.

Symbol () 'den döndürülen her sembol değeri benzersizdir. Nesne özellikleri için bir tanımlayıcı olarak bir sembol değeri kullanılabilir; bu, veri türünün tek amacıdır. Amaç ve kullanım hakkında daha fazla açıklama Sembol için sözlük girişinde bulunabilir.

Veri türü sembolü, ilkel bir veri türüdür.


1
Bu benim için de düzeltti. Babel çevrimiçi derleyicisini kullandım ve bu komut dosyasını HTML'me ekledim, işte.
ViktorMS

1
Bu satırın işe yaradığına inanamıyorum! günlerce react + material ui için polyfilllerin peşinde koştu ve bu, hepsini tek bir çizgiyle düzeltti.
jpro

4

Runtime ile ilgili belgelerde

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

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

düzenleme: daha da iyisi heroku'da prod modunda --save-dev yerine --save kullanın


Bu modül artık@babel/plugin-transform-runtime
Kevin Reilly,

0

Bu hatayı bir Angular uygulamasında alıyorsanız, polyfills.ts'de aşağıdaki satırların açıklamasını kaldırmanız gerekir -

/** 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';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.