跳至主要內容

@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"要使用的 import 屬性/斷言語法。"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」來執行 jsesc:true 以列印「\u00A9」而非「©」;
minified布林值false輸出是否要縮小
retainFunctionParens布林值false保留函式運算式周圍的括號(可用於變更引擎剖析行為)
retainLines布林值false嘗試在輸出程式碼中使用與原始碼相同的行號(有助於保留堆疊追蹤)
shouldPrintComment函式opts.comments函式,用於取得註解(字串形式),並在註解應該包含在輸出中時傳回 true。預設情況下,如果 opts.commentstrue,或如果 opts.minifiedfalse 且註解包含 @preserve@license,則會包含註解
recordAndTupleSyntaxType'hash''bar''hash'與 recordAndTuple 權杖搭配使用。
topicToken'%''#'Hack-pipe 主題參照 搭配使用的權杖。當有任何 TopicReference 節點時,這項設定是必要的。

原始碼地圖選項

名稱類型預設值說明
sourceMaps布林值false啟用產生原始碼地圖
inputSourceMap字串或物件輸入原始碼地圖
sourceRoot字串原始碼地圖中所有相對 URL 的根目錄
sourceFileName字串原始碼(即 code 引數中的程式碼)的檔案名稱。這只會在 code 為字串時使用。

來自多個來源的 AST

在多數情況下,Babel 會對輸入檔案進行 1:1 轉換為輸出檔案。但是,您可能會處理從多個來源建構的 AST,例如 JS 檔案、範本等。如果是這種情況,而且您希望原始碼對應表反映正確的來源,您需要將物件傳遞給 generate 作為 code 參數。金鑰應該是來源檔名,而值應該是來源內容。

以下是範例:

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.