¿Por qué require ("perf_hooks") falla?

Nov 09 2020

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

1 4ntoine Nov 10 2020 at 10:13

Ese es un problema 2.0.3 del "módulo de espacio aislado" que se solucionó en 2.0.4.

1 Trott Nov 09 2020 at 14:50

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 👍.