如何找到最常用的JS文件?

时间:2018-03-06 19:59:04

标签: javascript node.js webpack

我有一个项目,其中包含很多相互关联的文件。我想知道哪个是最常用的依赖项(JS文件),不包括npm模块,每个用法都被定义为依赖文件中的'require'或'import'语句。

示例:我在select new {中存储了常用方法,并在整个应用程序中由多个文件导入。因此,这将是我最常用的文件}

1 个答案:

答案 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/utilsutilpatheventsdebug以及
  • json-stringify-safe需要lodashSchedule.jspath

我有一个顶级文件,需要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.jspathutil是从nodeJS的内部模块加载的,
  • events已加载两次,一次来自其文件,另一次来自内部需要缓存

如果没有测试来清除tty下找到的所有模块,输出将是:

utils