注意事项
Polyfill
为了使某些功能正常工作,它们需要某些 polyfill。您可以使用完整的 polyfill 来满足**所有** Babel 功能要求,例如 core-js/actual
或(如果您想使用 <script>
标签加载它)core-js-bundle
。
您也可以选择性地包含您需要的内容
功能 | 要求 |
---|---|
数组解构,For Of | Symbol ,prototype[Symbol.iterator] |
展开运算符 | Array.from |
如果您正在将生成器或异步函数编译为 ES5,并且您使用的 @babel/core
或 @babel/plugin-transform-regenerator
版本低于 7.18.0
,则还必须加载 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__ 从它继承,这得到了广泛的支持,但您可能会在非常旧的浏览器中遇到问题。
**注意:**IE ≤ 10 不支持 __proto__
,因此**不会**继承静态属性。有关可能的解决方法,请参阅 protoToAssign。
对于具有 super
的类,超级类将无法正确解析。您可以通过在 transform-classes 插件中启用 loose
选项来解决此问题。
Getter/setter(8 及以下版本)
在 IE8 中,Object.defineProperty
只能用于 DOM 对象。这很不幸,因为需要它来设置 getter 和 setter。因此,如果您计划支持 IE8 或更低版本,则不建议使用 getter 和 setter。
**参考:**MDN。
模块
默认情况下,在 Babel 中使用模块时,会导出一个不可枚举的 __esModule
属性。这是通过使用 IE8 及更低版本不支持的 Object.defineProperty
完成的。解决此问题的方法是在相应的模块插件中启用 loose
选项。