# 附加说明
# Polyfills
为了使某些功能起作用,它们需要某些 polyfill。您可以通过使用完整的 polyfill 来满足所有Babel 功能要求,例如core-js/actual (opens new window) or (如果您想使用标签加载它<script>
)core-js-bundle (opens new window) 。
你可以按需引入:
功能 | 需求 |
---|---|
数组解构,For Of | Symbol , prototype[Symbol.iterator] |
传播 | Array.from |
如果您正在将生成器或异步函数编译为 ES5,并且您使用的是@babel/core
或@babel/plugin-transform-regenerator
更早的版本7.18.0
,则还必须加载regenerator runtime (opens new window) 包。@babel/preset-env
使用的选项useBuiltIns: "usage"
或时会自动加载@babel/plugin-transform-runtime
。
# 内置对象 (opens new window)
Babel 假定 Polyfills 对内置对象(例如 Array
、WeakMap
等)的修改是符合规范的。
# 类(Classes) (opens new window)
内置类,例如 Date
, Array
, DOM
等,是无法正确的进行子类化的, 这是由于 ES5 的限制(针对 transform-classes
插件而言)。 你可以尝试使用基于 Object.setPrototypeOf
和 Reflect.construct
而构建的 babel-plugin-transform-builtin-extend
插件,不过仍然存在一些限制。
# ES5
由于 Babel 假定你的代码将在 ES5 环境中执行,因此使用的都是 ES5 函数。如果你所使用的运行环境
对 ES5 的支持有限或不支持,例如低版本的 IE,那么就需要使用 @babel/polyfill
来满足需求。
# IE 浏览器 (opens new window)
# 类(Classes) (版本 10 及以下) (opens new window)
如果继承自一个类(class),那么静态属性(static properties)也会通过 __proto__
一同被继承。 这种方式是被广泛支持的,但是,在很老旧的浏览器上可能会遇到问题。
**注意:**IE <= 10 不支持 __proto__
,因此静态属性(static propertie) 将不会被继承。请参考 protoToAssign
了解可用的 解决方案。
对于有 父类(super)
的类(classes),父类(super class)不能被正确解析。你可以 通过在 transform-classes
插件中开启 loose
参数来解决这个问题。
# Getters/setters (版本 8 及以下) (opens new window)
IE8 的 Object.defineProperty
只能用在 DOM 对象上。 如果你需要设置 getter 和 setter 的话,那就很悲催了。由于这些限制,
如果你打算支持 IE8 或更低版本的话,
不建议使用 getter 和 setter。
参考资料: MDN
。
# 模块(Modules) (opens new window)
默认情况下,当在 Babel 下使用模块(module)时,将导出(export)一个不可枚举的 __esModule
属性。 这是通过使用 Object.defineProperty
实现的,但是 在 IE8 及以下版本中不支持。解决方法是在相应的用于支持模块(module)的插件中开启 loose
参数。