跳至主要内容

选项

可以通过多种方式将选项传递给 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 标识自己,并传递与功能相关的标志以供配置、预设和插件使用。例如

JavaScript
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 的默认返回值包括 codemap 属性,以及生成的代码。在某些上下文中,需要多次调用 Babel,禁用代码生成并使用 ast: true 直接获取 AST 可能会有所帮助,以避免执行不必要的工作。

ast

类型:boolean
默认值:false

Babel 的默认设置是生成一个字符串和一个源映射,但在某些情况下,获取 AST 本身可能很有用。这种情况下的主要用例是多个转换过程的链,类似于

JavaScript
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 项目的概念根文件夹。这在两种主要情况下使用

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" 是默认模式,因为它避免了 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 设置可能希望执行

JavaScript
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 兼容的查询(带有注意事项

babel.config.json
{
"targets": "> 0.25%, not dead"
}

或者是要支持的最低环境版本的 对象

babel.config.json
{
"targets": {
"chrome": "58",
"ie": "11"
}
}

支持的环境: androidchromedenoedgeelectronfirefoxieiosnodeoperarhinosafarisamsung

如果未指定次要版本,Babel 会将其解释为 MAJOR.0。例如,"node": 12 将被视为 Node.js 12.0。

无目标

当未指定目标时:Babel 将假定您的目标是尽可能旧的浏览器。例如,@babel/preset-env 会将所有 ES2015-ES2020 代码转换为与 ES5 兼容。

提示

我们建议设置 targets 以减少输出代码大小。

babel.config.json
{
"presets": ["@babel/preset-env"]
}

因此,Babel 的行为与 browserslist 不同:当在您的 Babel *或* browserslist 配置中找不到任何目标时,它*不会*使用 defaults 查询。如果要使用 defaults 查询,则需要将其作为目标显式传递

babel.config.json
{
"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 目标时,它们将相交。
babel.config.json
{
"targets": {
"esmodules": true
}
}

targets.node

类型: string | "current" | true

如果要针对当前节点版本进行编译,可以指定 "node": true"node": "current",这与 "node": process.versions.node 相同。

或者,您可以在 browserslist 查询中指定节点版本

babel.config.json
{
"targets": "node 12" // not recommended
}

在这种情况下,browserslist 会将其解析为 node-releases 库中可用的*最新*版本。由于 Node.js 可能会在次要版本中支持新的语言功能,因此为 Node.js 12.22 生成的程序可能会在 Node.js 12.0 上引发语法错误。我们建议您在将节点查询与 browserslist 一起使用时始终指定次要版本

babel.config.json
{
"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。

babel.config.json
{
"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 块中。

允许使用整个嵌套配置选项,这些选项仅在 envKeyenvName 选项匹配时才启用。

注意:env[envKey] 选项将在根对象中指定的选项之上合并

overrides

类型: Array<Options>
位置:不能嵌套在另一个 overrides 对象中,也不能在 env 块中。

允许用户提供一个选项数组,这些选项将一次一个地合并到当前配置中。此功能最好与 "test"/"include"/"exclude" 选项一起使用,以提供应应用覆盖的条件。例如

JavaScript
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 将立即停止当前构建的所有处理。例如,用户可能想要执行以下操作

JavaScript
ignore: ["./lib"];

以显式禁用 lib 目录中文件的 Babel 编译。

注意:此选项禁用文件的*所有* Babel 处理。虽然这有其用途,但也值得考虑将 "exclude" 选项作为不那么激进的替代方案。

only

类型: Array<MatchPattern> (MatchPattern)
位置:不允许在预设内部使用

如果所有模式都无法匹配,Babel 将立即停止当前构建的所有处理。例如,用户可能想要执行以下操作

JavaScript
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 可以做出的假设,以便生成更小的输出

babel.config.json
{
"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 的顶级调用指定的当前 envNamecaller 选项,以及 dirname,它是配置文件的目录或当前工作目录(如果转换是以编程方式调用的)。

合并

请参阅Babel 如何合并配置项

插件/预设条目

PluginEntry / PresetEntry

单个插件/预设项可以具有几种不同的结构

  • EntryTarget - 单个插件
  • [EntryTarget, EntryOptions] - 带有选项的单个插件
  • [EntryTarget, EntryOptions, string] - 带有选项和名称的单个插件(有关名称的更多信息,请参阅合并
  • ConfigItem - 由 babel.createConfigItem() 创建的插件配置项。

除非每个 EntryTarget 都被赋予不同的名称,否则同一个 EntryTarget 可以使用多次,这样做会导致重复插件/预设错误。

这可能有点难读,所以举个例子

JavaScript
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 表示条目被完全禁用。这在顺序很重要但需要单独的条件来决定是否启用某些内容的情况下很有用。例如

JavaScript
plugins: [
'one',
['two', false],
'three',
],
overrides: [{
test: "./src",
plugins: [
'two',
]
}]

将为 src 中的文件启用 two 插件,但 two 仍然会在 onethree 之间执行。

名称规范化

默认情况下,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"