有没有一种方法可以计算从我在项目(package.json
)中定义的npm依赖项中实际触发并使用了多少行代码,而不管该依赖项如何稍后在项目中导入(整个库或只是一部分)?
我想实现的是查看某个依赖项是否值得在我拥有的某个相当大的项目中进行安装,例如,如果仅使用了1%的库,那么最好写那几个而不是依赖整个库及其依赖项。
答案 0 :(得分:1)
我找到了一个涉及一些小技巧的解决方案,但是效果很好。
这个想法是使用代码覆盖率工具,除了检查您的代码外,还要使用它来检查node_modules
。
nyc似乎是一个受欢迎的代码覆盖模块,所以我继续安装它:npm install -g nyc
我使用2个依赖项创建了一个小示例:
index.js
const mkdirp = require('mkdirp')
const ejs = require('ejs')
ejs.render('test');
mkdirp('.');
运行nyc node index.js
仅提供index.js的覆盖范围,这不是我们想要的:
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
index.js | 100 | 100 | 100 | 100 | |
----------|----------|----------|----------|----------|-------------------|
似乎nyc
并没有降落到node_modules
中,因此无法对其进行配置。在他们的Github存储库中也出现了此问题:Include certain node modules #833
幸运的是,有人提供了一种解决方法:手动修改test-exclude
,这是nyc的依赖项。
这是我设法使其工作的方式:
找到nyc
的全局安装文件夹(我的位置是C:\Users\mihai\AppData\Roaming\npm\node_modules\nyc
)
在此文件夹中,转到node_modules\test-exclude
并编辑index.js
查找此数组:
exportFunc.defaultExclude = [
...
'**/node_modules/**'
]
将'**/node_modules/**'
修改为'**/nyc/node_modules/**'
注释这些行:
if (this.exclude.indexOf('**/node_modules/**') === -1) {
this.exclude.push('**/node_modules/**')
}
现在一切都已设置好,我们可以再次运行nyc node index.js
:
----------------------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------------------------|----------|----------|----------|----------|-------------------|
All files | 42.75 | 29.34 | 40.48 | 43.03 | |
myapp | 100 | 100 | 100 | 100 | |
index.js | 100 | 100 | 100 | 100 | |
myapp/node_modules/ejs/lib | 42.37 | 28.5 | 36.11 | 42.37 | |
ejs.js | 42.2 | 29.32 | 44.44 | 42.2 |... 06,910,911,912 |
utils.js | 44.44 | 11.11 | 11.11 | 44.44 |... 42,156,159,162 |
myapp/node_modules/mkdirp | 41.07 | 33.33 | 66.67 | 43.14 | |
index.js | 41.07 | 33.33 | 66.67 | 43.14 |... 87,90,92,93,97 |
----------------------------|----------|----------|----------|----------|-------------------|
请注意ejs.js
和mkdirp
的覆盖范围,其中显示了语句,分支,函数和行。