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

标签 babeljs

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

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

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

main.js

export const getFoo(){
  return "a"
}

example.js

import {getFoo} from './main'
let bar = getFoo() + "baz";

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

最佳答案

如果您知道多个文件的路径并且可以加载它们,则可以连接多个文件的 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)
};

Source example

但是我不知道如何在不直接加载的情况下从多个文件中获取 AST。我尝试编写一个 babel 插件来分析导入文件中的代码,但我还没有意识到该怎么做。

关于babeljs - 如何在多个文件上运行 babel 的 babylon.parse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54827900/

相关文章:

babeljs - 为什么 "transform-es2015-modules-commonjs"在 Babel 6 中要加上 "use strict"?

reactjs - Babel 命令行不转译 import 语句 - React

ecmascript-6 - babel 仅在单引号而不是双引号中转换 es6 模板字符串

reactjs - 节点模块问题 : Only one default export allowed per module

javascript - 使用 React 和 webpack 4 拆分项目; html 标签是意外的标记

javascript - 模块构建失败 : Error: Couldn't find preset "transform-class-properties" relative to directory

javascript - 无法使用 babel-loader 编译符号链接(symbolic link)包的 TypeScript

javascript - @babel/register 中忽略的正确正则表达式模式是什么

babeljs - babel@7 和 jest 配置