.babelrc
、babel.config.js
或package.json
中的babel
字段进行配置.babelrc
为例,设置最常用的presets
和plugins
两个配置项:{
"presets": [
["presetsA",{"presetsAOptions":"presetsAValue"}]
...
],
"plugins":[
["pluginsA",{"pluginsAOptions":"pluginsAValue"}]
...
]
}
@babel/plugin-transform-arrow-functions
,可以将箭头函数转化为ES5的非箭头函数,如下面代码。babel 的语法转义功能,即将目标环境无法识别的语法,转化为对应可以识别的语法,从而使一些更高级的语法功能能够在目标环境中运行。const fn = () => 1;
// converted to
var fn = function fn() {
return 1;
};
transform plugins
和syntax plugins
,transform plugins
会包含对应的syntx plugins
,它会识别并解析高级语法,并转化为目标环境能够识别的语法,比如上面箭头函数的例子。syntx plugins
只能够使 babel 能够解析对应语法,但并不能转化他们。transform plugins
列表可见:https://babeljs.io/docs/en/plugins我们也可以自定义plugin,来转化我们想转化的语法。可以参考:
babel 会按照配置文件中指定的 plugins 和 preset 来转化代码,plugins 和 preset 的执行顺序如下:
@babel/polyfill模块中包含了core-js
和一个自定义的regenerator runtime
来模拟 ES2015以上的 JavaScript 允许环境。它可以帮助你 polyfill 一些 ES2015及以上的功能,比如内建的Promise
、WeakMap
,静态方法Array.from
、实例方法Array.prototype.includes
,以及生成器函数。
注意,因为 polyfill 是需要在生成环境被使用的,所以需要按照npm install --save @babel/polyfill
的方式进行安装
使用方式:
// 整体引入
require("@babel/polyfill");
// 通过 webpack 的方式整体引入
module.exports = {
entry: ["@babel/polyfill", "./app/js"],
};
// 引入特定模块
require("core-js/modules/es.promise.finally");
@babel/preset-env
引入,见下面对@babel/preset-env
的介绍。@babel/plugin-transform-runtime
引入,这种引入方式能够做到不影响全局变量,但是以这种方式引入后,无法引用实例方法,比如Array.prototype.includes
useBuiltIns:"usage"
后,babel 会探测你代码中使用到的,但是目标环境中缺失的功能,并引入对应的这个 polyfill,而不是整个 polyfill 文件。从而减少包的体积。@babel/preset-env
会将代码的指定目标运行环境,通过一些数据源对应为在目标环境中运行相应代码所需要的语法及功能,然后将这些语法和功能对应为对应所需的插件和 polyfill,从而通过这些插件和 polyfill,将代码转化为可以在目标环境中允许的代码.browserlistrc
指定代码的目标运行环境,.browserlistrc
的配置方式可以参考browserlist项目,如果没有找到.browserlistrc
文件,则会使用默认配置通过@babel/preset-env
可以引入@babel/polyfill
:
useBuiltIns: 'usage'
后,不需要再显性require
或import
@babel/polyfill
。但是注意@babel/polyfill
还是需要被安装。设置后,babel 会在需要时,独引用@babel/polyfill
的特定 polyfill,而不是整个polyfill@babel/polyfill
会造成一些不可预知的问题。如果指定useBuiltIns: 'entry'
,任需在使用到的地方手动通过通过require
或import
@babel/polyfill
,但是它会将所有的 import "@babel/polyfill"
或 require("@babel/polyfill")
根据环境,转化为一个单独的引入。useBuiltIns
未被指定或被显性指定为 false,则需要在手动显性引入@babel/polyfill
_extend
,这些工具函数基本上会在每个文件中被使用到,导致在每个文件中,都需要去定义这些工具函数。而@babel/plugin-transform-runtime
会使所有的工具函数都去引用@babel/runtime
,这样就避免了不断去重复定义这些工具函数。@babel/polyfill
,它会提供一些类似Promise
、Set
的功能,这些功能的实现会污染全局环境,当你需要发布某个库时,这就会成为一个问题。这个插件可以解决这个问题,具体可见:https://babeljs.io/docs/en/babel-plugin-transform-runtime#technical-details。npm install --save-dev @babel/plugin-transform-runtime
@babel/runtime
作为npm install --save @babel/runtime
polyfill
参数,此时,通过@babel/plugin-transform-runtime
引入 polyfill 的方式是,在配置文件中指定corejs
为2,并采用@babel/runtime-corejs2
。{
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"corejs":2
}
]
],
}
npm install --save @babel/runtime-corejs2
"foobar".includes("foo")
@babel/plugin-transform-runtime
中,参数regenerator
可以指定是否转化生成器函数,指定为 true(默认也是 true)时,可以转化async
和await
@babel/preset-stage-x
,相关信息可以在去除Babel 的Stage Presets这篇文章中获取到@babel/preset-stage-x
使很多用户能干哟用上一些 proposal 的功能的同时,让大家误以为这些 proposal 的功能就是标准,最后造成了一些迁移以及处理上的麻烦,所以在babel7中将 stage 的 preset 去除了