跳至主要内容

@babel/generator

将 AST 转换为代码。

安装

npm install --save-dev @babel/generator

用法

JavaScript
import { parse } from "@babel/parser";
import generate from "@babel/generator";

const code = "class Example {}";
const ast = parse(code);

const output = generate(
ast,
{
/* options */
},
code
);
信息

空格或换行符等符号不会保留在 AST 中。当 Babel 生成器从 AST 打印代码时,不能保证输出格式。

选项

历史记录
版本更改
v7.22.0添加了 importAttributesKeyword
v7.21.0添加了 inputSourceMap

用于格式化输出的选项

名称类型默认值描述
auxiliaryCommentAfter字符串可选字符串,作为块注释添加到输出文件末尾
auxiliaryCommentBefore字符串可选字符串,作为块注释添加到输出文件开头
comments布尔值true是否应在输出中包含注释
compact布尔值或 'auto'opts.minified设置为 true 以避免添加空格进行格式化
concise布尔值false设置为 true 以减少空格(但不如 opts.compact 多)
decoratorsBeforeExport布尔值设置为 true 以在输出中打印 export 之前的装饰器。
filename字符串用于警告消息
importAttributesKeyword"with""assert""with-legacy"要使用的导入属性/断言语法。"with" 用于 import "..." with { type: "json" }"assert" 用于 import "..." assert { type: "json" }"with-legacy" 用于 import "..." with type: "json"。如果未指定,@babel/generator 将尝试根据 AST 形状匹配输入代码中的样式。
jsescOption对象使用 jsesc 处理字面量。仅当存在 jsescOption.numbers(在 v7.9.0 中添加)时,jsesc 才应用于数字。您可以通过传递选项来自定义 jsesc
jsonCompatibleStrings布尔值false设置为 true 以使用 "json": true 运行 jsesc 以打印 "\u00A9" 而不是 "©";
minified布尔值false输出是否应缩小
retainFunctionParens布尔值false保留函数表达式周围的括号(可用于更改引擎解析行为)
retainLines布尔值false尝试在输出代码中使用与源代码相同的行号(有助于保留堆栈跟踪)
shouldPrintComment函数opts.comments接受注释(作为字符串)并返回 true 的函数,如果注释应包含在输出中。默认情况下,如果 opts.commentstrueopts.minifiedfalse 并且注释包含 @preserve@license,则包含注释
recordAndTupleSyntaxType'hash''bar''hash'与 recordAndTuple 标记一起使用。
topicToken'%''#'Hack-pipe 主题引用一起使用的标记。当存在任何 TopicReference 节点时,这是必需的。

用于源映射的选项

名称类型默认值描述
sourceMaps布尔值false启用生成源映射
inputSourceMap字符串或对象输入源映射
sourceRoot字符串源映射中所有相对 URL 的根目录
sourceFileName字符串源代码的文件名(即 code 参数中的代码)。仅当 code 是字符串时才使用此选项。

来自多个源的 AST

在大多数情况下,Babel 对输入文件和输出文件进行 1:1 的转换。但是,您可能正在处理从多个源(JS 文件、模板等)构造的 AST。在这种情况下,如果您希望源映射反映正确的源,则需要将一个对象作为 code 参数传递给 generate。键应该是源文件名,值应该是源内容。

以下是一个示例,说明它可能是什么样子

JavaScript
import { parse } from "@babel/parser";
import generate from "@babel/generator";

const a = "var a = 1;";
const b = "var b = 2;";
const astA = parse(a, { sourceFilename: "a.js" });
const astB = parse(b, { sourceFilename: "b.js" });
const ast = {
type: "Program",
body: [].concat(astA.program.body, astB.program.body),
};

const { code, map } = generate(
ast,
{ sourceMaps: true },
{
"a.js": a,
"b.js": b,
}
);

// Sourcemap will point to both a.js and b.js where appropriate.