-
Notifications
You must be signed in to change notification settings - Fork 34
Description
先简述一下 babel-polyfill 与 transform-runtime 是做什么的。
目前浏览器对 ES2015 语法的支持都不太好,所以当我们需要使用 Promise
、Set
、Map
等功能时就需要 babel-polyfill 来提供。
在转换 ES2015 语法为 ECMAScript 5 的语法时,babel 会需要一些辅助函数,例如 _extend
。babel 默认会将这些辅助函数内联到每一个 js 文件里,这样文件多的时候,项目就会很大。
所以 babel 提供了 transform-runtime 来将这些辅助函数“搬”到一个单独的模块 babel-runtime 中,这样做能减小项目文件的大小。
今天我在写一个针对 Chrome 浏览器的项目的时候,使用了 transform-runtime,但没有用 babel-polyfill,因为很多 ES2015 的功能(比如 Promise
)Chrome 都已经支持了。可是文件经过 babel 转换之后,文件大小陡增,仔细一看,发现 babel 把 Promise
的 polyfill 给注入进来了。
因为我没有使用 babel-polyfill,所以我本来认为,babel 应该是不会给我注入任何 polyfill 的,但事与愿违。我查看了一下 babel-runtime,发现除了包含 babel 转换时需要用到的辅助函数外,它还包含了 corejs 与 regenerator——而 babel-polyfill 也包含了这两个模块。
当我查阅 transform-runtime 的文档时,才发现 transform-runtime 是可以配置的:
// with options
{
"plugins": [
["transform-runtime", {
"polyfill": false,
"regenerator": true
}]
]
}
由此可见,当我们在配置里直接使用 "plugins": ["transform-runtime"]
时,其实就相当于引入了 babel-polyfill。
这可能并不是我们想要的。