¿Por qué require ("perf_hooks") falla?
Según tengo entendido, "perf_hooks" es parte de Node.js. Sin embargo, cuando la prueba npm testme falla con lo siguiente (se cambian algunos nombres de archivo):
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)
Esta es una parte del archivo ( lib/profiler.js) que lo usa:
const {performance, PerformanceObserver} = (function()
{
try
{
if (window && typeof window.performance == "undefined")
throw new TypeError();
return window;
}
catch (e)
{
return require("perf_hooks");
}
})();
¿Qué puede ser una razón? Sin embargo, en algunos escenarios ( npm run ..) funciona como se esperaba. Se agradece cualquier sugerencia.
PD. El nodo es relativamente nuevo:
> node --version
v14.8.0
Respuestas
Ese es un problema 2.0.3 del "módulo de espacio aislado" que se solucionó en 2.0.4.
perf_hooksestá de hecho en esa versión de Node.js. En 14.8.0, require()lanza MODULE_NOT_FOUND(y no ENOENT) cuando no puede encontrar un módulo, por lo que el problema es otra cosa.
Si definitivamente es la require()línea la que está lanzando, entonces parece probable que require()haya sido parcheada. Si se parchearon require()pero no module.require(), puede intentar cambiar require()a module.require()in lib/profiler.js.
EDITAR: Como sugiere OP, sandboxed-modulees un posible culpable, ya que se mete con la carga del módulo. Informan que está corregido en 2.0.4, pero según la información del repositorio sobre la corrección , parecería estar corregido en 2.0.1. De cualquier manera, la actualización a 2.0.4 (o posterior, pero esa es la última versión al momento de escribir este artículo) es 👍.