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

Commitc647cf1

Browse files
authored
fix: deferred modules define order and transitive deferred module not emitted correctly in concatenated modules
1 parent73cecf5 commitc647cf1

File tree

17 files changed

+119
-37
lines changed

17 files changed

+119
-37
lines changed

‎lib/optimize/ConcatenatedModule.js‎

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const Template = require("../Template");
2323
const{DEFAULTS}=require("../config/defaults");
2424
constHarmonyImportDependency=require("../dependencies/HarmonyImportDependency");
2525
constHarmonyImportSideEffectDependency=require("../dependencies/HarmonyImportSideEffectDependency");
26+
constHarmonyImportSpecifierDependency=require("../dependencies/HarmonyImportSpecifierDependency");
2627
constJavascriptParser=require("../javascript/JavascriptParser");
2728
const{
2829
getMakeDeferredNamespaceModeFromExportsType,
@@ -1832,6 +1833,25 @@ ${defineGetters}`
18321833
if(!source)continue;
18331834
result.add(source);
18341835
}
1836+
1837+
if(info.type==="external"&&info.deferred){
1838+
constmoduleId=JSON.stringify(chunkGraph.getModuleId(info.module));
1839+
constloader=getOptimizedDeferredModule(
1840+
runtimeTemplate,
1841+
info.module.getExportsType(
1842+
moduleGraph,
1843+
/**@type {BuildMeta} */
1844+
(this.rootModule.buildMeta).strictHarmonyModule
1845+
),
1846+
moduleId,
1847+
// an async module will opt-out of the concat module optimization.
1848+
[]
1849+
);
1850+
runtimeRequirements.add(RuntimeGlobals.require);
1851+
result.add(
1852+
`\n// DEFERRED EXTERNAL MODULE:${info.module.readableIdentifier(requestShortener)}\nvar${info.deferredName} =${loader};`
1853+
);
1854+
}
18351855
}
18361856

18371857
/**@type {InitFragment<ChunkRenderContext>[]} */
@@ -1855,10 +1875,19 @@ ${defineGetters}`
18551875
for(constdepofinfo.module.dependencies){
18561876
if(
18571877
!(/**@type {HarmonyImportDependency} */(dep).defer)&&
1858-
depinstanceofHarmonyImportSideEffectDependency
1878+
(depinstanceofHarmonyImportSideEffectDependency||
1879+
depinstanceofHarmonyImportSpecifierDependency)
18591880
){
18601881
constreferredModule=moduleGraph.getModule(dep);
1861-
if(!referredModule)continue;
1882+
if(!referredModule){
1883+
if(depinstanceofHarmonyImportSideEffectDependency){
1884+
continue;
1885+
}else{
1886+
thrownewError(
1887+
"Deferred module used, but no module in the graph."
1888+
);
1889+
}
1890+
}
18621891
if(moduleGraph.isDeferred(referredModule)){
18631892
constdeferredModuleInfo=/**@type {ExternalModuleInfo} */(
18641893
modulesWithInfo.find(
@@ -1887,41 +1916,30 @@ ${defineGetters}`
18871916
break;
18881917
}
18891918
case"external":{
1890-
result.add(
1891-
`\n// EXTERNAL MODULE:${info.module.readableIdentifier(
1892-
requestShortener
1893-
)}\n`
1894-
);
1895-
runtimeRequirements.add(RuntimeGlobals.require);
1896-
const{ runtimeCondition}=
1897-
/**@type {ExternalModuleInfo | ReferenceToModuleInfo} */
1898-
(rawInfo);
1899-
constcondition=runtimeTemplate.runtimeConditionExpression({
1900-
chunkGraph,
1901-
runtimeCondition,
1902-
runtime,
1903-
runtimeRequirements
1904-
});
1905-
if(condition!=="true"){
1906-
isConditional=true;
1907-
result.add(`if (${condition}) {\n`);
1908-
}
1909-
constmoduleId=JSON.stringify(chunkGraph.getModuleId(info.module));
1910-
if(info.deferred){
1911-
constloader=getOptimizedDeferredModule(
1912-
runtimeTemplate,
1913-
info.module.getExportsType(
1914-
moduleGraph,
1915-
/**@type {BuildMeta} */
1916-
(this.rootModule.buildMeta).strictHarmonyModule
1917-
),
1918-
moduleId,
1919-
// an async module will opt-out of the concat module optimization.
1920-
[]
1919+
// deferred case is handled in the "const info of modulesWithInfo" loop above
1920+
if(!info.deferred){
1921+
result.add(
1922+
`\n// EXTERNAL MODULE:${info.module.readableIdentifier(
1923+
requestShortener
1924+
)}\n`
1925+
);
1926+
runtimeRequirements.add(RuntimeGlobals.require);
1927+
const{ runtimeCondition}=
1928+
/**@type {ExternalModuleInfo | ReferenceToModuleInfo} */
1929+
(rawInfo);
1930+
constcondition=runtimeTemplate.runtimeConditionExpression({
1931+
chunkGraph,
1932+
runtimeCondition,
1933+
runtime,
1934+
runtimeRequirements
1935+
});
1936+
if(condition!=="true"){
1937+
isConditional=true;
1938+
result.add(`if (${condition}) {\n`);
1939+
}
1940+
constmoduleId=JSON.stringify(
1941+
chunkGraph.getModuleId(info.module)
19211942
);
1922-
result.add(`var${info.deferredName} =${loader};`);
1923-
name=info.deferredName;
1924-
}else{
19251943
result.add(`var${info.name} = __webpack_require__(${moduleId});`);
19261944
name=info.name;
19271945
}

‎lib/runtime/MakeDeferredNamespaceObjectRuntime.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ class MakeDeferredNamespaceObjectRuntimeModule extends HelperRuntimeModule {
174174
])},`,
175175
`ownKeys:${runtimeTemplate.basicFunction("",[
176176
init,
177-
`var keys = Reflect.ownKeys(ns).filter(${runtimeTemplate.expressionFunction('x !== "then"',"x")}).concat([Symbol.toStringTag]);`,
177+
`var keys = Reflect.ownKeys(ns).filter(${runtimeTemplate.expressionFunction('x !== "then" && x !== Symbol.toStringTag',"x")}).concat([Symbol.toStringTag]);`,
178178
"return keys;"
179179
])},`,
180180
`getOwnPropertyDescriptor:${runtimeTemplate.basicFunction("_, name",[
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import{a}from'mod'
2+
3+
Object.keys(a).forEach(()=>{})
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
importdefer*asmfrom'mod'
2+
3+
Object.keys(m).forEach(()=>{})
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
it('should compile and load',()=>{
2+
require('./main.js');
3+
})
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import'./a'
2+
import'./b'

‎test/configCases/defer-import/concatenated-1/node_modules/mod/index.js‎

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎test/configCases/defer-import/concatenated-1/node_modules/mod/package.json‎

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎test/configCases/defer-import/concatenated-1/node_modules/mod/re-export.js‎

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
"use strict";
2+
3+
/**@type {import("../../../../types").Configuration} */
4+
module.exports={
5+
target:[`async-node${process.versions.node.split(".").map(Number)[0]}`],
6+
optimization:{
7+
concatenateModules:true
8+
},
9+
experiments:{
10+
deferImport:true
11+
}
12+
};

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp