我有一个项目,与许多相互关联的文件,需要彼此。我想知道不包括npm模块,哪个是最常用的依赖项(JS文件),每种使用都被定义为依赖文件中的“require”或“import”语句。
示例:我有存储在src/general/utils.js
中的常用方法,并在整个应用程序中由多个文件导入。因此,这将是我最常用的文件utils.js
。
发布于 2018-03-08 20:22:23
先做几件事。
需要注意的是,import
命令并不是nodeJS
的原生命令。相反,它是由诸如webpack
所使用的那些传输程序提供的特性,所有这些特性都将将import
命令转换为节点内部Module
模块提供的NodeJS支持的require()
。
在幕后,Module.require()
使用一个缓存来保存所有以前所需的模块来优化需求,因此它们只包含一次。
对于您的问题,计算由nodeJS运行时加载的模块的一种方法是覆盖require()
中定位和加载所需模块的部分,这些模块要么来自内部源(如events
、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
下有两个模块,名为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
被加载了两次,一次是从其文件加载的,一次是从内部需求缓存加载的。如果没有在/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
}
}
https://stackoverflow.com/questions/49139013
复制相似问题