我正在使用jscodesshift。
我的目标是获得项目中特定模块的所有导入的计数
import { Circle, Triangle, Rectangle } from 'geometry';
在搜索结果
{ Circle: 1, Triangle: 1, Rectangle: 1 }
我已经达到了我想要的但唯一的问题是,我希望这些统计数据用于整个项目,而不是单个文件。
知道我怎么才能做到这一点吗?
恐怕你用错工具了。顾名思义,jscodesshift是一个修改的工具。通过分析和转换ast,它可以在文件级别上工作。换句话说,它意味着一个一个地修改文件,而不是静态地分析代码库。
链接中显示的内容实际上是使用jscodesshift所依赖的解析器和AST树漫步器(节点访问器)来聚合统计信息。为了实现你的目标,你需要编写一个nodeJS脚本,使用glob
工具来查找所有的js文件,一个解析器来分析每个文件(例如acorn
或@babel/parser
在jscodesshift中默认使用),以及一个匹配的walker (acorn-walk
或@babel/traverse
)来查找节点并将其添加到统计数据中。以下是使用glob
,@babel/parser
和@babel/traverse
的示例(仅作为示例,我没有运行代码)
import * as glob from 'glob';
import * as fs from 'node:fs';
import * as parser from '@babel/parser';
import traverse from '@babel/traverse';
glob('**/*.js', {}, (err, files) => {
if (err) {
// handle error
}
files.forEach(file => {
const code = fs.readFileSync(file, 'utf-8');
const ast = parser.parse(code, {
sourceType: 'module'
});
traverse(ast, {
ImportDeclaration (path) {
// handle your statistics
}
});
});
});
不确定我是否正确理解这一点,您是否试图从模块内导入一切,而无需显式键入其名称(圆,三角等)?或者这可能会有所帮助:
export const Foo = 1;
export const Bar = 2;
// geometry2.js|ts
export const Biz = 3;
// index.js|ts
import * as counts from './geometry';
import * as counts2 from './geometry2';
const data = { ...counts, ...counts2 };
console.log(data); // logs {Foo: 1, Bar: 2, Biz: 3}