【问题标题】:Why require("perf_hooks") fails?为什么 require("perf_hooks") 失败?
【发布时间】:2020-11-09 13:03:54
【问题描述】:

据我了解,“perf_hooks”是 Node.js 的一部分。但是,当使用npm test 进行测试时,我会失败并出现以下情况(某些文件名已更改):

Error: ENOENT: no such file or directory, open 'perf_hooks'
      at Object.openSync (fs.js:465:3)
      at Object.readFileSync (fs.js:368:35)
      at SandboxedModule._getCompileInfo (node_modules/sandboxed-module/lib/sandboxed_module.js:265:20)
      at SandboxedModule._compile (node_modules/sandboxed-module/lib/sandboxed_module.js:245:22)
      at createInnerSandboxedModule (node_modules/sandboxed-module/lib/sandboxed_module.js:183:23)
      at SandboxedModule.RecursiveRequireProxy (node_modules/sandboxed-module/lib/sandboxed_module.js:214:27)
      at /Users/asmirnov/Documents/blabla2.js:51:12
      at Object.<anonymous> (lib/profiler.js:53:3)
      at SandboxedModule._compile (node_modules/sandboxed-module/lib/sandboxed_module.js:251:19)
      at createInnerSandboxedModule (node_modules/sandboxed-module/lib/sandboxed_module.js:183:23)
      at SandboxedModule.RecursiveRequireProxy (node_modules/sandboxed-module/lib/sandboxed_module.js:214:27)
      at Object.<anonymous> (lib/blabla1.js:29:20)
      at SandboxedModule._compile (node_modules/sandboxed-module/lib/sandboxed_module.js:251:19)
      at createInnerSandboxedModule (node_modules/sandboxed-module/lib/sandboxed_module.js:183:23)
      at SandboxedModule.RecursiveRequireProxy (node_modules/sandboxed-module/lib/sandboxed_module.js:214:27)
      at SandboxedModule.requireInterceptor (node_modules/sandboxed-module/lib/sandboxed_module.js:227:9)
      at Context.<anonymous> (test/blabla1.js:73:22)
      at processImmediate (internal/timers.js:458:21)

这是使用它的文件 (lib/profiler.js) 的一部分:

const {performance, PerformanceObserver} = (function()
{
  try
  {
    if (window && typeof window.performance == "undefined")
      throw new TypeError();
    return window;
  }
  catch (e)
  {
    return require("perf_hooks");
  }
})();

可能是什么原因?但是在某些情况下(npm run ..),它会按预期工作。任何建议表示赞赏。

PS。节点比较新鲜:

> node --version
v14.8.0

【问题讨论】:

  • 这很奇怪,the documentation 说它应该位于lib/perf_hooks.js 但在我的安装中这个文件也丢失了
  • perf_hooks 确实在那个版本的 Node.js 中。在 14.8.0 中,require() 在找不到模块时会抛出 MODULE_NOT_FOUND(而不是 ENOENT),因此问题出在其他问题上。

标签: javascript npm chromium benchmarking


【解决方案1】:

这是 2.0.4 中修复的“沙盒模块”2.0.3 问题。

【讨论】:

【解决方案2】:

perf_hooks 确实在那个版本的 Node.js 中。在 14.8.0 中,require() 在找不到模块时会抛出 MODULE_NOT_FOUND(而不是 ENOENT),所以问题出在其他问题上。

如果肯定是require() 线在抛出,那么require() 似乎已经被猴子修补了。如果他们修补了require() 而不是module.require(),您可以尝试将lib/profiler.js 中的require() 更改为module.require()

编辑:正如 OP 所建议的那样,sandboxed-module 可能是罪魁祸首,因为它会干扰模块加载。他们报告说它已在 2.0.4 中修复,但基于 the repository information on the fix,它似乎已在 2.0.1 中修复。无论哪种方式,更新到 2.0.4(或更高版本,但这是撰写本文时的最新版本)是 ?。

【讨论】:

  • module.require() 不幸地没有帮助。如果我创建“lib/perf_hooks.js”,它会自动被拾取,否则节点的那个就找不到了。任何可能的“SandboxedModule”问题?
  • > 他们报告说它已在 2.0.4 中修复。这实际上是我报告说它解决了这个问题。我查看了更改的内容(3 次提交),但并没有坦率地了解它是如何修复的。所以它可能与其他东西有关,但它实际上对我有用。如果你能解释为什么它有帮助,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2011-05-16
  • 2015-06-19
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多