我有一个项目,其中有许多相互需要的相互关联的文件。我想知道除了 npm 模块之外最常用的依赖项(JS 文件),每次使用都定义为依赖文件中的“require”或“import”语句。
示例:我将常用方法存储在 src/general/utils.js
中,并由整个应用程序中的多个文件导入。因此,这将是我最常用的文件 utils.js
。
最佳答案
首先有几件事。
需要注意的是,import
命令不是 nodeJS
原生的。相反,它是转译器提供的功能,例如 webpack
使用的转译器,所有这些转译器都会将 import
命令转换为 NodeJS 支持的 require()
提供的通过 Node 的内部 Module
模块。
在幕后,Module.require()
使用缓存来保存所有以前需要的模块来优化需求,因此它们只包含一次。
对于你的问题,计算 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
、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
、events
和tty
是从 NodeJS 的内部模块加载的,并且utils
被加载两次,一次从其文件加载,一次从内部 require 缓存加载
如果没有测试清除 /node_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
}
}
关于javascript - 如何找到最常用的JS文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49139013/