nodejs / nodejs/node

Relative `require()` in `commonjs` source not processed by ESM Loader

Abierto
#53,198 2 comentarios 1 reacción 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

confirmed-bug loaders
Lenguaje dominante
JavaScript
Estrellas
122k
Forks
37.3k
Merge medio
4 d 2 h
PR fusionados (30 d)
283

Descripción

Version

v22.2.0

Platform

Darwin mac.local 23.4.0 Darwin Kernel Version 23.4.0: Fri Mar 15 00:12:49 PDT 2024; root:xnu-10063.101.17~1/RELEASE_ARM64_T6020 arm64

Subsystem

No response

What steps will reproduce the bug?
'use strict';

require('node:module').register(
  'data:text/javascript,' + `
  import assert from 'node:assert';
  
  export ${encodeURIComponent(
    function resolve(specifier, context, nextResolve) {
      console.log({ specifier, context });
      return nextResolve(specifier, context);
    },
  )}
  
  export ${encodeURIComponent(
    function load(url, context, nextLoad) {
      if (url === 'custom:cjs') {
        return {
          format: 'commonjs',
          source: 'console.log(require("./relative"))',
          shortCircuit: true,
        };
      }
      return nextLoad(url, context);
    }
  )}
  `,
);

import('custom:cjs').then(console.log, console.error);
How often does it reproduce? Is there a required condition?

Consistently

What is the expected behavior? Why is that the expected behavior?

The load hook doc says:

When a source is provided, all require calls from this module will be processed by the ESM loader with registered resolve and load hooks

https://nodejs.org/api/module.html#resolvespecifier-context-nextresolve:~:text=When%20a%20source,will%20not%20apply.

What do you see instead?

require() calls with relative path are still processed by the CommonJS loader

Error: Cannot find module './relative'
Require stack:
- custom:cjs
    at Module._resolveFilename (node:internal/modules/cjs/loader:1186:15)
    at require (node:internal/modules/esm/translators:195:30)
    at Object.<anonymous> (custom:cjs:1:13)
    at loadCJSModule (node:internal/modules/esm/translators:223:3)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:258:7)
    at ModuleJob.run (node:internal/modules/esm/module_job:262:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:475:24) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ 'custom:cjs' ]
}
Additional information

No response

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza ejecutando la reproducción proporcionada en Node.js v22.2.0 y sigue los frames de ESM loader y CommonJS translator que aparecen en el stack. Se considera terminado cuando un require relativo procedente de código fuente CommonJS proporcionado por hooks se procesa mediante los hooks resolve y load registrados, tal como se indica en la documentación de load-hook.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
javascript, node.js
Área
backend
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
42/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.