Javascript 如何找到最常用的JS文件?
我有一个项目,有很多相互关联的文件,需要对方。我想知道除了npm模块之外,最常用的依赖项(JS文件)是哪一个,每次使用都定义为依赖文件中的“require”或“import”语句Javascript 如何找到最常用的JS文件?,javascript,node.js,webpack,Javascript,Node.js,Webpack,我有一个项目,有很多相互关联的文件,需要对方。我想知道除了npm模块之外,最常用的依赖项(JS文件)是哪一个,每次使用都定义为依赖文件中的“require”或“import”语句 示例:我的常用方法存储在src/general/utils.js中,并且在整个应用程序中由多个文件导入。因此,这将是我最常用的文件utils.js首先要做的几件事 需要注意的是,import命令不是nodeJS的固有命令。相反,它是由诸如webpack所使用的传输程序提供的功能,所有这些传输程序都将导入命令转换为节点的
示例:我的常用方法存储在
src/general/utils.js
中,并且在整个应用程序中由多个文件导入。因此,这将是我最常用的文件utils.js
首先要做的几件事
需要注意的是,import
命令不是nodeJS
的固有命令。相反,它是由诸如webpack
所使用的传输程序提供的功能,所有这些传输程序都将导入
命令转换为节点的内部模块
所支持的require()
在封面下,Module.require()
使用缓存保存所有以前需要的模块以优化requires,因此它们只包含一次
对于您的问题,计算nodeJS运行时加载的模块数量的一种方法是覆盖require()
的部分,该部分从内部源(如events
、fs
等)、文件系统(首次需要)或require缓存查找和加载所需模块(对于已加载模块的后续要求)
这可以通过创建并要求以下模块作为应用程序使用的第一个要求来实现:
// 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()
}
注意:您可以注释掉定义键的行。我添加了注释,因此字符串化Module.MODULES
的输出不包含任何本地标识信息
一旦您需要此模块,它将在module.modules
中收集所有所需模块的计数
Module.MODULES.LOADED
将跟踪一个模块被要求的次数,而Module.MODULES.CACHED
将对从内部模块缓存满足的要求执行相同的操作
假设我在/lib
下有两个名为utils.js
和Schedule.js
的模块,其中
/lib/utils
需要util
,路径
,事件
,调试
,json字符串化安全
和lodash
,以及
Schedule.js
需要路径
,颜色
和/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
、events
和tty
从nodeJS的内部模块加载,并且
utils
加载了两次,一次从其文件加载,一次从内部缓存加载
如果不进行清除/node\u modules/
下所有模块的测试,则输出将为:
{
LOADED: {
'.../lib/Schedule.js': 1,
path: 2,
'.../node_modules/colors/lib/index.js': 1,
'.../node_modules/colors/lib/colors.js': 6,
'.../node_modules/colors/lib/styles.js': 1,
'.../node_modules/colors/lib/system/supports-colors.js': 1,
'.../node_modules/colors/lib/custom/trap.js': 1,
'.../node_modules/colors/lib/custom/zalgo.js': 1,
'.../node_modules/colors/lib/maps/america.js': 1,
'.../node_modules/colors/lib/maps/zebra.js': 1,
'.../node_modules/colors/lib/maps/rainbow.js': 1,
'.../node_modules/colors/lib/maps/random.js': 1,
'.../node_modules/colors/lib/extendStringPrototype.js': 1,
'.../lib/utils.js': 2,
util: 2,
events: 1,
'/.../node_modules/lodash/lodash.js': 1,
'/.../node_modules/json-stringify-safe/stringify.js': 1,
'.../node_modules/debug/src/index.js': 1,
'.../node_modules/debug/src/node.js': 1,
tty: 1,
'.../node_modules/debug/src/debug.js': 1,
'.../node_modules/ms/index.js': 1,
'/.../node_modules/supports-color/index.js': 1 },
CACHED: {
'.../node_modules/colors/lib/colors.js': 5,
'.../lib/utils.js': 1
}
}
哇,答案很可靠。根据你的代码创建一个网页包插件,这将是一个很好的项目,类似于各种可用的网页包包分析器。