如何程序化查找从moduleA导入MyClass的TypeScript模块?
可行的解决方案
1. 配置 dependency-cruiser 实现精准检测
dependency-cruiser 其实支持通过自定义规则定位具体导入的成员,你之前可能没用到这个功能。在项目根目录创建或修改 .dependency-cruiser.js 配置文件,添加专门检测导入 moduleA 中 MyClass 的规则:
module.exports = { rules: { "detect-myclass-imports": { severity: "info", match: { path: ".+\\.(js|ts)$", // 匹配你的源码文件后缀,可按需调整 import: { module: "^moduleA$", name: "^MyClass$" } }, message: "该模块从 moduleA 导入了 MyClass" } } };
运行检测命令:
dependency-cruise --config .dependency-cruiser.js src/
执行后会列出所有导入了 MyClass 的模块路径。
2. 使用 find-imports 工具
find-imports 是专门查找项目导入语句的npm包,可精准定位导入特定成员的文件。
先安装依赖:
npm install --save-dev find-imports
运行扫描命令(替换src/为你的源码目录):
npx find-imports --name MyClass --module moduleA src/
命令执行后会输出所有从moduleA导入MyClass的文件路径。
3. 自定义脚本(灵活度最高)
如果现有工具无法满足需求,可借助 @babel/parser 和 @babel/traverse 写一个简单脚本,手动解析文件查找目标导入:
先安装依赖:
npm install --save-dev @babel/parser @babel/traverse glob
创建脚本文件find-myclass-imports.js:
const fs = require('fs'); const glob = require('glob'); const parser = require('@babel/parser'); const traverse = require('@babel/traverse').default; glob('src/**/*.{js,ts}', (err, files) => { if (err) throw err; files.forEach(file => { const code = fs.readFileSync(file, 'utf8'); const ast = parser.parse(code, { sourceType: 'module', extensions: ['.js', '.ts'] }); traverse(ast, { ImportDeclaration(path) { if (path.node.source.value === 'moduleA') { const hasMyClass = path.node.specifiers.some(spec => spec.type === 'ImportSpecifier' && spec.local.name === 'MyClass' ); if (hasMyClass) { console.log(`找到 MyClass 导入:${file}`); } } } }); }); });
运行脚本:
node find-myclass-imports.js
脚本会遍历指定目录下的所有文件,输出所有导入了MyClass的文件路径。
内容的提问来源于stack exchange,提问作者Vladimir Nani
相关产品推荐
相关产品推荐

