babel config 翻译

配置文件

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"]
});

Project-wide配置

BABEL7有个root目录的概念,默认是当前的工作目录,对于项目配置,babel会在root下自动查找babel.config.js。
用户可以显示使用configFile值覆盖默认的查找行为。
由于项目配置文件和配置文件的物理位置是独立的,他们可以应用的就更广泛一些,甚至允许插件和presets应用到node_modules或者系统软连接包中;
缺点是依赖于工作目录;

相对于文件的配置

File-relative配置

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;

Monorepos

单库结构的库通常包含很多包,在使用相对文件的配置时经常会有一些警告;
单库一旦建立,核心是要理解babel把你的工作目录作为他的逻辑根目录,当你想在子包中运行babel时会遇到一些问题,
为此,首先在项目的根目录下建立一个babel.config.js文件,可以把所有的配置都放这里,然后在子文件里建立.babelrc,
使用overrides覆盖;

如果只是单独运行一个子目录,要告诉bebel去哪里找config,建议使用rootMode:upward选项,babel会向上查找babel.config.js文件;

子包里的babelrc文件

正如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,