[关闭]
@Dale-Lin 2022-09-19T21:23:41.000000Z 字数 3032 阅读 344

babel.config.js

Babel


babel.config.js 文件导出一个配置对象或者一个返回配置对象的函数:

  1. module.exports = {
  2. presets: [
  3. '@babel/preset-typescript',
  4. ['@babel/preset-env', { modules: false }]
  5. ],
  6. plugins: ["@babel/plugin-transform-runtime"]
  7. }

导出函数接受 api 对象:

  1. module.exports = (api) => {
  2. api.cache(true)
  3. return {
  4. presets: [
  5. "@babel/preset-env"
  6. ],
  7. plugins: [
  8. ['@babel/plugin-proposal-optional-chaining', { loose: false }],
  9. '@babel/plugin-transform-runtime'
  10. ],
  11. env: {
  12. test: {
  13. presets: [
  14. "@babel/preset-env"
  15. ],
  16. plugins: [
  17. ['@babel/plugin-proposal-optional-chaining', { loose: false }],
  18. '@babel/plugin-transform-runtime',
  19. 'dynamic-import-node'
  20. ]
  21. }
  22. }
  23. }
  24. }

babel-loader 和 @babel/cli 都会读这个配置

api

api.version

当前使用的 babel 版本字符串

api.cache

babel.config.js 的好处是每次执行都动态返回一个配置,缺点是 babel 每次执行编译都需要重新执行插件/预设的函数;
api.cache 设计用来解决这个问题

using 回调必须没有副作用,返回值应该是最小范围的依赖

api.env(...)

检测 babel 环境配置的 envName,默认是 process.env.BABEL_ENV || process.env.NODE_ENV || 'development'

api.env 内部会使用 api.cache 来保证 babel 基于指定的 envName 来构建,所以不能和 api.cache.forever()api.cache.never() 同时使用。

  1. module.exports = (api) => {
  2. api.assertVersion("^7.2")
  3. return {
  4. // ...
  5. }
  6. }

presets

presets 是一组 babel 预设的插件,例如 @babel/preset-env / @babel/preset-typescript / @babel/preset-react

presets 的执行顺序是从后往前,所以通常 @babel/preset-env 会放在第一位。

targets

targets 描述项目支持的运行环境:

  1. {
  2. "targets": {
  3. "chrome": "58",
  4. "ie": "11"
  5. }
  6. }

支持的环境标签有:android, chrome, edge, electron, firefox, ie, ios, node, opera, safari

没有指定 targets 的时候,Babel 会假设需要支持最老的浏览器。

targets.esmodules

esmodules 选项表示脚本需要在支持 esmodule 规范的浏览器里运行,Babel 会和 targets 的其他环境互取交集,可以用这个来生产支持 <script type="module"></script> 的轻量级脚本。

  1. {
  2. "esmodule": true
  3. }

extends

继承另一个配置文件。

babel merge

babel 合并配置的规则:不是 undefined 的配置项会被替换,以下除外:

例如:

  1. {
  2. sourceType: "script",
  3. assumptions: {
  4. setClassFields: true,
  5. iterableIsArray: false
  6. },
  7. env: {
  8. test: {
  9. sourceType: "module",
  10. assumptions: {
  11. iterableIsArray: true,
  12. },
  13. }
  14. }
  15. };

NODE_ENVtest 时的结果:

  1. {
  2. sourceType: "module",
  3. assumptions: {
  4. setClassFields: true,
  5. interableIsArray: t rue
  6. }
  7. }

例如:

  1. plugins: [
  2. './other',
  3. ['./plug', { thing: true, field1: true }]
  4. ],
  5. overrides: [{
  6. plugins: [
  7. ['./plug', { thing: false }
  8. ]
  9. }]

由于插件 ./plug 的 id 一致且没有指定 name,所以会被替换:

  1. plugins: [
  2. './other',
  3. ['./plug', { thing: false }]
  4. ]

id 和 name 只要有一个不同就可以同时存在:

  1. plugins: [
  2. ['./plug', { one: true }, "first-instance-name"],
  3. ['./plug', { two: true }, "second-instance-name"
  4. ]

env

一个由 envName-config 键值对组成的对象,当 envName 匹配上时会 merge 对应的配置

overrides

一个配置数组,会在某些时刻合并进当前的配置中,可以用 "test" / "include" / "exclude" 来指定合并时机:

  1. overrides: [{
  2. test: './vendor/large.min.js',
  3. compact: true
  4. }]

test

当前配置生效的匹配方式,通常在 overrides 里使用

include

相当于 test

exclude

在匹配成功时当前配置会失效,通常在 overrides 里使用

ignore

匹配成功时会停止当前的构建过程,例如:

  1. ignore: ["./lib"]

only

只有在匹配成功时才会继续构建过程,例如:

  1. only: ['./src']

moduleIds

是否生成 module ID

getModuleId

(name: string) => string 根据 babel 生成的模块名称返回自定义的名称

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注