需要在 AST 上执行一些转换,使其具有标准化的结构,并确保输出的代码始终遵循一致的格式。以下是一个示例:
const babel = require("@babel/core");
const code = `const foo = (a, b) => a + b;`;
// 使用 Babel/Parser 生成 AST
const ast = babel.parse(code);
// 执行标准化的转换
babel.traverse(ast, {
ArrowFunctionExpression(path) {
const { params, body } = path.node;
// 确保只有一个参数,加上括号
if (params.length !== 1) return;
if (params[0].type !== "Identifier") return;
path.node.params = [babel.types.ObjectPattern([babel.types.objectProperty(params[0], params[0], false, true)])];
// 确保是返回语句,加上括号
if (body.type !== "BinaryExpression") return;
path.node.body = babel.types.BlockStatement([babel.types.returnStatement(body)]);
},
});
// 使用 Babel/Generator 输出
const result = babel.generate(ast, { retainLines: true });
console.log(result.code);
// 输出:const foo = ({ a } = {}, { b } = {}) => { return a + b; };
这个示例展示了如何将箭头函数的参数转换为解构对象,以及将函数体转换为块级语句和返回语句。使用标准化的转换后,再使用 Babel/Generator 输出的代码始终保持一致。