为什么 require("perf_hooks") 失败了?
Why require("perf_hooks") fails?
在我的理解中,“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
perf_hooks
确实在 Node.js 的那个版本中。在 14.8.0 中,require()
在找不到模块时抛出 MODULE_NOT_FOUND
(而不是 ENOENT
),所以问题出在其他方面。
如果确实是 require()
行抛出,那么 require()
似乎很可能是 monkey-patched。如果他们修补了 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(或更高版本,但这是撰写本文时的最新版本)是 .
这是一个“沙盒模块”2.0.3 问题,已在 2.0.4 中修复。
在我的理解中,“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
perf_hooks
确实在 Node.js 的那个版本中。在 14.8.0 中,require()
在找不到模块时抛出 MODULE_NOT_FOUND
(而不是 ENOENT
),所以问题出在其他方面。
如果确实是 require()
行抛出,那么 require()
似乎很可能是 monkey-patched。如果他们修补了 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(或更高版本,但这是撰写本文时的最新版本)是 .
这是一个“沙盒模块”2.0.3 问题,已在 2.0.4 中修复。