为什么 require( "perf_hooks" ) 失败?



在我的理解中"perf_ books";是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

这是一个"沙盒模块";2.0.3在2.0.4中修复的问题。

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中已经修复,但根据修复的存储库信息,它似乎在2.0.1中已经修复。无论哪种方式,更新到2.0.4(或更高版本,但这是本文撰写时的最新版本(👍.

最新更新