如何在多个文件上运行 babel 的babylon.parse

Ska*_*Ska 4 babeljs

我可以加载一个文件并用 babel 遍历它,它是这样的:

var babylon = require("babylon");
let contents = fs.readFileSync("example.js","utf-8");
let ast = babylon.parse(contents);
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如果我的程序中有多个文件,如何获取 AST(抽象语法树)。

main.js

export const getFoo(){
  return "a"
}
Run Code Online (Sandbox Code Playgroud)

示例.js

import {getFoo} from './main'
let bar = getFoo() + "baz";
Run Code Online (Sandbox Code Playgroud)

显然我希望看到函数声明和函数调用表达式进入同一个 AST,但同时也获取行号和列 (node.loc) 信息以显示特定文件。

Den*_*Den 5

如果您知道多个文件的路径并且可以加载它们,则可以连接多个文件中的 AST。

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

const a = 'var a = 1;'; // or fs.readFileSync("a.js","utf-8");
const b = 'var b = 2;'; // or fs.readFileSync("b.js","utf-8");
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)
};
Run Code Online (Sandbox Code Playgroud)

来源示例

但我不知道如何从多个文件中获取 AST,而不直接加载它们。我尝试编写一个 babel 插件来分析导入文件中的代码,但我还没有意识到如何做到这一点。