选项
可以通过多种方式将选项传递给 Babel。当直接传递给 Babel 时,您可以只传递选项对象。当通过包装器使用 Babel 时,也可能需要,或者至少更有用,通过配置文件传递选项。
如果通过 @babel/cli
传递选项,您需要将名称转换为 kebab-case
。例如
npx babel --root-mode upward file.js # equivalent of passing the rootMode config option
主要选项
这些选项仅允许作为 Babel 程序化选项的一部分,因此它们主要供包装 Babel 的工具或直接调用 babel.transform
的人使用。Babel 集成的用户,如 babel-loader
或 @babel/register
不太可能使用这些。
cwd
类型:string
默认值:process.cwd()
程序化选项中的所有路径都将解析为相对于该工作目录的路径。
caller
类型:具有以下形状的对象
interface CallerData {
name: string;
supportsStaticESM?: boolean;
supportsDynamicImport?: boolean;
supportsTopLevelAwait?: boolean;
supportsExportNamespaceFrom?: boolean;
}
历史记录
版本 | 更改 |
---|---|
v7.11.0 | 添加 supportsExportNamespaceFrom |
v7.7.0 | 添加 supportsTopLevelAwait |
v7.5.0 | 添加 supportsDynamicImport |
实用程序可以传递 caller
对象以向 Babel 标识自己,并传递与功能相关的标志以供配置、预设和插件使用。例如
babel.transformFileSync("example.js", {
caller: {
name: "my-custom-tool",
supportsStaticESM: true,
},
});
将允许插件和预设决定,由于支持 ES 模块,因此它们将跳过将 ES 模块编译为 CommonJS 模块。
filename
类型:string
与当前正在编译的代码关联的文件名(如果有)。文件名是可选的,但当文件名未知时,并非所有 Babel 功能都可用,因为一部分选项的功能依赖于文件名。
用户可能遇到的三种主要情况是
- 文件名会暴露给插件。某些插件可能需要文件名。
- 像
"test"
、"exclude"
和"ignore"
这样的选项需要文件名进行字符串/正则表达式匹配。 .babelrc.json
或.babelrc
文件是相对于正在编译的文件加载的。如果省略此选项,Babel 的行为将类似于已设置babelrc: false
。
filenameRelative
类型:string
默认值:path.relative(opts.cwd, opts.filename)
(如果传递了 "filename"
)
用作 Babel sourceFileName
选项的默认值,并用作 AMD / UMD / SystemJS 模块转换生成文件名的一部分。
code
类型:boolean
默认值:true
Babel 的默认返回值包括 code
和 map
属性,以及生成的代码。在某些上下文中,需要多次调用 Babel,禁用代码生成并使用 ast: true
直接获取 AST 可能会有所帮助,以避免执行不必要的工作。
ast
类型:boolean
默认值:false
Babel 的默认设置是生成一个字符串和一个源映射,但在某些情况下,获取 AST 本身可能很有用。这种情况下的主要用例是多个转换过程的链,类似于
const filename = "example.js";
const source = fs.readFileSync(filename, "utf8");
// Load and compile file normally, but skip code generation.
const { ast } = babel.transformSync(source, {
filename,
ast: true,
code: false,
});
// Minify the file in a second pass and generate the output code here.
const { code, map } = babel.transformFromAstSync(ast, source, {
filename,
presets: ["minify"],
babelrc: false,
configFile: false,
});
注意:默认情况下不启用此选项,因为大多数用户不需要它,并且我们希望最终为 Babel 添加缓存层。缓存 AST 结构将占用更多空间。
cloneInputAst
类型:boolean
默认值:true
在 v7.11.0
中添加
默认情况下,babel.transformFromAst
将克隆输入 AST 以避免突变。如果不在其他地方使用输入 AST,则指定 cloneInputAst: false
可以提高解析性能。
配置加载选项
加载配置可能会变得有点复杂,因为环境可以有多种类型的配置文件,并且这些配置文件可以具有根据配置应用的各种嵌套配置对象。
root
类型:string
默认值:opts.cwd
位置:仅允许在 Babel 的程序化选项中使用
将根据 "rootMode"
处理的初始路径,以确定当前 Babel 项目的概念根文件夹。这在两种主要情况下使用
- 检查默认
"configFile"
值时的基目录 "babelrcRoots"
的默认值。
rootMode
类型:"root" | "upward" | "upward-optional"
默认值:"root"
位置:仅允许在 Babel 的程序化选项中使用
添加于:v7.1.0
此选项与 "root"
值一起定义了 Babel 如何选择其项目根目录。不同的模式定义了 Babel 处理 "root"
值以获取最终项目根目录的不同方式。
注意:从 Babel 7.8.0 开始支持 babel.config.json
。在较旧的 Babel 7 版本中,仅支持 babel.config.js
。
"root"
- 按原样传递"root"
值。"upward"
- 从"root"
目录向上遍历,查找包含babel.config.json
文件的目录,如果未找到babel.config.json
,则抛出错误。"upward-optional"
- 从"root"
目录向上遍历,查找包含babel.config.json
文件的目录,如果未找到babel.config.json
,则回退到"root"
。
"root"
是默认模式,因为它避免了 Babel 意外加载完全位于当前项目文件夹之外的 babel.config.json
的风险。如果您使用 "upward-optional"
,请注意它将向上遍历目录结构一直到文件系统根目录,并且始终有可能有人在其主目录中有一个被遗忘的 babel.config.json
,这可能会导致您的构建出现意外错误。
具有 monorepo 项目结构的用户(在每个包的基础上运行构建/测试)可能希望使用 "upward"
,因为 monorepo 通常在项目根目录中有一个 babel.config.json
。在没有 "upward"
的情况下在 monorepo 子目录中运行 Babel 将导致 Babel 跳过加载项目根目录中的任何 babel.config.json
文件,这可能会导致意外错误和编译失败。
envName
类型:string
默认值:process.env.BABEL_ENV || process.env.NODE_ENV || "development"
位置:仅允许在 Babel 的程序化选项中使用
配置加载期间使用的当前活动环境。此值在解析 "env"
配置时用作键,并且还可以通过 api.env()
函数在配置函数、插件和预设中使用。
configFile
类型:string | boolean
默认值:path.resolve(opts.root, "babel.config.json")
(如果存在),否则为 false
位置:仅允许在 Babel 的程序化选项中使用
默认情况下,将搜索默认的 babel.config.json
文件,但可以传递任何 JS 或 JSON5 配置文件的路径。
注意:此选项*不*影响 .babelrc.json
文件的加载,因此虽然可能很想执行 configFile: "./foo/.babelrc.json"
,但不建议这样做。如果通过标准文件相对逻辑加载给定的 .babelrc.json
,您最终将加载两次相同的配置文件,并将其与其自身合并。如果您要链接特定的配置文件,建议您坚持使用独立于“babelrc”名称的命名方案。
babelrc
类型:boolean
默认值:只要指定了 filename
选项,则为 true
位置:允许在 Babel 的程序化选项中或已加载的 "configFile"
中使用。程序化选项将覆盖配置文件中的选项。
true
将启用搜索相对于提供给 Babel 的 "filename"
的配置文件和旧版 .babelignore
文件。
在程序化选项中传递的 babelrc
值将覆盖配置文件中设置的值。
注意:仅当当前 "filename"
位于与 "babelrcRoots"
包之一匹配的包中时,才会加载 .babelrc.json
文件。
babelrcRoots
类型:boolean | MatchPattern | Array<MatchPattern>
默认值:opts.root
位置:允许在 Babel 的程序化选项中或已加载的 configFile
中使用。程序化选项将覆盖配置文件中的选项。
默认情况下,Babel 只会在 "root"
包中搜索 .babelrc.json
文件,因为否则 Babel 无法知道是否应该加载给定的 .babelrc.json
,或者是否甚至安装了它的 "plugins"
和 "presets"
,因为正在编译的文件可能位于 node_modules
中,或者已符号链接到项目中。
此选项允许用户提供其他包的列表,在考虑是否加载 .babelrc.json
文件时,应将这些包视为“根”包。
例如,希望允许单个包具有自己的配置的 monorepo 设置可能希望执行
babelrcRoots: [
// Keep the root as a root
".",
// Also consider monorepo packages "root" and load their .babelrc.json files.
"./packages/*",
];
插件和预设选项
plugins
类型: Array<PluginEntry | Plugin>
(PluginEntry
)
默认值: []
一个插件数组,用于在处理此文件时激活。有关各个条目如何交互的更多信息,尤其是在多个嵌套的 "env"
和 "overrides"
配置中使用时,请参阅合并。
注意:该选项也允许来自 Babel 本身的 Plugin
实例,但不建议直接使用它们。如果需要创建插件或预设的持久表示形式,则应使用 babel.createConfigItem()
。
presets
类型: Array<PresetEntry>
(PresetEntry
)
默认值: []
一个预设数组,用于在处理此文件时激活。有关各个条目如何交互的更多信息,尤其是在多个嵌套的 "env"
和 "overrides"
配置中使用时,请参阅合并。
注意:预设的格式与插件相同,只是名称规范化期望使用“preset-”而不是“plugin-”,并且预设不能是 Plugin
的实例。
passPerPreset
类型:boolean
默认值:false
状态:*已弃用*
指示 Babel 将 presets
数组中的每个预设作为独立的传递运行。此选项往往会在插件的确切顺序方面造成很多混乱,但如果您绝对需要将一组操作作为独立的编译传递运行,则此选项会很有用。
注意:此选项可能会在未来的 Babel 版本中删除,因为我们将为定义插件之间的顺序添加更好的支持。
输出目标
targets
类型: string | Array<string> | { [string]: string }
默认值: {}
位置:允许在 Babel 的编程选项或配置文件中使用
添加于: v7.13.0
历史记录
版本 | 更改 |
---|---|
v7.20.0 | 支持 deno 目标 |
v7.15.0 | 支持 rhino 目标 |
描述您为项目支持/目标的环境。
这可以是与 browserslist 兼容的查询(带有注意事项)
{
"targets": "> 0.25%, not dead"
}
或者是要支持的最低环境版本的 对象
{
"targets": {
"chrome": "58",
"ie": "11"
}
}
支持的环境: android
、chrome
、deno
、edge
、electron
、firefox
、ie
、ios
、node
、opera
、rhino
、safari
、samsung
。
如果未指定次要版本,Babel 会将其解释为 MAJOR.0
。例如,"node": 12
将被视为 Node.js 12.0。
无目标
当未指定目标时:Babel 将假定您的目标是尽可能旧的浏览器。例如,@babel/preset-env
会将所有 ES2015-ES2020 代码转换为与 ES5 兼容。
我们建议设置 targets
以减少输出代码大小。
{
"presets": ["@babel/preset-env"]
}
因此,Babel 的行为与 browserslist 不同:当在您的 Babel *或* browserslist 配置中找不到任何目标时,它*不会*使用 defaults
查询。如果要使用 defaults
查询,则需要将其作为目标显式传递
{
"targets": "defaults"
}
我们认识到这并不理想,并将在 Babel v8 中重新审视这一点。
:::
targets.esmodules
类型:boolean
您还可以将支持 ES 模块的浏览器作为目标。指定 esmodules
目标时,它将与 browsers
目标和 browserslist
的目标相交。您可以将此方法与 <script type="module"></script>
结合使用,以有条件地向用户提供更小的脚本(https://jakearchibald.com/2017/es-modules-in-browsers/#nomodule-for-backwards-compatibility)。
browsers
和 esmodules 目标时,它们将相交。{
"targets": {
"esmodules": true
}
}
targets.node
类型: string | "current" | true
。
如果要针对当前节点版本进行编译,可以指定 "node": true
或 "node": "current"
,这与 "node": process.versions.node
相同。
或者,您可以在 browserslist 查询中指定节点版本
{
"targets": "node 12" // not recommended
}
在这种情况下,browserslist 会将其解析为 node-releases
库中可用的*最新*版本。由于 Node.js 可能会在次要版本中支持新的语言功能,因此为 Node.js 12.22 生成的程序可能会在 Node.js 12.0 上引发语法错误。我们建议您在将节点查询与 browserslist 一起使用时始终指定次要版本
{
"targets": "node 12.0"
}
targets.safari
类型: string | "tp"
。
如果要针对 Safari 的技术预览版进行编译,可以指定 "safari": "tp"
。
targets.browsers
类型: string | Array<string>
。
使用 browserslist选择浏览器的查询(例如:最后 2 个版本,> 5%,safari tp)。
注意,浏览器的结果会被 targets
中的显式项覆盖。
targets.deno
类型: string
。
最低支持版本为 1.0。
{
"targets": {
"deno": "1.9"
}
}
browserslistConfigFile
类型:boolean
默认值:true
位置:允许在 Babel 的编程选项或配置文件中使用
添加于: v7.13.0
切换是否使用 browserslist 配置源,包括搜索任何 browserslist 文件或引用 package.json 中的 browserslist 键。这对于使用 browserslist 配置文件的项目很有用,这些文件不会使用 Babel 进行编译。
如果指定了字符串,则它必须表示 browserslist 配置文件的路径。相对路径是相对于指定此选项的配置文件解析的,或者当它作为编程选项的一部分传递时相对于 cwd
解析。
browserslistEnv
类型:string
默认值: undefined
位置:允许在 Babel 的编程选项或配置文件中使用
添加于: v7.13.0
要使用的 Browserslist 环境。
配置合并选项
extends
类型:string
位置:不允许在预设内部使用
配置可以“扩展”其他配置文件。当前配置中的配置字段将在扩展文件的配置之上合并。
env
类型: { [envKey: string]: Options }
位置:不能嵌套在另一个 env
块中。
允许使用整个嵌套配置选项,这些选项仅在 envKey
与 envName
选项匹配时才启用。
注意:env[envKey]
选项将在根对象中指定的选项之上合并。
overrides
类型: Array<Options>
位置:不能嵌套在另一个 overrides
对象中,也不能在 env
块中。
允许用户提供一个选项数组,这些选项将一次一个地合并到当前配置中。此功能最好与 "test"
/"include"
/"exclude"
选项一起使用,以提供应应用覆盖的条件。例如
overrides: [{
test: "./vendor/large.min.js",
compact: true,
}],
可用于为已知较大且已缩小的一个特定文件启用 compact
选项,并告诉 Babel 不要费心尝试漂亮地打印该文件。
test
类型: MatchPattern | Array<MatchPattern>
(MatchPattern
)
如果所有模式都无法匹配,则当前配置对象被视为无效,并在配置处理期间被忽略。此选项在 overrides
选项对象中使用时最有用,但它在任何地方都允许使用。
注意:这些切换不会影响前面部分中的编程和配置加载选项,因为它们在为合并准备配置之前很久就会被考虑在内。
include
类型: MatchPattern | Array<MatchPattern>
(MatchPattern
)
此选项是 "test"
的同义词。
exclude
类型: MatchPattern | Array<MatchPattern>
(MatchPattern
)
如果任何模式匹配,则当前配置对象被视为无效,并在配置处理期间被忽略。此选项在 overrides
选项对象中使用时最有用,但它在任何地方都允许使用。
注意:这些切换不会影响前面部分中的编程和配置加载选项,因为它们在为合并准备配置之前很久就会被考虑在内。
ignore
类型: Array<MatchPattern>
(MatchPattern
)
位置:不允许在预设内部使用
如果任何模式匹配,Babel 将立即停止当前构建的所有处理。例如,用户可能想要执行以下操作
ignore: ["./lib"];
以显式禁用 lib
目录中文件的 Babel 编译。
注意:此选项禁用文件的*所有* Babel 处理。虽然这有其用途,但也值得考虑将 "exclude"
选项作为不那么激进的替代方案。
only
类型: Array<MatchPattern>
(MatchPattern
)
位置:不允许在预设内部使用
如果所有模式都无法匹配,Babel 将立即停止当前构建的所有处理。例如,用户可能想要执行以下操作
only: ["./src"];
以显式启用 src
目录中文件的 Babel 编译,同时禁用其他所有内容。
注意:此选项禁用文件的*所有* Babel 处理。虽然这有其用途,但也值得考虑将 "test"
/"include"
选项作为不那么激进的替代方案。
源映射选项
inputSourceMap
类型:boolean | SourceMap
默认值:true
true
将尝试从文件本身加载输入源映射,如果它包含 //# sourceMappingURL=...
注释。如果未找到映射,或者映射加载和解析失败,它将被静默丢弃。
如果提供了一个对象,它将被视为源映射对象本身。
sourceMaps
类型:boolean | "inline" | "both"
默认值:false
true
为代码生成源映射并将其包含在结果对象中。"inline"
生成源映射并将其作为数据 URL 附加到代码的末尾,但不包含在结果对象中。"both"
与inline
相同,但会将映射包含在结果对象中。
@babel/cli
重载了其中一些选项,也会影响映射写入磁盘的方式
true
会将映射写入磁盘上的.map
文件"inline"
会直接写入文件,因此它将包含一个包含映射的data:
"both"
会使用data:
URL 写入文件,并且还会写入一个.map
文件。
注意:这些选项有点奇怪,因此最合理的做法可能是只使用 true
,然后根据您的用例在您自己的代码中处理其余部分。
sourceMap
这是 sourceMaps
的同义词。建议使用 sourceMaps
。
sourceFileName
类型:string
默认值:如果可用,则为 path.basename(opts.filenameRelative)
,否则为 "unknown"
用于源映射对象内部文件的名称。
sourceRoot
类型:string
如果需要,要在生成的源映射中设置的 sourceRoot
字段。
其他选项
sourceType
类型:"script" | "module" | "unambiguous"
默认值:"module"
"script"
- 使用 ECMAScript 脚本语法解析文件。不允许使用import
/export
语句,并且文件不处于严格模式。"module"
- 使用 ECMAScript 模块语法解析文件。文件自动处于严格模式,并且允许使用import
/export
语句。"unambiguous"
- 如果存在import
/export
语句,则将文件视为“模块”,否则将其视为“脚本”。
当类型未知时,unambiguous
非常有用,但它可能会导致错误匹配,因为模块文件不使用 import
/export
语句是完全有效的。
此选项很重要,因为当前文件的类型会影响输入文件的解析,以及某些可能希望向当前文件添加 import
/require
使用的转换。
例如,@babel/plugin-transform-runtime
依赖于当前文档的类型来决定是插入 import
声明还是 require()
调用。@babel/preset-env
也对其 "useBuiltIns"
选项执行相同的操作。由于 Babel 默认将文件视为 ES 模块,因此通常这些插件/预设会插入 import
语句。设置正确的 sourceType
可能很重要,因为错误的类型可能会导致 Babel 将 import
语句插入到应该是 CommonJS 文件的文件中。这在执行 node_modules
依赖项编译的项目中尤其重要,因为插入 import
语句会导致 Webpack 和其他工具将文件视为 ES 模块,从而破坏原本可以正常工作的 CommonJS 文件。
注意:此选项不会影响 .mjs
文件的解析,因为它们当前硬编码为始终解析为 "module"
文件。
assumptions
类型:{ [assumption: string]: boolean }
默认值: {}
添加于: v7.13.0
位置:允许在编程选项、配置文件和预设中使用。
设置 Babel 可以做出的假设,以便生成更小的输出
{
"assumptions": {
"iterableIsArray": true
},
"presets": ["@babel/preset-env"]
}
有关更多信息,请查看假设文档页面。
highlightCode
类型:boolean
默认值:true
突出显示 Babel 错误消息中代码片段中的标记,以便于阅读。
wrapPluginVisitorMethod
类型:(key: string, nodeType: string, fn: Function) => Function
允许用户在每个访问器上添加一个包装器,以便在 Babel 执行插件时检查访问器过程。
key
是一个简单的非透明字符串,表示正在执行的插件。nodeType
是当前正在访问的 AST 节点的类型。fn
是访问器函数本身。
用户可以返回一个替换函数,该函数应在执行完他们希望执行的任何日志记录和分析后调用原始函数。
parserOpts
类型:{}
一个包含要传递给正在使用的解析器的选项的不透明对象。
有关可用的解析器选项,请参阅解析器选项。
generatorOpts
类型:{}
一个包含要传递给正在使用的代码生成器的选项的不透明对象。有关最常用的选项,请参阅代码生成器选项。
代码生成器选项
retainLines
类型:boolean
默认值:false
Babel 将尽力生成代码,使项目打印在与原始文件中相同的行上。此选项的存在是为了让无法使用源映射的用户能够获得大致有用的错误行号,但这只是一个尽力而为的操作,不能保证在所有情况下对所有插件都有效。
compact
类型:boolean | "auto"
默认值:"auto"
“auto”将通过评估 code.length > 500_000
来设置值
在紧凑模式下生成代码时,将省略所有可选的换行符和空格。
minified
类型:boolean
默认值:false
包括 compact: true
,省略块结束分号,在可能的情况下从 new Foo()
中省略 ()
,并且可能会输出更短版本的字面量。
auxiliaryCommentBefore
类型:string
允许指定在原始文件中不存在的代码片段之前插入的前缀注释。
注意:原始文件中存在和不存在的内容的定义可能会有点混乱,因此*不建议*使用此选项。如果您需要以某种方式注释代码,最好使用 Babel 插件来完成。
auxiliaryCommentAfter
类型:string
允许指定在原始文件中不存在的代码片段之后插入的前缀注释。
注意:原始文件中存在和不存在的内容的定义可能会有点混乱,因此*不建议*使用此选项。如果您需要以某种方式注释代码,最好使用 Babel 插件来完成。
comments
类型:boolean
默认值:true
如果未给出函数,则为 shouldPrintComment
提供默认注释状态。有关更多信息,请参阅该选项的默认值。
shouldPrintComment
类型:(value: string) => boolean
没有 minified
时的默认值:(val) => opts.comments || /@license|@preserve/.test(val)
使用 minified
时的默认值:() => opts.comments
一个函数,可以决定是否应在 Babel 的输出代码中包含给定的注释。
高级用法
有关更多代码生成器选项,请参阅生成器选项。
AMD / UMD / SystemJS 模块选项
moduleIds
类型:boolean
默认值:!!opts.moduleId
启用模块 ID 生成。
moduleId
类型:string
要用于模块的硬编码 ID。不能与 getModuleId
一起使用。
getModuleId
类型:(name: string) => string
给定 babel 生成的模块名称,返回要使用的名称。返回虚值将使用原始的 name
。
moduleRoot
类型:string
要包含在生成的模块名称中的根路径。
选项概念
MatchPattern
类型:string | RegExp | (filename: string | void, context: { caller: { name: string } | void, envName: string, dirname: string ) => boolean
一些 Babel 选项对文件路径执行测试。通常,这些选项支持一种通用的模式方法,其中每种模式可以是
string
- 一个文件路径,简单支持*
和**
作为完整段匹配。任何匹配该模式的文件或父文件夹都算作匹配。该路径遵循 Node 的常规路径逻辑,因此在 POSIX 上必须以/
分隔,但在 Windows 上同时支持/
和\
。RegExp
- 要与规范化文件名匹配的正则表达式。在 POSIX 上,路径 RegExp 将针对以/
分隔的路径运行,而在 Windows 上,它将针对以\
分隔的路径运行。
重要的是,如果使用其中任何一个,Babel 都要求存在 filename
选项,否则会将其视为错误。
(filename: string | void, context: { caller: { name: string } | void, envName: string, dirname: string }) => boolean
是一个通用回调,它应该返回一个布尔值以指示它是否匹配。如果未向 Babel 提供文件名,则该函数将传递文件名或undefined
。它还传递了由对 Babel 的顶级调用指定的当前envName
和caller
选项,以及dirname
,它是配置文件的目录或当前工作目录(如果转换是以编程方式调用的)。
合并
请参阅Babel 如何合并配置项。
插件/预设条目
PluginEntry
/ PresetEntry
单个插件/预设项可以具有几种不同的结构
EntryTarget
- 单个插件[EntryTarget, EntryOptions]
- 带有选项的单个插件[EntryTarget, EntryOptions, string]
- 带有选项和名称的单个插件(有关名称的更多信息,请参阅合并)ConfigItem
- 由babel.createConfigItem()
创建的插件配置项。
除非每个 EntryTarget
都被赋予不同的名称,否则同一个 EntryTarget
可以使用多次,这样做会导致重复插件/预设错误。
这可能有点难读,所以举个例子
plugins: [
// EntryTarget
'@babel/plugin-transform-classes',
// [EntryTarget, EntryOptions]
['@babel/plugin-transform-arrow-functions', { spec: true }],
// [EntryTarget, EntryOptions, string]
['@babel/plugin-transform-for-of', { loose: true }, "some-name"],
// ConfigItem
babel.createConfigItem(require("@babel/plugin-transform-spread")),
],
EntryTarget
类型: string | {} | Function
插件/预设目标可以来自几个不同的来源
string
-require
风格的路径或插件/预设标识符。标识符将通过名称规范化。{} | Function
-require()
后的实际插件/预设对象或函数。
EntryOptions
类型: undefined | {} | false
选项在执行时会传递给每个插件/预设。undefined
将被规范化为一个空对象。
false
表示条目被完全禁用。这在顺序很重要但需要单独的条件来决定是否启用某些内容的情况下很有用。例如
plugins: [
'one',
['two', false],
'three',
],
overrides: [{
test: "./src",
plugins: [
'two',
]
}]
将为 src
中的文件启用 two
插件,但 two
仍然会在 one
和 three
之间执行。
名称规范化
默认情况下,Babel 期望插件在其名称中带有 babel-plugin-
或 babel-preset-
前缀。为了避免重复,Babel 有一个名称规范化阶段,将在加载项目时自动添加这些前缀。这可以归结为几个主要规则
- 绝对路径保持不变。
- 以
./
开头的相对路径保持不变。 - 对包内文件的引用保持不变。
- 任何以
module:
为前缀的标识符都将删除前缀,但其他方面保持不变。 - 对于任何没有
plugin-
/preset-
前缀的@babel
范围内的包,将在其名称开头注入plugin-
/preset-
。 - 对于任何没有
babel-plugin-
/babel-preset-
前缀的非范围包,将在其名称开头注入babel-plugin-
/babel-preset-
。 - 对于任何在其名称中任何位置都没有
babel-plugin-
/babel-preset-
前缀的@
范围内的包,将在其名称开头注入babel-plugin-
/babel-preset-
。 - 如果只给出
@
范围名称,则将babel-plugin
/babel-preset
注入包名称。
以下是一些在插件上下文中应用的示例
输入 | 规范化 |
---|---|
"/dir/plugin.js" | "/dir/plugin.js" |
"./dir/plugin.js" | "./dir/plugin.js" |
"mod" | "babel-plugin-mod" |
"mod/plugin" | "mod/plugin" |
"babel-plugin-mod" | "babel-plugin-mod" |
"@babel/mod" | "@babel/plugin-mod" |
"@babel/plugin-mod" | "@babel/plugin-mod" |
"@babel/mod/plugin" | "@babel/mod/plugin" |
"@scope" | "@scope/babel-plugin" |
"@scope/babel-plugin" | "@scope/babel-plugin" |
"@scope/mod" | "@scope/babel-plugin-mod" |
"@scope/babel-plugin-mod" | "@scope/babel-plugin-mod" |
"@scope/prefix-babel-plugin-mod" | "@scope/prefix-babel-plugin-mod" |
"@scope/mod/plugin" | "@scope/mod/plugin" |
"module:foo" | "foo" |