babel工具之@babel/generator(翻译)

3,228 阅读2分钟

安装

npm install --save-dev @babel/generator

使用

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

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

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

选项

格式化输出的选项:

auxiliaryCommentBefore

type:string

default:

description:作为块注释添加到输出文件开头的可选字符串

auxiliaryCommentAfter

type:string

default:

description:在文件的结尾添加可选的字符串作为注释

shouldPrintComment

type:function

default:opts.comments

description:函数,该函数接受注释(作为字符串)并在输出中包含注释时返回true。默认情况下,注释是被包含的。如果opts.comments:true 或者opts.minified:false,并且注释包含@preserve或@license

retainLines

type:boolean

default:false

description:尝试在输出代码中使用与源代码相同的行号(有助于保留堆栈跟踪)

retainFunctionParens

type:boolean

default:false

description:保留函数表达式周围的parens(可用于更改引擎解析行为)

comments

type:boolean

default:true

description:输出中是否应包含注释

compact

type:boolean or 'auto'

default:opts.minified

description:设置为true以避免为格式添加空白

minified

type:boolean

default:false

description:应该缩小输出吗

concise

type:boolean

default:false

description:设置为true以减少空白(但不如选择紧凑型)

filename

type:string

default:

description:用于警告消息

jsonCompatibleStrings

type:boolean

default:false

description:设置为true以使用“json”运行jsesc:true将打印“\u00A9”vs。

源映射的选项:

sourceMaps

type:boolean

default:false

description:启用生成源映射

sourceRoot

type:string

default:

description:源映射中所有相对URL的根

sourceFileName

type:string

default:

description:源代码的文件名(即code参数中的代码)。仅当代码是字符串时才使用此选项。

来自多个来源的AST

在大多数情况下,Babel会将输入文件转换为输出文件。但是,您可能正在处理由多个源(JS文件、模板等)构造的AST。如果是这种情况,并且您希望sourcemap反映正确的源,则需要传递一个要生成的对象作为代码参数。键应该是源文件名,值应该是源内容。

下面是一个可能的示例:

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将在适当的地方同时指向a.js和b.js。