Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit728472a

Browse files
joyeecheungtargos
authored andcommitted
module: only put directly require-d ESM into require.cache
This reduces the impact ofhttps://redirect.github.com/nodejs/node/pull/59679by delaying the require.cache population of ESM until theyare directly required. After that, it's necessary for themto be in the cache to maintain correctness.PR-URL:#59874Refs:#59868Reviewed-By: James M Snell <jasnell@gmail.com>Reviewed-By: Geoffrey Booth <webadmin@geoffreybooth.com>
1 parent993f05d commit728472a

File tree

9 files changed

+80
-17
lines changed

9 files changed

+80
-17
lines changed

‎lib/internal/modules/esm/loader.js‎

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ const {
1717
const{
1818
kIsExecuting,
1919
kRequiredModuleSymbol,
20-
Module:CJSModule,
2120
}=require('internal/modules/cjs/loader');
2221
const{ imported_cjs_symbol}=internalBinding('symbols');
2322

@@ -560,19 +559,6 @@ class ModuleLoader {
560559
thrownewERR_UNKNOWN_MODULE_FORMAT(format,url);
561560
}
562561

563-
// Populate the CJS cache with a facade for ESM in case subsequent require(esm) is
564-
// looking it up from the cache. The parent module of the CJS cache entry would be the
565-
// first CJS module that loads it with require(). This is an approximation, because
566-
// ESM caches more and it does not get re-loaded and updated every time an `import` is
567-
// encountered, unlike CJS require(), and we only use the parent entry to provide
568-
// more information in error messages.
569-
if(format==='module'){
570-
constparentFilename=urlToFilename(parentURL);
571-
constparent=parentFilename ?CJSModule._cache[parentFilename] :undefined;
572-
constcjsModule=lazyLoadTranslators().cjsEmplaceModuleCacheEntryForURL(url,parent);
573-
debug('cjsEmplaceModuleCacheEntryForURL',url,parent,cjsModule);
574-
}
575-
576562
constresult=FunctionPrototypeCall(translator,this,url,source,parentURL===undefined);
577563
assert(resultinstanceofModuleWrap);
578564
returnresult;

‎lib/internal/modules/esm/translators.js‎

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,22 @@ function loadCJSModule(module, source, url, filename, isMain) {
154154
// requires a separate cache to be populated as well as introducing several quirks. This is not ideal.
155155
constjob=cascadedLoader.getModuleJobForRequireInImportedCJS(specifier,url,importAttributes);
156156
job.runSync();
157-
constmod=cjsCache.get(job.url);
158-
assert(mod,`Imported CJS module${url} failed to load module${job.url} using require()`);
159-
if(!job.module.synthetic&&!mod.loaded){
157+
letmod=cjsCache.get(job.url);
158+
assert(job.module,`Imported CJS module${url} failed to load module${job.url} using require() due to race condition`);
159+
160+
if(job.module.synthetic){
161+
assert(mod,`Imported CJS module${url} failed to load module${job.url} using require() due to missed cache`);
162+
returnmod.exports;
163+
}
164+
165+
// The module being required is a source text module.
166+
if(!mod){
167+
mod=cjsEmplaceModuleCacheEntry(job.url);
168+
cjsCache.set(job.url,mod);
169+
}
170+
// The module has been cached by the re-invented require. Update the exports object
171+
// from the namespace object and return the evaluated exports.
172+
if(!mod.loaded){
160173
debug('populateCJSExportsFromESM from require(esm) in imported CJS',url,mod,job.module);
161174
populateCJSExportsFromESM(mod,job.module,job.module.getNamespace());
162175
mod.loaded=true;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// This tests the behavior of ESM in require.cache when it's loaded from import.
2+
3+
import'../common/index.mjs';
4+
importassertfrom'node:assert';
5+
import*asfixturesfrom'../common/fixtures.mjs';
6+
constfilename=fixtures.path('es-modules','esm-in-require-cache','esm.mjs');
7+
import{Module}from'node:module';
8+
9+
// Imported ESM should not be in the require cache.
10+
let{ name}=awaitimport('../fixtures/es-modules/esm-in-require-cache/import-esm.mjs');
11+
assert.strictEqual(name,'esm');
12+
assert(!Module._cache[filename]);
13+
14+
({ name}=awaitimport('../fixtures/es-modules/esm-in-require-cache/esm.mjs'));
15+
assert.strictEqual(name,'esm');
16+
assert(!Module._cache[filename]);
17+
18+
// Requiring ESM indirectly should not put it in the cache.
19+
({ name}=awaitimport('../fixtures/es-modules/esm-in-require-cache/require-import-esm.cjs'));
20+
assert.strictEqual(name,'esm');
21+
assert(!Module._cache[filename]);
22+
23+
// After being required directly, it should be in the cache.
24+
({ name}=awaitimport('../fixtures/es-modules/esm-in-require-cache/import-require-esm.mjs'));
25+
assert.strictEqual(name,'esm');
26+
assert(Module._cache[filename]);
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// This tests the behavior of ESM in require.cache when it's loaded from require.
2+
'use strict';
3+
require('../common');
4+
constassert=require('node:assert');
5+
constfixtures=require('../common/fixtures');
6+
constfilename=fixtures.path('es-modules','esm-in-require-cache','esm.mjs');
7+
8+
// Requiring ESM indirectly should not put it in the cache.
9+
let{ name}=require('../fixtures/es-modules/esm-in-require-cache/import-esm.mjs');
10+
assert.strictEqual(name,'esm');
11+
assert(!require.cache[filename]);
12+
13+
({ name}=require('../fixtures/es-modules/esm-in-require-cache/require-import-esm.cjs'));
14+
assert.strictEqual(name,'esm');
15+
assert(!require.cache[filename]);
16+
17+
// After being required directly, it should be in the cache.
18+
({ name}=require('../fixtures/es-modules/esm-in-require-cache/esm.mjs'));
19+
assert.strictEqual(name,'esm');
20+
assert(require.cache[filename]);
21+
deleterequire.cache[filename];
22+
23+
({ name}=require('../fixtures/es-modules/esm-in-require-cache/import-require-esm.mjs'));
24+
assert.strictEqual(name,'esm');
25+
assert(require.cache[filename]);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
exportconstname='esm';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export{name}from'./esm.mjs';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export{name,cache}from'./require-esm.cjs'
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
constpath=require('path');
2+
3+
constname=require('./esm.mjs').name;
4+
exports.name=name;
5+
6+
constfilename=path.join(__dirname,'esm.mjs');
7+
constcache=require.cache[filename];
8+
exports.cache=require.cache[filename];
9+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
exports.name=require('./import-esm.mjs').name;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp