Babel 插件 - 在静态代码分析后获取结构化信息作为输出
Babel plugin - get structured information as output after static code analysis
我正在开发一个可以为我提供一些代码指标的开发工具。
我希望该工具能够遍历源文件并计算每个 导入值 和每个 使用情况 (#loc) =38=]图书馆.
即对于lodash,我想知道isEqual
、cloneDeep
的用法。
我想要作为输出:
+------------+------------+---------+
| Library | Imported | #LOC |
+------------+------------+---------+
| Lodash | isEqual | 20|
| Lodash | cloneDeep | 4|
+------------+------------+---------+
该工具应找到的示例文件
1 // aFile.js
2 import {isEqual, cloneDeep} from 'lodash'
3 // some code ..
4 if (isEqual(variableA, variableB)) {
5 // ^^^^^^^
6 }
7 let myClonedObject = cloneDeep(myObject);
8 // ^^^^^^^^^
我开始将实现作为 babel 插件,因为我知道它会让我轻松
- 以可读格式 (AST) 解析代码
- 访问所有 importDeclaration
- 获取相关参考资料
- 计算使用量
当前实施
export default function({ types: t }) {
return {
visitor: {
ImportDeclaration(path, state) {
if(path.get('source').node.value === 'lodash') {
path.get('specifiers').forEach(function(specifier) {
if(specifier.node.imported) {
const importedIdentifierName = specifier.node.imported.name;
if(importedIdentifierName === 'isEqual') {
const isEqualLoc = new Set();
const {referencePaths} = path.scope.getBinding(importedIdentifierName);
referencePaths.forEach(function(referencePath) {
isEqualLOC.add(referencePath.node.loc.start.line);
});
console.log(isEqualLOC.size);
}
}
});
}
}
}
};
};
对于这个工具,我只对代码进行读取操作(没有转换/生成)。
我的问题:如何将 babel 插件 (lib/import/#loc) 中生成的信息共享到 babel-cli
命令的结果或任何其他 API ?
我考虑过使用 console.log
记录结果(具有特定 ID),但在我看来这是一种解决方法。
我想知道是否有关于从 babel 插件中公开信息的明确 API。
这似乎是使用 Babel 的实用程序构建的更好的东西,但要在您自己的基础上实现。 Babel 目前不提供任何方式来输出统计数据或任何东西。例如,您可以将插件更改为
这样的脚本
const fs = require('fs');
const babylon = require('bablylon');
const traverse = require('babel-traverse');
const data = fs.readFileSync('./thing.js');
traverse(babylon.parse(data), {
ImportDeclaration(path) {
// ...
},
});
// Do whatever output you want here
我正在开发一个可以为我提供一些代码指标的开发工具。
我希望该工具能够遍历源文件并计算每个 导入值 和每个 使用情况 (#loc) =38=]图书馆.
即对于lodash,我想知道isEqual
、cloneDeep
的用法。
我想要作为输出:
+------------+------------+---------+
| Library | Imported | #LOC |
+------------+------------+---------+
| Lodash | isEqual | 20|
| Lodash | cloneDeep | 4|
+------------+------------+---------+
该工具应找到的示例文件
1 // aFile.js
2 import {isEqual, cloneDeep} from 'lodash'
3 // some code ..
4 if (isEqual(variableA, variableB)) {
5 // ^^^^^^^
6 }
7 let myClonedObject = cloneDeep(myObject);
8 // ^^^^^^^^^
我开始将实现作为 babel 插件,因为我知道它会让我轻松
- 以可读格式 (AST) 解析代码
- 访问所有 importDeclaration
- 获取相关参考资料
- 计算使用量
当前实施
export default function({ types: t }) {
return {
visitor: {
ImportDeclaration(path, state) {
if(path.get('source').node.value === 'lodash') {
path.get('specifiers').forEach(function(specifier) {
if(specifier.node.imported) {
const importedIdentifierName = specifier.node.imported.name;
if(importedIdentifierName === 'isEqual') {
const isEqualLoc = new Set();
const {referencePaths} = path.scope.getBinding(importedIdentifierName);
referencePaths.forEach(function(referencePath) {
isEqualLOC.add(referencePath.node.loc.start.line);
});
console.log(isEqualLOC.size);
}
}
});
}
}
}
};
};
对于这个工具,我只对代码进行读取操作(没有转换/生成)。
我的问题:如何将 babel 插件 (lib/import/#loc) 中生成的信息共享到 babel-cli
命令的结果或任何其他 API ?
我考虑过使用 console.log
记录结果(具有特定 ID),但在我看来这是一种解决方法。
我想知道是否有关于从 babel 插件中公开信息的明确 API。
这似乎是使用 Babel 的实用程序构建的更好的东西,但要在您自己的基础上实现。 Babel 目前不提供任何方式来输出统计数据或任何东西。例如,您可以将插件更改为
这样的脚本const fs = require('fs');
const babylon = require('bablylon');
const traverse = require('babel-traverse');
const data = fs.readFileSync('./thing.js');
traverse(babylon.parse(data), {
ImportDeclaration(path) {
// ...
},
});
// Do whatever output you want here