注意事項
Polyfills
為了讓某些功能運作,它們需要某些 polyfills。你可以使用完整的 polyfill(例如 core-js/actual
或(如果你想使用 <script>
標籤載入)core-js-bundle
)來滿足 Babel 所有功能需求。
你也可以選擇性地包含你需要的部分
功能 | 需求 |
---|---|
陣列解構、For Of | Symbol 、prototype[Symbol.iterator] |
展開 | Array.from |
如果您正在將產生器或非同步函數編譯到 ES5,並且您使用的是早於 7.18.0
的 @babel/core
或 @babel/plugin-transform-regenerator
版本,您還必須載入 regenerator runtime
套件。使用 @babel/preset-env
的 useBuiltIns: "usage"
選項或 @babel/plugin-transform-runtime
時,它會自動載入。
內建
Babel 假設內建(例如 Array
、WeakMap
等),如果已進行 polyfill,則會以符合規範的方式進行修改。
類別
由於 ES5 的限制(適用於 transform-classes 外掛程式),內建類別(例如 Date
、Array
、DOM
等)無法正確地進行子類別化。您可以嘗試使用基於 Object.setPrototypeOf
和 Reflect.construct
的 babel-plugin-transform-builtin-extend,但它也有一些限制。
ES5
由於 Babel 假設您的程式碼將在 ES5 環境中執行,因此它使用 ES5 函數。因此,如果您使用的是對 ES5 支援有限或不支援的環境,例如較低版本的 IE,則使用 @babel/polyfill 將會新增對這些方法的支援。
Internet Explorer
類別(10 及以下版本)
如果您繼承自一個類別,則靜態屬性會透過 __proto__ 從該類別繼承,這獲得廣泛支援,但您可能會在較舊的瀏覽器中遇到問題。
注意: __proto__
在 IE ≤ 10 中不受支援,因此靜態屬性不會被繼承。請參閱 protoToAssign 以取得可能的解決方法。
對於具有 super
的類別,父類別無法正確解析。你可以透過在 transform-classes 外掛程式中啟用 loose
選項來解決此問題。
Getter/setter(8 及以下版本)
在 IE8 中,Object.defineProperty
只能用於 DOM 物件。這很不幸,因為設定 getter 和 setter 需要用到它。因此,如果你計畫支援 IE8 或以下版本,則不建議使用 getter 和 setter。
參考: MDN。
模組
預設情況下,在使用 Babel 搭配模組時,會匯出不可列舉的 __esModule
屬性。這是透過使用 Object.defineProperty
來完成的,而 IE8 及以下版本不支援此功能。解決此問題的方法是在對應的模組外掛程式中啟用 loose
選項。