nodejs / nodejs/node

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

Offen
#53,198 2 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

confirmed-bug loaders
Vorherrschende Sprache
JavaScript
Sterne
122k
Forks
37.3k
Ø Merge
4 T. 2 Std.
Gemergte PRs (30 T.)
283

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, die bereitgestellte Reproduktion unter Node.js v22.2.0 auszuführen, und verfolge die im Stack angezeigten ESM loader- und CommonJS translator-Frames. Als erledigt gilt die Aufgabe, wenn ein relativer require aus von Hooks bereitgestelltem CommonJS-Quelltext über die registrierten resolve- und load-Hooks verarbeitet wird, wie in der load-hook-Dokumentation angegeben.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript, node.js
Bereich
backend
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
42/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.