附加说明
Polyfills
In order for certain features to work they require certain polyfills. You can satisfy all
Babel feature requirements by using a complete polyfill such as core-js/actual or (if you want to load it using a <script> tag) core-js-bundle.
你可以按需引入:
| 功能 | 需求 |
|---|---|
| Array destructuring, For Of | Symbol, prototype[Symbol.iterator] |
| Spread | Array.from |
If you are compiling generators or async function to ES5, and you are using a version of @babel/core or @babel/plugin-transform-regenerator older than 7.18.0, you must also load the regenerator runtime package. It is automatically loaded when using @babel/preset-env's useBuiltIns: "usage" option or @babel/plugin-transform-runtime.
内置对象
Babel 假定 Polyfills 对内置对象(例如 Array、WeakMap 等)的修改是符合规范的。
类(Classes)
内置类,例如 Date, Array, DOM 等,是无法正确的进行子类化的,
这是由于 ES5 的限制(针对 transform-classes 插件而言)。
你可以尝试使用基于 Object.setPrototypeOf 和 Reflect.construct 而构建的 babel-plugin-transform-builtin-extend 插件,不过仍然存在一些限制。
ES5
由于 Babel 假定你的代码将在 ES5 环境中执行,因此使用的都是 ES5 函数。如果你所使用的运行环境 对 ES5 的支持有限或不支持,例如低版本的 IE,那么就需要使用 @babel/polyfill 来满足需求。
IE 浏览器
类(Classes) (版本 10 及以下)
如果继承自一个类(class),那么静态属性(static properties)也会通过 __proto__ 一同被继承。 这种方式是被广泛支持的,但是,在很老旧的浏览器上可能会遇到问题。
注意: IE ≤ 10 的版本不支持 __proto__,因此静态属性(static propertie)
将不会被 继承。请参考
protoToAssign 以了解可用的
解决方案。
对于有 父类(super) 的类(classes),父类(super class)不能被正确解析。你可以
通过在 transform-classes 插件中开启 loose 参数来解决这个问题。
Getters/setters (版本 8 及以下)
IE8 的 Object.defineProperty 只能用在 DOM 对象上。
如果你需要设置 getter 和 setter 的话,那就很悲催了。由于这些限制,
如果你打算支持 IE8 或更低版本的话,
不建议使用 getter 和 setter。
参考资料: MDN。
模块(Modules)
默认情况下,当在 Babel 下使用模块(module)时,将导出(export)一个不可枚举的 __esModule 属性。
这是通过使用 Object.defineProperty 实现的,但是
在 IE8 及以下版本中不支持。解决方法是在相应的用于支持模块(module)的插件中开启 loose 参数。