babel配置文件也eslint类似,也有多种形式
1、babel.config.js
module.exports = function (api) {
api.cache(true);
const presets = [ ... ];
const plugins = [ ... ];
return {
presets,
plugins
};
}
2、.babelrc
{
"presets": [...],
"plugins": [...]
}
3、package.json
{
"name": "my-package",
"version": "1.0.0",
"babel": {
"presets": [ ... ],
"plugins": [ ... ],
}
}
4、babelrc.js
和.babelrc类似,但是可以写js,可以使用 Node.js APIs
const presets = [ ... ];
const plugins = [ ... ];
if (process.env["ENV"] === "prod") {
plugins.push(...);
}
module.exports = { presets, plugins };
5.Using the CLI
babel --plugins @babel/plugin-transform-arrow-functions script.js
6.Using the API
require("@babel/core").transform("code", {
plugins: ["@babel/plugin-transform-arrow-functions"]
});
BABEL7有个root目录的概念,默认是当前的工作目录,对于项目配置,babel会在root下自动查找babel.config.js。
用户可以显示使用configFile值覆盖默认的查找行为。
由于项目配置文件和配置文件的物理位置是独立的,他们可以应用的就更广泛一些,甚至允许插件和presets应用到node_modules或者系统软连接包中;
缺点是依赖于工作目录;
相对于文件的配置
babel通过查找要编译的‘filename’的目录结构加载.babelrc (and .babelrc.js / package.json#babel)文件。
这样允许为紫目录创建独立的配置。和全局的配置merge;
注意一下边缘情况:
一旦在目录中发现package.json就会停止查找
被编译的‘filename’必须在"babelrcRoots" 包里;其余的会被忽略;
警告意味着:
.babelrc 文件只能被应用到他们自己的包内;
在包里面的.babelrc 文件,但是不在root里,会被忽略,除非在"babelrcRoots"里;
.babelrc
packages/
mod1/
package.json
src/index.js
mod2/
package.json
src/index.js
config会被忽略,因为跨包了; 一种替代方案就是在每一个子包里建一个.babelrc,想下面这样;
{ "extends": "../../.babelrc" }
更好的方法是在项目里使用babel.config.js,需要显示设置configFile;
单库结构的库通常包含很多包,在使用相对文件的配置时经常会有一些警告;
单库一旦建立,核心是要理解babel把你的工作目录作为他的逻辑根目录,当你想在子包中运行babel时会遇到一些问题,
为此,首先在项目的根目录下建立一个babel.config.js文件,可以把所有的配置都放这里,然后在子文件里建立.babelrc,
使用overrides覆盖;
如果只是单独运行一个子目录,要告诉bebel去哪里找config,建议使用rootMode:upward选项,babel会向上查找babel.config.js文件;
正如root文件下需要babel.config.js,.babelrc默认也要在root package下,这表示,工作目录同时影响abel.config.js,.babelrc的加载;
package.json
babel.config.js
packages/
mod/
package.json
.babelrc
index.js
编译 packages/mod/index.js 文件不会加载packages/mod/.babelrc,因为.babelrc在子包里,不在root包下;
可以这样配置,在babel.config.js里添加:
babelrcRoots: [
".",
"packages/*",
], babel会考虑packages/*下的所有包中的.babelrc,