我有一个项目,其中包含很多相互关联的文件。我想知道哪个是最常用的依赖项(JS文件),不包括npm模块,每个用法都被定义为依赖文件中的'require'或'import'语句。
示例:我在select new {
中存储了常用方法,并在整个应用程序中由多个文件导入。因此,这将是我最常用的文件}
。
答案 0 :(得分:2)
首先要做的几件事。
请务必注意import
命令不是nodeJS
的原生命令。相反,它是由webpack
使用的转换器提供的功能,所有这些功能都会将import
命令转换为节点内部require()
模块提供的NodeJS支持的Module
。 / p>
在幕后,Module.require()
使用缓存来保存所有以前需要的模块以优化需求,因此它们只包含一次。
对于您的问题,计算nodeJS运行时加载的模块的一种方法是覆盖require()
部分,该部分从内部源(如events
,{{1}查找和加载所需模块等等),文件系统(第一次需要),或者需要缓存(后续需要已经加载的模块)。
这可以通过创建并要求以下模块作为应用程序使用的第一个要求来实现:
fs
注意:您可以注释掉定义// filename: module-override.js
const Module = require('module')
Module.MODULES = {
LOADED: {},
CACHED: {}
}
Module.__load = Module._load // save original _load()
Module._load = function (request, parent, isMain) { // redefine _load()
const filename = Module._resolveFilename(request, parent, isMain)
const key = filename.replace(/^\/Users\/USERNAME/, '...')
if (!key.match(/node_modules/)) { // ignore paths with node_modules
let val
if (Module._cache[filename]) { // exists in Module_cache
val = Module.MODULES.CACHED[key] || 0
Module.MODULES.CACHED[key] = val + 1
}
val = Module.MODULES.LOADED[key] || 0
Module.MODULES.LOADED[key] = val + 1
}
return Module.__load(request, parent, isMain) // the original _load()
}
的行。我补充说,因此字符串化key
的输出不包含任何本地识别信息。
一旦您需要此模块,它将收集Module.MODULES
中所有必需模块的计数。
Module.MODULES
将跟踪模块所需的次数,而Module.MODULES.LOADED
将根据内部模块缓存中的要求执行相同操作。
假设我在名为Module.MODULES.CACHED
和./lib
的{{1}}下有两个模块,其中
utils.js
需要Schedule.js
,./lib/utils
,util
,path
,events
和debug
以及json-stringify-safe
需要lodash
,Schedule.js
和path
我有一个顶级文件,需要colors
和./lib/utils
。
完成所有要求后,我可以打电话
./lib/Schedule
将打印到控制台:
./lib/utils
告诉我
console.log(JSON.stringify(Module.MODULES))
已从文件系统加载一次{
LOADED: {
'..././lib/Schedule.js': 1,
path: 2,
'..././lib/utils.js': 2,
util: 2,
events: 1,
tty: 1
},
CACHED: {
'..././lib/utils.js': 1
}
}
,./lib/Schedule.js
,path
和util
是从nodeJS的内部模块加载的,events
已加载两次,一次来自其文件,另一次来自内部需要缓存如果没有测试来清除tty
下找到的所有模块,输出将是:
utils