获取项目中模块中所有导入的计数



我正在使用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}

最新更新