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

Javascript 如何找到最常用的JS文件?,javascript,node.js,webpack,Javascript,Node.js,Webpack,我有一个项目,有很多相互关联的文件,需要对方。我想知道除了npm模块之外,最常用的依赖项(JS文件)是哪一个,每次使用都定义为依赖文件中的“require”或“import”语句 示例:我的常用方法存储在src/general/utils.js中,并且在整个应用程序中由多个文件导入。因此,这将是我最常用的文件utils.js首先要做的几件事 需要注意的是,import命令不是nodeJS的固有命令。相反,它是由诸如webpack所使用的传输程序提供的功能,所有这些传输程序都将导入命令转换为节点的

我有一个项目,有很多相互关联的文件,需要对方。我想知道除了npm模块之外,最常用的依赖项(JS文件)是哪一个,每次使用都定义为依赖文件中的“require”或“import”语句


示例:我的常用方法存储在
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
  }
}

哇,答案很可靠。根据你的代码创建一个网页包插件,这将是一个很好的项目,类似于各种可用的网页包包分析器。