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

标签 javascript node.js webpack

我有一个项目,其中有许多相互需要的相互关联的文件。我想知道除了 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.jsSchedule.js 的模块,其中

  • ./lib/utils 需要 utilpatheventsdebugjson-stringify-safelodash 以及
  • Schedule.js 需要 pathcolors./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 从文件系统加载一次,
  • pathutileventstty 是从 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/

相关文章:

javascript - Chrome 扩展 : Not loading source-maps

javascript - 如何使 Cordova App Live Reload,特别是通过 webpack 构建并在设备或模拟器中运行

javascript - 如何完全在另一个 div 的边界内创建一个 div?

javascript - 如何使用youtube api v3获取视频的html描述而不是纯文本

javascript - $ ("body").scrollTop() 在 safari 中不会更新

npm - 找不到相对于目录的预设 "stage-2"

javascript - 悬停事件的轨迹模式在 tsParticles 中不起作用(类似于 particlejs)

javascript - Passport + NodeJs + Express 得到 "req.user"undefined

node.js - 使用 Azure Web 应用程序部署的 Express Angular 5 应用程序不允许使用 405 方法

node.js - 如何在 NodeJS 中更新 Firebase 身份验证的电话号码?