webpack 5.109.1 → 5.110.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (639) hide show
  1. package/README.md +6 -0
  2. package/lib/APIPlugin.js +123 -17
  3. package/lib/AsyncDependenciesBlock.js +10 -7
  4. package/lib/AutomaticPrefetchPlugin.js +1 -1
  5. package/lib/BannerPlugin.js +10 -6
  6. package/lib/CacheFacade.js +6 -6
  7. package/lib/Chunk.js +14 -11
  8. package/lib/ChunkGraph.js +26 -17
  9. package/lib/ChunkGroup.js +7 -7
  10. package/lib/ChunkTemplate.js +35 -44
  11. package/lib/CircularModulesPlugin.js +205 -28
  12. package/lib/CleanPlugin.js +15 -16
  13. package/lib/CodeGenerationResults.js +11 -8
  14. package/lib/CompatibilityPlugin.js +7 -7
  15. package/lib/Compilation.js +700 -412
  16. package/lib/Compiler.js +69 -42
  17. package/lib/ConcatenationScope.js +117 -8
  18. package/lib/ConditionalInitFragment.js +3 -3
  19. package/lib/ConstPlugin.js +13 -11
  20. package/lib/ContextExclusionPlugin.js +1 -1
  21. package/lib/ContextModule.js +146 -54
  22. package/lib/ContextModuleFactory.js +46 -14
  23. package/lib/ContextReplacementPlugin.js +12 -14
  24. package/lib/DefinePlugin.js +131 -46
  25. package/lib/DependenciesBlock.js +9 -6
  26. package/lib/Dependency.js +36 -16
  27. package/lib/DependencyTemplate.js +11 -12
  28. package/lib/DependencyTemplates.js +3 -3
  29. package/lib/DotenvPlugin.js +50 -13
  30. package/lib/DynamicEntryPlugin.js +8 -4
  31. package/lib/EntryOptionPlugin.js +8 -4
  32. package/lib/EntryPlugin.js +2 -2
  33. package/lib/Entrypoint.js +6 -2
  34. package/lib/EnvironmentPlugin.js +2 -2
  35. package/lib/EvalDevToolModulePlugin.js +8 -4
  36. package/lib/EvalSourceMapDevToolPlugin.js +15 -8
  37. package/lib/ExportsInfo.js +101 -14
  38. package/lib/ExportsInfoApiPlugin.js +2 -4
  39. package/lib/ExternalModule.js +242 -84
  40. package/lib/ExternalModuleFactoryPlugin.js +97 -38
  41. package/lib/ExternalsPlugin.js +10 -6
  42. package/lib/FileSystemInfo.js +27 -68
  43. package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
  44. package/lib/FlagDependencyExportsPlugin.js +76 -19
  45. package/lib/FlagDependencyUsagePlugin.js +32 -47
  46. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  47. package/lib/Generator.js +19 -15
  48. package/lib/HotModuleReplacementPlugin.js +16 -44
  49. package/lib/IgnorePlugin.js +8 -4
  50. package/lib/IgnoreWarningsPlugin.js +2 -2
  51. package/lib/InitFragment.js +8 -4
  52. package/lib/JavascriptMetaInfoPlugin.js +35 -4
  53. package/lib/LazyBarrel.js +3 -4
  54. package/lib/LibraryTemplatePlugin.js +10 -6
  55. package/lib/LoaderOptionsPlugin.js +7 -3
  56. package/lib/LoaderTargetPlugin.js +1 -1
  57. package/lib/MainTemplate.js +49 -42
  58. package/lib/ManifestPlugin.js +12 -11
  59. package/lib/Module.js +62 -33
  60. package/lib/ModuleFactory.js +3 -3
  61. package/lib/ModuleFilenameHelpers.js +22 -6
  62. package/lib/ModuleGraph.js +195 -21
  63. package/lib/ModuleGraphConnection.js +6 -13
  64. package/lib/ModuleInfoHeaderPlugin.js +8 -10
  65. package/lib/ModuleTemplate.js +62 -63
  66. package/lib/MultiCompiler.js +130 -64
  67. package/lib/MultiStats.js +40 -9
  68. package/lib/MultiWatching.js +3 -3
  69. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  70. package/lib/NodeStuffPlugin.js +29 -19
  71. package/lib/NormalModule.js +212 -153
  72. package/lib/NormalModuleFactory.js +563 -112
  73. package/lib/NormalModuleReplacementPlugin.js +5 -8
  74. package/lib/NullFactory.js +6 -2
  75. package/lib/OptionsApply.js +7 -3
  76. package/lib/Parser.js +7 -3
  77. package/lib/PlatformPlugin.js +2 -2
  78. package/lib/PrefetchPlugin.js +1 -1
  79. package/lib/ProgressPlugin.js +16 -13
  80. package/lib/ProvidePlugin.js +3 -5
  81. package/lib/RawModule.js +25 -17
  82. package/lib/RecordIdsPlugin.js +3 -3
  83. package/lib/RequestShortener.js +1 -1
  84. package/lib/ResolverFactory.js +2 -2
  85. package/lib/RuntimeGlobals.js +22 -10
  86. package/lib/RuntimeModule.js +29 -19
  87. package/lib/RuntimePlugin.js +332 -169
  88. package/lib/RuntimeTemplate.js +2792 -352
  89. package/lib/SelfModuleFactory.js +7 -3
  90. package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
  91. package/lib/SourceMapDevToolPlugin.js +30 -20
  92. package/lib/Stats.js +3 -4
  93. package/lib/Template.js +32 -22
  94. package/lib/TemplatedPathPlugin.js +96 -14
  95. package/lib/UseStrictPlugin.js +4 -6
  96. package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
  97. package/lib/WarnDeprecatedOptionPlugin.js +1 -1
  98. package/lib/WarnNoModeSetPlugin.js +1 -1
  99. package/lib/WatchIgnorePlugin.js +8 -6
  100. package/lib/Watching.js +8 -8
  101. package/lib/WebpackIsIncludedPlugin.js +2 -4
  102. package/lib/WebpackOptionsApply.js +308 -18
  103. package/lib/WebpackOptionsDefaulter.js +6 -2
  104. package/lib/asset/AssetBytesGenerator.js +11 -7
  105. package/lib/asset/AssetBytesParser.js +2 -4
  106. package/lib/asset/AssetGenerator.js +187 -92
  107. package/lib/asset/AssetModule.js +7 -3
  108. package/lib/asset/AssetModulesPlugin.js +110 -38
  109. package/lib/asset/AssetParser.js +9 -7
  110. package/lib/asset/AssetSourceGenerator.js +59 -10
  111. package/lib/asset/AssetSourceParser.js +2 -4
  112. package/lib/asset/RawDataUrlModule.js +24 -16
  113. package/lib/asset/WebManifestGenerator.js +8 -10
  114. package/lib/asset/WebManifestParser.js +24 -10
  115. package/lib/async-modules/AsyncModuleHelpers.js +2 -2
  116. package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
  117. package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
  118. package/lib/async-modules/isGeneratorLowered.js +4 -4
  119. package/lib/buildChunkGraph.js +36 -27
  120. package/lib/bun/BunTargetPlugin.js +1 -1
  121. package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
  122. package/lib/cache/AddManagedPathsPlugin.js +1 -1
  123. package/lib/cache/IdleFileCachePlugin.js +2 -2
  124. package/lib/cache/MemoryCachePlugin.js +18 -10
  125. package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
  126. package/lib/cache/PackFileCacheStrategy.js +289 -28
  127. package/lib/cache/ResolverCachePlugin.js +38 -18
  128. package/lib/cache/getLazyHashedEtag.js +1 -2
  129. package/lib/cache/mergeEtags.js +1 -1
  130. package/lib/cli.js +1 -3
  131. package/lib/config/browserslistTargetHandler.js +41 -5
  132. package/lib/config/defaults.js +276 -81
  133. package/lib/config/defineConfig.js +10 -2
  134. package/lib/config/getClaimedAssetTypes.js +65 -0
  135. package/lib/config/normalization.js +36 -16
  136. package/lib/config/target.js +46 -3
  137. package/lib/container/ContainerEntryDependency.js +1 -1
  138. package/lib/container/ContainerEntryModule.js +24 -15
  139. package/lib/container/ContainerEntryModuleFactory.js +7 -3
  140. package/lib/container/ContainerPlugin.js +9 -10
  141. package/lib/container/ContainerReferencePlugin.js +6 -2
  142. package/lib/container/FallbackDependency.js +1 -1
  143. package/lib/container/FallbackModule.js +24 -17
  144. package/lib/container/FallbackModuleFactory.js +7 -3
  145. package/lib/container/HoistContainerReferencesPlugin.js +6 -11
  146. package/lib/container/ModuleFederationPlugin.js +7 -18
  147. package/lib/container/RemoteModule.js +27 -19
  148. package/lib/container/RemoteRuntimeModule.js +10 -8
  149. package/lib/container/moduleFederationHooks.js +32 -0
  150. package/lib/css/CssGenerator.js +177 -41
  151. package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
  152. package/lib/css/CssLoadingRuntimeModule.js +82 -36
  153. package/lib/css/CssModule.js +10 -7
  154. package/lib/css/CssModulesPlugin.js +197 -106
  155. package/lib/css/CssParser.js +1113 -568
  156. package/lib/css/CssServerStylesRuntimeModule.js +54 -0
  157. package/lib/css/cssMinify.js +168 -0
  158. package/lib/css/data.js +5324 -0
  159. package/lib/css/syntax.js +9579 -232
  160. package/lib/debug/ProfilingPlugin.js +14 -9
  161. package/lib/deno/DenoTargetPlugin.js +1 -1
  162. package/lib/dependencies/AMDDefineDependency.js +112 -87
  163. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
  164. package/lib/dependencies/AMDPlugin.js +9 -7
  165. package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
  166. package/lib/dependencies/AMDRequireContextDependency.js +2 -2
  167. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
  168. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
  169. package/lib/dependencies/AMDRequireDependency.js +8 -7
  170. package/lib/dependencies/AMDRequireItemDependency.js +1 -1
  171. package/lib/dependencies/AMDRuntimeModules.js +21 -1
  172. package/lib/dependencies/BuildTimeConstDependency.js +102 -0
  173. package/lib/dependencies/CachedConstDependency.js +11 -8
  174. package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
  175. package/lib/dependencies/CommonJsExportRequireDependency.js +121 -45
  176. package/lib/dependencies/CommonJsExportsDependency.js +53 -49
  177. package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
  178. package/lib/dependencies/CommonJsFullRequireDependency.js +140 -26
  179. package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -48
  180. package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
  181. package/lib/dependencies/CommonJsPlugin.js +35 -6
  182. package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
  183. package/lib/dependencies/CommonJsRequireDependency.js +156 -27
  184. package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
  185. package/lib/dependencies/ConstDependency.js +8 -9
  186. package/lib/dependencies/ContextDependency.js +12 -8
  187. package/lib/dependencies/ContextDependencyHelpers.js +14 -9
  188. package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
  189. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -4
  190. package/lib/dependencies/ContextElementDependency.js +31 -12
  191. package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
  192. package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
  193. package/lib/dependencies/CssIcssExportDependency.js +56 -28
  194. package/lib/dependencies/CssIcssImportDependency.js +17 -13
  195. package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
  196. package/lib/dependencies/CssImportDependency.js +18 -9
  197. package/lib/dependencies/CssUrlDependency.js +17 -13
  198. package/lib/dependencies/DllEntryDependency.js +1 -1
  199. package/lib/dependencies/DynamicExports.js +2 -2
  200. package/lib/dependencies/ExportBindingInitFragment.js +36 -9
  201. package/lib/dependencies/ExportsInfoDependency.js +7 -8
  202. package/lib/dependencies/ExternalModuleDependency.js +9 -5
  203. package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
  204. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
  205. package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
  206. package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
  207. package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
  208. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +13 -10
  209. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +78 -12
  210. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  211. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  212. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +143 -63
  213. package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
  214. package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
  215. package/lib/dependencies/HarmonyExports.js +7 -4
  216. package/lib/dependencies/HarmonyImportDependency.js +27 -19
  217. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +31 -24
  218. package/lib/dependencies/HarmonyImportGuard.js +21 -30
  219. package/lib/dependencies/HarmonyImportSideEffectDependency.js +38 -9
  220. package/lib/dependencies/HarmonyImportSpecifierDependency.js +97 -49
  221. package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
  222. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
  223. package/lib/dependencies/HtmlEntryDependency.js +37 -29
  224. package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
  225. package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
  226. package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
  227. package/lib/dependencies/HtmlSourceDependency.js +22 -14
  228. package/lib/dependencies/ImportContextDependency.js +2 -2
  229. package/lib/dependencies/ImportDependency.js +24 -20
  230. package/lib/dependencies/ImportEagerDependency.js +6 -9
  231. package/lib/dependencies/ImportMetaContextDependency.js +2 -2
  232. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
  233. package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
  234. package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
  235. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
  236. package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
  237. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
  238. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
  239. package/lib/dependencies/ImportMetaPlugin.js +154 -71
  240. package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
  241. package/lib/dependencies/ImportParserPlugin.js +49 -35
  242. package/lib/dependencies/ImportPhase.js +12 -5
  243. package/lib/dependencies/ImportPlugin.js +7 -3
  244. package/lib/dependencies/ImportWeakDependency.js +6 -9
  245. package/lib/dependencies/JsonExportsDependency.js +11 -7
  246. package/lib/dependencies/LoaderDependency.js +2 -2
  247. package/lib/dependencies/LoaderImportDependency.js +2 -2
  248. package/lib/dependencies/LoaderPlugin.js +11 -7
  249. package/lib/dependencies/LocalModuleDependency.js +5 -5
  250. package/lib/dependencies/LocalModulesHelpers.js +1 -1
  251. package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
  252. package/lib/dependencies/ModuleDependency.js +9 -6
  253. package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
  254. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
  255. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  256. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
  257. package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
  258. package/lib/dependencies/NullDependency.js +3 -3
  259. package/lib/dependencies/ProvidedDependency.js +14 -10
  260. package/lib/dependencies/PureExpressionDependency.js +9 -10
  261. package/lib/dependencies/RequireContextDependency.js +2 -2
  262. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
  263. package/lib/dependencies/RequireContextPlugin.js +8 -4
  264. package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
  265. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
  266. package/lib/dependencies/RequireEnsureDependency.js +8 -7
  267. package/lib/dependencies/RequireEnsurePlugin.js +7 -3
  268. package/lib/dependencies/RequireHeaderDependency.js +51 -12
  269. package/lib/dependencies/RequireIncludeDependency.js +6 -6
  270. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
  271. package/lib/dependencies/RequireIncludePlugin.js +7 -3
  272. package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
  273. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  274. package/lib/dependencies/RequireResolveDependency.js +4 -4
  275. package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
  276. package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
  277. package/lib/dependencies/StaticExportsDependency.js +2 -2
  278. package/lib/dependencies/SystemPlugin.js +10 -6
  279. package/lib/dependencies/SystemRuntimeModule.js +10 -0
  280. package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
  281. package/lib/dependencies/URLContextDependency.js +2 -2
  282. package/lib/dependencies/URLDependency.js +110 -64
  283. package/lib/dependencies/URLPlugin.js +7 -3
  284. package/lib/dependencies/UnsupportedDependency.js +4 -4
  285. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
  286. package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
  287. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
  288. package/lib/dependencies/WorkerAndWorkletPlugin.js +46 -28
  289. package/lib/dependencies/WorkerDependency.js +28 -22
  290. package/lib/dependencies/WorkletDependency.js +15 -14
  291. package/lib/dependencies/getFunctionExpression.js +8 -4
  292. package/lib/dependencies/processExportInfo.js +5 -5
  293. package/lib/dll/DelegatedModule.js +34 -22
  294. package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
  295. package/lib/dll/DelegatedPlugin.js +2 -2
  296. package/lib/dll/DllEntryPlugin.js +2 -2
  297. package/lib/dll/DllModule.js +22 -15
  298. package/lib/dll/DllModuleFactory.js +7 -3
  299. package/lib/dll/DllPlugin.js +7 -5
  300. package/lib/dll/DllReferencePlugin.js +10 -7
  301. package/lib/dll/LibManifestPlugin.js +5 -5
  302. package/lib/electron/ElectronTargetPlugin.js +53 -49
  303. package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
  304. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  305. package/lib/errors/BroadContextsWarning.js +43 -0
  306. package/lib/errors/BuildCycleError.js +1 -1
  307. package/lib/errors/CacheEffectivenessWarning.js +55 -0
  308. package/lib/errors/ChunkRenderError.js +1 -1
  309. package/lib/errors/CircularDependenciesWarning.js +38 -0
  310. package/lib/errors/CodeGenerationError.js +1 -1
  311. package/lib/errors/CommentCompilationWarning.js +1 -1
  312. package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
  313. package/lib/errors/DuplicateModulesWarning.js +45 -0
  314. package/lib/errors/DynamicExportsWarning.js +30 -0
  315. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  316. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  317. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  318. package/lib/errors/EvalUsageWarning.js +28 -0
  319. package/lib/errors/HookWebpackError.js +5 -5
  320. package/lib/errors/HotspotsWarning.js +57 -0
  321. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  322. package/lib/errors/InlinedAssetsWarning.js +36 -0
  323. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  324. package/lib/errors/LargeModulesWarning.js +45 -0
  325. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  326. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  327. package/lib/errors/MixedExportsWarning.js +41 -0
  328. package/lib/errors/ModuleDependencyError.js +13 -16
  329. package/lib/errors/ModuleDependencyWarning.js +5 -15
  330. package/lib/errors/ModuleHashingError.js +1 -1
  331. package/lib/errors/ModuleNotFoundError.js +2 -2
  332. package/lib/errors/ModuleParseError.js +1 -2
  333. package/lib/errors/ModuleRestoreError.js +1 -1
  334. package/lib/errors/ModuleStoreError.js +1 -1
  335. package/lib/errors/NodeStuffInWebError.js +1 -1
  336. package/lib/errors/OsDependentRuleWarning.js +31 -0
  337. package/lib/errors/PureAnnotationsWarning.js +36 -0
  338. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  339. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  340. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  341. package/lib/errors/TinyChunksWarning.js +40 -0
  342. package/lib/errors/TopLevelThisWarning.js +34 -0
  343. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  344. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  345. package/lib/errors/UnusedAliasesWarning.js +29 -0
  346. package/lib/errors/UnusedDefinesWarning.js +29 -0
  347. package/lib/errors/UnusedExternalsWarning.js +29 -0
  348. package/lib/errors/UnusedReexportsWarning.js +42 -0
  349. package/lib/errors/UnusedRuleWarning.js +29 -0
  350. package/lib/errors/WebpackError.js +9 -5
  351. package/lib/errors/deriveStackFromNestedError.js +90 -0
  352. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  353. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  354. package/lib/esm/ModuleChunkLoadingPlugin.js +89 -51
  355. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +170 -71
  356. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  357. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  358. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  359. package/lib/hmr/lazyCompilationBackend.js +9 -6
  360. package/lib/hmr/parserHooks.js +56 -0
  361. package/lib/html/HtmlGenerator.js +276 -76
  362. package/lib/html/HtmlModule.js +7 -3
  363. package/lib/html/HtmlModulesPlugin.js +312 -174
  364. package/lib/html/HtmlParser.js +31 -86
  365. package/lib/html/data.js +1928 -0
  366. package/lib/html/htmlMinify.js +288 -0
  367. package/lib/html/syntax.js +5557 -1155
  368. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  369. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  370. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  371. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  372. package/lib/ids/IdHelpers.js +7 -8
  373. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  374. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  375. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  376. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  377. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  378. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  379. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  380. package/lib/index.js +10 -0
  381. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  382. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  383. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  384. package/lib/javascript/ChunkHelpers.js +1 -1
  385. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  386. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  387. package/lib/javascript/JavascriptGenerator.js +64 -164
  388. package/lib/javascript/JavascriptModule.js +9 -3
  389. package/lib/javascript/JavascriptModulesPlugin.js +181 -162
  390. package/lib/javascript/JavascriptParser.js +286 -110
  391. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  392. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  393. package/lib/javascript/StartupHelpers.js +55 -9
  394. package/lib/javascript/syntax.js +2678 -232
  395. package/lib/json/JsonData.js +8 -4
  396. package/lib/json/JsonGenerator.js +37 -15
  397. package/lib/json/JsonModule.js +7 -3
  398. package/lib/json/JsonModulesPlugin.js +1 -1
  399. package/lib/json/JsonParser.js +5 -6
  400. package/lib/library/AbstractLibraryPlugin.js +20 -14
  401. package/lib/library/AmdLibraryPlugin.js +11 -7
  402. package/lib/library/AssignLibraryPlugin.js +19 -13
  403. package/lib/library/EnableLibraryPlugin.js +2 -2
  404. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  405. package/lib/library/JsonpLibraryPlugin.js +11 -7
  406. package/lib/library/ModuleLibraryPlugin.js +256 -64
  407. package/lib/library/SystemLibraryPlugin.js +12 -8
  408. package/lib/library/UmdLibraryPlugin.js +62 -25
  409. package/lib/loaders/LoaderRunner.js +14 -1
  410. package/lib/loaders/loadLoader.js +8 -4
  411. package/lib/logging/createConsoleLogger.js +7 -4
  412. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  413. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  414. package/lib/node/NodeSourcePlugin.js +1 -1
  415. package/lib/node/NodeTargetPlugin.js +4 -3
  416. package/lib/node/NodeTemplatePlugin.js +1 -1
  417. package/lib/node/NodeWatchFileSystem.js +70 -9
  418. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  419. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +72 -19
  420. package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
  421. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  422. package/lib/node/nodeConsole.js +7 -3
  423. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  424. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  425. package/lib/optimize/ConcatenatedModule.js +985 -470
  426. package/lib/optimize/ConstExportsPlugin.js +11 -7
  427. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  428. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  429. package/lib/optimize/InlineExports.js +9 -5
  430. package/lib/optimize/InnerGraph.js +28 -12
  431. package/lib/optimize/InnerGraphPlugin.js +23 -18
  432. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  433. package/lib/optimize/MangleExportsPlugin.js +7 -8
  434. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  435. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  436. package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
  437. package/lib/optimize/RealContentHashPlugin.js +20 -13
  438. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  439. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  440. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  441. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  442. package/lib/optimize/SplitChunksPlugin.js +86 -24
  443. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  444. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  445. package/lib/performance/BroadContextsPlugin.js +142 -0
  446. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  447. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  448. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  449. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  450. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  451. package/lib/performance/DynamicExportsPlugin.js +120 -0
  452. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  453. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  454. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  455. package/lib/performance/EvalUsagePlugin.js +115 -0
  456. package/lib/performance/HotspotsPlugin.js +296 -0
  457. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  458. package/lib/performance/LargeModulesPlugin.js +126 -0
  459. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  460. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  461. package/lib/performance/MixedExportsPlugin.js +136 -0
  462. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  463. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  464. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  465. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  466. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  467. package/lib/performance/SizeLimitsPlugin.js +139 -7
  468. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  469. package/lib/performance/TinyChunksPlugin.js +128 -0
  470. package/lib/performance/TopLevelThisPlugin.js +208 -0
  471. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  472. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  473. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  474. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  475. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  476. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  477. package/lib/performance/getModuleSize.js +22 -0
  478. package/lib/performance/getSourceModules.js +22 -0
  479. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  480. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  481. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  482. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  483. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  484. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  485. package/lib/prefetch/ResourceHintPlugin.js +295 -78
  486. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  487. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  488. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  489. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  490. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  491. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  492. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  493. package/lib/rules/RuleSetCompiler.js +146 -12
  494. package/lib/rules/UseEffectRulePlugin.js +18 -11
  495. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  496. package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
  497. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  498. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  499. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  500. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  501. package/lib/runtime/CompatRuntimeModule.js +5 -3
  502. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  503. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  504. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  505. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  506. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  507. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  508. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  509. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  510. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  511. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  512. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  513. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  514. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  515. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  516. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  517. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +23 -6
  518. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  519. package/lib/runtime/NonceRuntimeModule.js +10 -0
  520. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  521. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  522. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  523. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  524. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  525. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  526. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  527. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  528. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  529. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  530. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  531. package/lib/runtime/baseUri.js +63 -0
  532. package/lib/schemes/DataUriPlugin.js +1 -1
  533. package/lib/schemes/FileUriPlugin.js +1 -1
  534. package/lib/schemes/HttpUriPlugin.js +24 -15
  535. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  536. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  537. package/lib/serialization/BinaryMiddleware.js +4 -4
  538. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  539. package/lib/serialization/FileMiddleware.js +305 -66
  540. package/lib/serialization/ObjectMiddleware.js +11 -6
  541. package/lib/serialization/PlainObjectSerializer.js +19 -16
  542. package/lib/sharing/ConsumeSharedModule.js +30 -21
  543. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  544. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  545. package/lib/sharing/ProvideSharedModule.js +25 -16
  546. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  547. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  548. package/lib/sharing/SharePlugin.js +17 -5
  549. package/lib/sharing/ShareRuntimeModule.js +4 -4
  550. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  551. package/lib/sharing/utils.js +1 -3
  552. package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
  553. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  554. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
  555. package/lib/stats/StatsFactory.js +25 -26
  556. package/lib/stats/StatsPrinter.js +16 -12
  557. package/lib/typescript/TypeScriptPlugin.js +12 -14
  558. package/lib/url/URLParserPlugin.js +26 -13
  559. package/lib/util/AsyncQueue.js +4 -3
  560. package/lib/util/Hash.js +5 -1
  561. package/lib/util/LazySet.js +35 -22
  562. package/lib/util/LocConverter.js +36 -13
  563. package/lib/util/SourceProcessor.js +1050 -24
  564. package/lib/util/StringXor.js +1 -1
  565. package/lib/util/chainedImports.js +9 -5
  566. package/lib/util/cleverMerge.js +1 -1
  567. package/lib/util/comparators.js +45 -14
  568. package/lib/util/concatenate.js +203 -77
  569. package/lib/util/conventions.js +5 -1
  570. package/lib/util/createHash.js +2 -2
  571. package/lib/util/createHooksRegistry.js +8 -10
  572. package/lib/util/dataURL.js +225 -1
  573. package/lib/util/extractSourceMap.js +4 -3
  574. package/lib/util/findCaseMismatch.js +139 -0
  575. package/lib/util/formatLocation.js +1 -2
  576. package/lib/util/fs.js +22 -5
  577. package/lib/util/globUtils.js +298 -24
  578. package/lib/util/hash/BatchedHash.js +5 -1
  579. package/lib/util/hash/BulkUpdateHash.js +5 -1
  580. package/lib/util/hash/DebugHash.js +5 -1
  581. package/lib/util/hash/hash-digest.js +6 -2
  582. package/lib/util/identifier.js +25 -1
  583. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  584. package/lib/util/internalSerializables.js +6 -0
  585. package/lib/util/lazyModule.js +56 -0
  586. package/lib/util/makeSerializable.js +7 -3
  587. package/lib/util/matchAlias.js +25 -0
  588. package/lib/util/mimeTypes.js +11 -5
  589. package/lib/util/nonNumericOnlyHash.js +4 -3
  590. package/lib/util/parseJson.js +5 -3
  591. package/lib/util/preloadModuleType.js +32 -0
  592. package/lib/util/registerExternalSerializer.js +7 -5
  593. package/lib/util/runtime.js +2 -2
  594. package/lib/util/semver.js +1 -1
  595. package/lib/util/serialization.js +28 -28
  596. package/lib/util/source.js +2 -2
  597. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  598. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  599. package/lib/wasm/wasmModuleFilename.js +54 -0
  600. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +41 -21
  601. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +43 -21
  602. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  603. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  604. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +54 -16
  605. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  606. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  607. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +34 -8
  608. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  609. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  610. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  611. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  612. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  613. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +4 -6
  614. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  615. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  616. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  617. package/lib/web/FetchCompileAsyncWasmPlugin.js +101 -19
  618. package/lib/web/FetchCompileWasmPlugin.js +46 -16
  619. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  620. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  621. package/lib/web/JsonpTemplatePlugin.js +2 -2
  622. package/lib/webpack.js +22 -11
  623. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  624. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  625. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  626. package/module.d.ts +1 -0
  627. package/package.json +23 -16
  628. package/schemas/WebpackOptions.check.js +1 -1
  629. package/schemas/WebpackOptions.json +780 -91
  630. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  631. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  632. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  633. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  634. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  635. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  636. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  637. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  638. package/types.d.ts +4010 -739
  639. package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
@@ -6,12 +6,19 @@
6
6
  "use strict";
7
7
 
8
8
  const RuntimeGlobals = require("../RuntimeGlobals");
9
- const ExportWebpackRequireRuntimeModule = require("./ExportWebpackRequireRuntimeModule");
10
- const ModuleChunkLoadingRuntimeModule = require("./ModuleChunkLoadingRuntimeModule");
9
+ const lazyModule = require("../util/lazyModule");
11
10
 
12
- /** @typedef {import("../Chunk")} Chunk */
13
- /** @typedef {import("../Compiler")} Compiler */
14
- /** @typedef {import("../Module").RuntimeRequirements} RuntimeRequirements */
11
+ /** @import Chunk from "../Chunk" */
12
+ /** @import Compiler from "../Compiler" */
13
+ /** @import { RuntimeRequirements } from "../Module" */
14
+
15
+ // only a chunk that loads other chunks at runtime emits these
16
+ const getExportWebpackRequireRuntimeModule = lazyModule(() =>
17
+ require("./ExportWebpackRequireRuntimeModule")
18
+ );
19
+ const getModuleChunkLoadingRuntimeModule = lazyModule(() =>
20
+ require("./ModuleChunkLoadingRuntimeModule")
21
+ );
15
22
 
16
23
  const PLUGIN_NAME = "ModuleChunkLoadingPlugin";
17
24
 
@@ -48,65 +55,89 @@ class ModuleChunkLoadingPlugin {
48
55
  if (onceForChunkSet.has(chunk)) return;
49
56
  onceForChunkSet.add(chunk);
50
57
  if (!isEnabledForChunk(chunk)) return;
51
- set.add(RuntimeGlobals.moduleFactoriesAddOnly);
52
- set.add(RuntimeGlobals.hasOwnProperty);
53
- compilation.addRuntimeModule(
58
+ compilation.addLazyRuntimeModule(
54
59
  chunk,
55
- new ModuleChunkLoadingRuntimeModule(set)
60
+ getModuleChunkLoadingRuntimeModule,
61
+ (Ctor) => new Ctor(set)
56
62
  );
57
63
  };
58
- compilation.hooks.runtimeRequirementInTree
59
- .for(RuntimeGlobals.ensureChunkHandlers)
60
- .tap(PLUGIN_NAME, handler);
61
- compilation.hooks.runtimeRequirementInTree
62
- .for(RuntimeGlobals.baseURI)
63
- .tap(PLUGIN_NAME, handler);
64
- compilation.hooks.runtimeRequirementInTree
65
- .for(RuntimeGlobals.externalInstallChunk)
66
- .tap(PLUGIN_NAME, handler);
67
- compilation.hooks.runtimeRequirementInTree
68
- .for(RuntimeGlobals.analyzableChunkImport)
69
- .tap(PLUGIN_NAME, handler);
70
- compilation.hooks.runtimeRequirementInTree
71
- .for(RuntimeGlobals.onChunksLoaded)
72
- .tap(PLUGIN_NAME, handler);
73
- compilation.hooks.runtimeRequirementInTree
74
- .for(RuntimeGlobals.hmrDownloadUpdateHandlers)
75
- .tap(PLUGIN_NAME, handler);
76
- compilation.hooks.runtimeRequirementInTree
77
- .for(RuntimeGlobals.hmrDownloadManifest)
78
- .tap(PLUGIN_NAME, handler);
64
+ /**
65
+ * Installing a chunk is the only part that writes the module factories and
66
+ * looks a chunk id up; a base uri, `onChunksLoaded` or the hot manifest come
67
+ * without either. Kept off `handler`, which runs once per chunk and so cannot
68
+ * see which of the requirements below the chunk ends up with.
69
+ * @param {Chunk} chunk chunk to check
70
+ * @param {RuntimeRequirements} set runtime requirements
71
+ */
72
+ const installHandler = (chunk, set) => {
73
+ if (!isEnabledForChunk(chunk)) return;
74
+ set.add(RuntimeGlobals.moduleFactoriesAddOnly);
75
+ set.add(RuntimeGlobals.hasOwnProperty);
76
+ };
77
+ for (const requirement of [
78
+ RuntimeGlobals.ensureChunkHandlers,
79
+ RuntimeGlobals.baseURI,
80
+ RuntimeGlobals.externalInstallChunk,
81
+ RuntimeGlobals.analyzableChunkImport,
82
+ RuntimeGlobals.onChunksLoaded,
83
+ RuntimeGlobals.hmrDownloadUpdateHandlers,
84
+ RuntimeGlobals.hmrDownloadManifest
85
+ ]) {
86
+ compilation.hooks.runtimeRequirementInTree
87
+ .for(requirement)
88
+ .tap(PLUGIN_NAME, handler);
89
+ }
90
+ for (const requirement of [
91
+ RuntimeGlobals.ensureChunkHandlers,
92
+ RuntimeGlobals.externalInstallChunk,
93
+ RuntimeGlobals.analyzableChunkImport,
94
+ RuntimeGlobals.hmrDownloadUpdateHandlers
95
+ ]) {
96
+ compilation.hooks.runtimeRequirementInTree
97
+ .for(requirement)
98
+ .tap(PLUGIN_NAME, installHandler);
99
+ }
79
100
  compilation.hooks.runtimeRequirementInTree
80
101
  .for(RuntimeGlobals.externalInstallChunk)
81
102
  .tap(PLUGIN_NAME, (chunk) => {
82
103
  if (!isEnabledForChunk(chunk)) return;
83
- compilation.addRuntimeModule(
104
+ compilation.addLazyRuntimeModule(
84
105
  chunk,
85
- new ExportWebpackRequireRuntimeModule()
106
+ getExportWebpackRequireRuntimeModule,
107
+ (Ctor) => new Ctor()
86
108
  );
87
109
  });
88
110
 
89
- // The prefetch/preload handlers build the chunk URL themselves, so they need
90
- // the public path and script filename directly — without relying on
91
- // `ensureChunkHandlers` to pull them in (an analyzable `import()` may replace it).
92
- compilation.hooks.runtimeRequirementInTree
93
- .for(RuntimeGlobals.prefetchChunkHandlers)
94
- .tap(PLUGIN_NAME, (chunk, set) => {
95
- if (!isEnabledForChunk(chunk)) return;
96
- set.add(RuntimeGlobals.publicPath);
97
- set.add(RuntimeGlobals.getChunkScriptFilename);
98
- });
99
-
100
- compilation.hooks.runtimeRequirementInTree
101
- .for(RuntimeGlobals.preloadChunkHandlers)
102
- .tap(PLUGIN_NAME, (chunk, set) => {
103
- if (!isEnabledForChunk(chunk)) return;
104
- set.add(RuntimeGlobals.publicPath);
105
- set.add(RuntimeGlobals.getChunkScriptFilename);
106
- });
111
+ // A handler that builds its url asks for both directly: an analyzable
112
+ // `import()` may replace `ensureChunkHandlers`, which otherwise pulls them in.
113
+ for (const requirement of [
114
+ RuntimeGlobals.prefetchChunkHandlers,
115
+ RuntimeGlobals.preloadChunkHandlers
116
+ ]) {
117
+ compilation.hooks.runtimeRequirementInTree
118
+ .for(requirement)
119
+ .tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
120
+ if (!isEnabledForChunk(chunk)) return;
121
+ // A baked url carries where the chunk is, so neither is read for it.
122
+ // Asked as the runtime module asks, so the two always agree.
123
+ if (
124
+ compilation.runtimeTemplate.analyzableChunkScriptUrls(
125
+ chunk,
126
+ chunkGraph,
127
+ set
128
+ ) !== null
129
+ ) {
130
+ return;
131
+ }
132
+ set.add(RuntimeGlobals.publicPath);
133
+ set.add(RuntimeGlobals.getChunkScriptFilename);
134
+ });
135
+ }
107
136
 
137
+ // Keyed on `ensureChunk`, not on the handler map: only the runtime chunk loader
138
+ // builds a URL from a chunk id, and an analyzable `import()` carries its own.
108
139
  compilation.hooks.runtimeRequirementInTree
109
- .for(RuntimeGlobals.ensureChunkHandlers)
140
+ .for(RuntimeGlobals.ensureChunk)
110
141
  .tap(PLUGIN_NAME, (chunk, set) => {
111
142
  if (!isEnabledForChunk(chunk)) return;
112
143
 
@@ -123,6 +154,13 @@ class ModuleChunkLoadingPlugin {
123
154
  if (!isEnabledForChunk(chunk)) return;
124
155
  set.add(RuntimeGlobals.publicPath);
125
156
  set.add(RuntimeGlobals.getChunkUpdateScriptFilename);
157
+ // The hot runtime force-loads through the handler map by bare chunk id, so
158
+ // the map and loader stay however analyzable — but only where there are
159
+ // async chunks to force-load.
160
+ if (chunk.hasAsyncChunks()) {
161
+ set.add(RuntimeGlobals.ensureChunkHandlers);
162
+ set.add(RuntimeGlobals.getChunkScriptFilename);
163
+ }
126
164
  set.add(RuntimeGlobals.moduleCache);
127
165
  set.add(RuntimeGlobals.hmrModuleData);
128
166
  set.add(RuntimeGlobals.moduleFactoriesAddOnly);
@@ -5,31 +5,41 @@
5
5
  "use strict";
6
6
 
7
7
  const { SyncWaterfallHook } = require("tapable");
8
- /** @typedef {import("../Compilation")} Compilation */
8
+ /** @import Compilation from "../Compilation" */
9
9
  const RuntimeGlobals = require("../RuntimeGlobals");
10
10
  const RuntimeModule = require("../RuntimeModule");
11
11
  const Template = require("../Template");
12
12
  const {
13
13
  generateJavascriptHMR
14
14
  } = require("../hmr/JavascriptHotModuleReplacementHelper");
15
- const {
16
- chunkHasJs,
17
- getChunkFilenameTemplate
18
- } = require("../javascript/JavascriptModulesPlugin");
15
+ const { chunkHasJs } = require("../javascript/JavascriptModulesPlugin");
19
16
  const { getInitialChunkIds } = require("../javascript/StartupHelpers");
17
+ const { renderBaseUri } = require("../runtime/baseUri");
20
18
  const compileBooleanMatcher = require("../util/compileBooleanMatcher");
21
19
  const createHooksRegistry = require("../util/createHooksRegistry");
22
- const { getUndoPath } = require("../util/identifier");
20
+ const memoize = require("../util/memoize");
21
+
22
+ const getAPIPlugin = memoize(() => require("../APIPlugin"));
23
23
 
24
- /** @typedef {import("../Chunk")} Chunk */
25
- /** @typedef {import("../ChunkGraph")} ChunkGraph */
26
- /** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
24
+ /** @import Chunk from "../Chunk" */
25
+ /** @import ChunkGraph from "../ChunkGraph" */
26
+ /** @import { ReadOnlyRuntimeRequirements } from "../Module" */
27
+
28
+ const createCompilationHooks = () => ({
29
+ /**
30
+ * @type {SyncWaterfallHook<[string, Chunk]>}
31
+ * @since 5.41.0
32
+ */
33
+ linkPreload: new SyncWaterfallHook(["source", "chunk"]),
34
+ /**
35
+ * @type {SyncWaterfallHook<[string, Chunk]>}
36
+ * @since 5.41.0
37
+ */
38
+ linkPrefetch: new SyncWaterfallHook(["source", "chunk"])
39
+ });
27
40
 
28
41
  /**
29
- * Defines the jsonp compilation plugin hooks type used by this module.
30
- * @typedef {object} JsonpCompilationPluginHooks
31
- * @property {SyncWaterfallHook<[string, Chunk]>} linkPreload
32
- * @property {SyncWaterfallHook<[string, Chunk]>} linkPrefetch
42
+ * @typedef {ReturnType<typeof createCompilationHooks>} JsonpCompilationPluginHooks
33
43
  */
34
44
 
35
45
  class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
@@ -52,16 +62,14 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
52
62
  */
53
63
  _generateBaseUri(chunk, rootOutputDir) {
54
64
  const options = chunk.getEntryOptions();
55
- if (options && options.baseUri) {
56
- return `${RuntimeGlobals.baseURI} = ${JSON.stringify(options.baseUri)};`;
57
- }
58
65
  const compilation = /** @type {Compilation} */ (this.compilation);
59
66
  const {
60
67
  outputOptions: { importMetaName }
61
68
  } = compilation;
62
- return `${RuntimeGlobals.baseURI} = new URL(${JSON.stringify(
63
- rootOutputDir
64
- )}, ${importMetaName}.url);`;
69
+ return renderBaseUri(
70
+ options ? options.baseUri : undefined,
71
+ `new URL(${JSON.stringify(rootOutputDir)}, ${importMetaName}.url)`
72
+ );
65
73
  }
66
74
 
67
75
  /**
@@ -75,8 +83,14 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
75
83
  const environment = compilation.outputOptions.environment;
76
84
  const {
77
85
  runtimeTemplate,
78
- outputOptions: { importFunctionName, crossOriginLoading, charset }
86
+ outputOptions: {
87
+ importFunctionName,
88
+ crossOriginLoading,
89
+ charset,
90
+ resourceHints
91
+ }
79
92
  } = compilation;
93
+ const dedupePrefetch = Boolean(resourceHints && resourceHints.dedupe);
80
94
  const fn = RuntimeGlobals.ensureChunkHandlers;
81
95
  const withBaseURI = this._runtimeRequirements.has(RuntimeGlobals.baseURI);
82
96
  const withExternalInstallChunk = this._runtimeRequirements.has(
@@ -97,6 +111,11 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
97
111
  const withHmrManifest = this._runtimeRequirements.has(
98
112
  RuntimeGlobals.hmrDownloadManifest
99
113
  );
114
+ // `.f.j` serves `ensureChunk`: an analyzable import dispatches every handler but
115
+ // this one. HMR's force-load knows only a chunk id, so it needs the loader too.
116
+ const withJsLoading =
117
+ withLoading &&
118
+ (this._runtimeRequirements.has(RuntimeGlobals.ensureChunk) || withHmr);
100
119
  const { linkPreload, linkPrefetch } =
101
120
  ModuleChunkLoadingRuntimeModule.getCompilationHooks(compilation);
102
121
  const isNeutralPlatform = runtimeTemplate.isNeutralPlatform();
@@ -108,22 +127,35 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
108
127
  (environment.document || isNeutralPlatform) &&
109
128
  this._runtimeRequirements.has(RuntimeGlobals.preloadChunkHandlers) &&
110
129
  chunk.hasChildByOrder(chunkGraph, "preload", true, chunkHasJs);
130
+ // Under module output each hinted chunk is a known file, so the urls are written
131
+ // out and read by id rather than built from the chunk id at runtime.
132
+ const chunkUrls =
133
+ withPrefetch || withPreload
134
+ ? runtimeTemplate.analyzableChunkScriptUrls(
135
+ chunk,
136
+ chunkGraph,
137
+ this._runtimeRequirements,
138
+ this
139
+ )
140
+ : null;
111
141
  const conditionMap = chunkGraph.getChunkConditionMap(chunk, chunkHasJs);
112
142
  const hasJsMatcher = compileBooleanMatcher(conditionMap);
113
143
  const initialChunkIds = getInitialChunkIds(chunk, chunkGraph, chunkHasJs);
114
144
 
115
- const outputName = compilation.getPath(
116
- getChunkFilenameTemplate(chunk, compilation.outputOptions),
117
- {
118
- chunk,
119
- contentHashType: "javascript"
120
- }
121
- );
122
- const rootOutputDir = getUndoPath(
123
- outputName,
124
- compilation.outputOptions.path,
125
- true
126
- );
145
+ const rootOutputDir = runtimeTemplate.chunkRootOutputDir(chunk, true);
146
+
147
+ const { publicPath } = compilation.outputOptions;
148
+ // `import()` resolves a bare specifier as a package name, so a public path that
149
+ // leaves one — empty, or a plain relative directory — needs an explicit `./`.
150
+ // A runtime override can swap in an absolute path, so leave those alone.
151
+ const chunkImportBase =
152
+ publicPath === "auto"
153
+ ? JSON.stringify(rootOutputDir)
154
+ : typeof publicPath === "string" &&
155
+ !/^(?:\.{0,2}\/|[a-zA-Z][\w+.-]*:)/.test(publicPath) &&
156
+ !getAPIPlugin().usesRuntimePublicPathOverride(compilation)
157
+ ? `"./" + ${RuntimeGlobals.publicPath}`
158
+ : RuntimeGlobals.publicPath;
127
159
 
128
160
  const stateExpression = withHmr
129
161
  ? `${RuntimeGlobals.hmrRuntimeStatePrefix}_module`
@@ -136,19 +168,58 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
136
168
  ",\n"
137
169
  )
138
170
  )}\n}`;
171
+ // Every part below that reads the table. A chunk asking only for `.b` gets this
172
+ // module for the base uri alone, and then has nothing to look up.
173
+ const withInstalledChunks =
174
+ withLoading ||
175
+ withExternalInstallChunk ||
176
+ withAnalyzableImport ||
177
+ withOnChunkLoad ||
178
+ withHmr ||
179
+ withPrefetch ||
180
+ withPreload;
181
+ // The url is read through a thunk so a runtime hinting at many chunks builds only
182
+ // the one it appends.
183
+ /**
184
+ * @param {string} id expression naming the chunk whose url is wanted
185
+ * @returns {string} expression evaluating to its url
186
+ */
187
+ const chunkUrl = (id) =>
188
+ chunkUrls === null
189
+ ? `${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkScriptFilename}(${id})`
190
+ : `chunkUrls[${id}]()`;
139
191
  return Template.asString([
140
192
  withBaseURI
141
193
  ? this._generateBaseUri(chunk, rootOutputDir)
142
194
  : "// no baseURI",
143
195
  "",
144
- "// object to store loaded and loading chunks",
145
- "// undefined = chunk not loaded, null = chunk preloaded/prefetched",
146
- "// [resolve, Promise] = chunk loading, 0 = chunk loaded",
147
- `${cst} installedChunks = ${
148
- stateExpression
149
- ? runtimeTemplate.assignOr(stateExpression, installedChunksObject)
150
- : installedChunksObject
151
- };`,
196
+ ...(chunkUrls
197
+ ? [
198
+ `${cst} chunkUrls = {\n${Template.indent(
199
+ Array.from(
200
+ chunkUrls,
201
+ ([id, url]) =>
202
+ `${JSON.stringify(String(id))}: ${runtimeTemplate.returningFunction(url)}`
203
+ ).join(",\n")
204
+ )}\n};`,
205
+ ""
206
+ ]
207
+ : []),
208
+ withInstalledChunks
209
+ ? Template.asString([
210
+ "// object to store loaded and loading chunks",
211
+ "// undefined = chunk not loaded, null = chunk preloaded/prefetched",
212
+ "// [resolve, Promise] = chunk loading, 0 = chunk loaded",
213
+ `${cst} installedChunks = ${
214
+ stateExpression
215
+ ? runtimeTemplate.assignOr(
216
+ stateExpression,
217
+ installedChunksObject
218
+ )
219
+ : installedChunksObject
220
+ };`
221
+ ])
222
+ : "// no installed chunks",
152
223
  "",
153
224
  withLoading || withExternalInstallChunk || withAnalyzableImport
154
225
  ? `${cst} installChunk = ${runtimeTemplate.basicFunction("data", [
@@ -179,14 +250,14 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
179
250
  `if(${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId) && installedChunks[chunkId]) {`,
180
251
  Template.indent("installedChunks[chunkId][0]();"),
181
252
  "}",
182
- `installedChunks[${RuntimeGlobals.esmIds}[i]] = 0;`
253
+ "installedChunks[chunkId] = 0;"
183
254
  ]),
184
255
  "}",
185
256
  withOnChunkLoad ? `${RuntimeGlobals.onChunksLoaded}();` : ""
186
257
  ])}`
187
258
  : "// no install chunk",
188
259
  "",
189
- withLoading
260
+ withJsLoading
190
261
  ? Template.asString([
191
262
  `${fn}.j = ${runtimeTemplate.basicFunction(
192
263
  "chunkId, promises",
@@ -209,11 +280,7 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
209
280
  : `if(${hasJsMatcher("chunkId")}) {`,
210
281
  Template.indent([
211
282
  "// setup Promise in chunk cache",
212
- `${lt} promise = ${importFunctionName}(${
213
- compilation.outputOptions.publicPath === "auto"
214
- ? JSON.stringify(rootOutputDir)
215
- : RuntimeGlobals.publicPath
216
- } + ${
283
+ `${lt} promise = ${importFunctionName}(${chunkImportBase} + ${
217
284
  RuntimeGlobals.getChunkScriptFilename
218
285
  }(chunkId)).then(installChunk, ${runtimeTemplate.basicFunction(
219
286
  "e",
@@ -255,6 +322,9 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
255
322
  hasJsMatcher === true ? "true" : hasJsMatcher("chunkId")
256
323
  }) {`,
257
324
  Template.indent([
325
+ // A hint is best-effort, so an id no url was written for is
326
+ // skipped rather than turned into a bogus href.
327
+ ...(chunkUrls ? ["if(!chunkUrls[chunkId]) return;"] : []),
258
328
  "installedChunks[chunkId] = null;",
259
329
  linkPrefetch.call(
260
330
  Template.asString([
@@ -272,10 +342,23 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
272
342
  "}",
273
343
  'link.rel = "prefetch";',
274
344
  'link.as = "script";',
275
- `link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkScriptFilename}(chunkId);`
345
+ `link.href = ${chunkUrl("chunkId")};`
276
346
  ]),
277
347
  chunk
278
348
  ),
349
+ dedupePrefetch
350
+ ? Template.asString([
351
+ // Chrome re-requests a resource when a prefetch link is added
352
+ // after it was already (pre)loaded via markup; skip in that case.
353
+ `${cst} links = document.getElementsByTagName("link");`,
354
+ `for(${lt} i = 0; i < links.length; i++) {`,
355
+ Template.indent([
356
+ `${cst} l = links[i];`,
357
+ 'if(l.href === link.href && (l.rel === "prefetch" || l.rel === "preload" || l.rel === "modulepreload")) return;'
358
+ ]),
359
+ "}"
360
+ ])
361
+ : "",
279
362
  "document.head.appendChild(link);"
280
363
  ]),
281
364
  "}"
@@ -296,6 +379,9 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
296
379
  hasJsMatcher === true ? "true" : hasJsMatcher("chunkId")
297
380
  }) {`,
298
381
  Template.indent([
382
+ // A hint is best-effort, so an id no url was written for is
383
+ // skipped rather than turned into a bogus href.
384
+ ...(chunkUrls ? ["if(!chunkUrls[chunkId]) return;"] : []),
299
385
  "installedChunks[chunkId] = null;",
300
386
  linkPreload.call(
301
387
  Template.asString([
@@ -307,7 +393,7 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
307
393
  ),
308
394
  "}",
309
395
  'link.rel = "modulepreload";',
310
- `link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkScriptFilename}(chunkId);`,
396
+ `link.href = ${chunkUrl("chunkId")};`,
311
397
  crossOriginLoading
312
398
  ? crossOriginLoading === "use-credentials"
313
399
  ? 'link.crossOrigin = "use-credentials";'
@@ -340,24 +426,41 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
340
426
  ? `${
341
427
  RuntimeGlobals.analyzableChunkImport
342
428
  } = ${runtimeTemplate.basicFunction("chunkId, importFn", [
343
- // A literal `import()` a foreign bundler can follow, wrapped to keep
344
- // `ensureChunk` timing and deduplication: resolved chunk → resolve now, in-flight →
345
- // reuse its promise, else run `importFn()` and install it.
429
+ // `ensureChunk` with its `.j` half replaced by a literal `import()` a foreign
430
+ // bundler can follow. The remaining handlers still run, so a chunk's css and
431
+ // its prefetch/preload children are not lost by taking this path.
432
+ `${lt} promises = [];`,
346
433
  `${lt} installedChunkData = ${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;`,
347
- "if(installedChunkData === 0) return Promise.resolve();",
348
- "if(installedChunkData) return installedChunkData[1];",
349
- `${lt} promise = importFn().then(installChunk, ${runtimeTemplate.basicFunction(
350
- "e",
351
- [
352
- "if(installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;",
353
- "throw e;"
354
- ]
355
- )});`,
356
- `promise = Promise.race([promise, new Promise(${runtimeTemplate.expressionFunction(
357
- "installedChunkData = installedChunks[chunkId] = [resolve]",
358
- "resolve"
359
- )})]);`,
360
- "return (installedChunkData[1] = promise);"
434
+ 'if(installedChunkData !== 0) { // 0 means "already installed".',
435
+ Template.indent([
436
+ '// a Promise means "currently loading".',
437
+ "if(installedChunkData) {",
438
+ Template.indent(["promises.push(installedChunkData[1]);"]),
439
+ "} else {",
440
+ Template.indent([
441
+ `${lt} promise = importFn().then(installChunk, ${runtimeTemplate.basicFunction(
442
+ "e",
443
+ [
444
+ "if(installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;",
445
+ "throw e;"
446
+ ]
447
+ )});`,
448
+ `promise = Promise.race([promise, new Promise(${runtimeTemplate.expressionFunction(
449
+ "installedChunkData = installedChunks[chunkId] = [resolve]",
450
+ "resolve"
451
+ )})]);`,
452
+ "promises.push((installedChunkData[1] = promise));"
453
+ ]),
454
+ "}"
455
+ ]),
456
+ "}",
457
+ withLoading
458
+ ? `Object.keys(${fn}).forEach(${runtimeTemplate.basicFunction(
459
+ "key",
460
+ [`if(key !== "j") ${fn}[key](chunkId, promises);`]
461
+ )});`
462
+ : "// no other chunk loading handlers",
463
+ "return Promise.all(promises);"
361
464
  ])};`
362
465
  : "// no analyzable chunk import",
363
466
  "",
@@ -438,11 +541,7 @@ class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
438
541
  }
439
542
 
440
543
  ModuleChunkLoadingRuntimeModule.getCompilationHooks = createHooksRegistry(
441
- () =>
442
- /** @type {JsonpCompilationPluginHooks} */ ({
443
- linkPreload: new SyncWaterfallHook(["source", "chunk"]),
444
- linkPrefetch: new SyncWaterfallHook(["source", "chunk"])
445
- })
544
+ createCompilationHooks
446
545
  );
447
546
 
448
547
  module.exports = ModuleChunkLoadingRuntimeModule;
@@ -13,7 +13,9 @@
13
13
  /** @typedef {(status: string) => (Promise<void> | void)} StatusHandler */
14
14
  /** @typedef {Record<string, unknown>} ApplyOptions */
15
15
  /** @typedef {(reportError: (err: Error) => void) => Promise<ModuleId[]>} ApplyFn */
16
- /** @typedef {{ (id: ModuleId): unknown, e: (chunkId: ModuleId, fetchPriority?: string) => Promise<unknown>, [name: string]: unknown }} WebpackRequire */
16
+ /** @typedef {(chunkId: ModuleId, fetchPriority?: string) => Promise<unknown>} EnsureChunk */
17
+ /** @typedef {(chunkId: ModuleId, importFn: () => Promise<unknown>) => Promise<unknown>} AnalyzableChunkImport */
18
+ /** @typedef {{ (id: ModuleId): unknown, e?: EnsureChunk, ei?: AnalyzableChunkImport, [name: string]: unknown }} WebpackRequire */
17
19
 
18
20
  /**
19
21
  * @typedef {object} ApplyResult
@@ -185,13 +187,30 @@ module.exports = function () {
185
187
  };
186
188
  };
187
189
  for (var name in require) {
188
- if (Object.prototype.hasOwnProperty.call(require, name) && name !== "e") {
190
+ if (
191
+ Object.prototype.hasOwnProperty.call(require, name) &&
192
+ name !== "e" &&
193
+ name !== "ei"
194
+ ) {
189
195
  Object.defineProperty(fn, name, createPropertyDescriptor(name));
190
196
  }
191
197
  }
192
- /** @type {WebpackRequire} */ (fn).e = function (chunkId, fetchPriority) {
193
- return trackBlockingPromise(require.e(chunkId, fetchPriority));
194
- };
198
+ // A chunk load blocks the update until it settles, and `.ei` is the analyzable
199
+ // half of `.e`. A runtime that loads no chunks has neither to wrap.
200
+ if (require.e) {
201
+ /** @type {WebpackRequire} */ (fn).e = function (chunkId, fetchPriority) {
202
+ return trackBlockingPromise(
203
+ /** @type {EnsureChunk} */ (require.e)(chunkId, fetchPriority)
204
+ );
205
+ };
206
+ }
207
+ if (require.ei) {
208
+ /** @type {WebpackRequire} */ (fn).ei = function (chunkId, importFn) {
209
+ return trackBlockingPromise(
210
+ /** @type {AnalyzableChunkImport} */ (require.ei)(chunkId, importFn)
211
+ );
212
+ };
213
+ }
195
214
  return /** @type {WebpackRequire} */ (fn);
196
215
  }
197
216
 
@@ -9,7 +9,7 @@ const RuntimeGlobals = require("../RuntimeGlobals");
9
9
  const RuntimeModule = require("../RuntimeModule");
10
10
  const Template = require("../Template");
11
11
 
12
- /** @typedef {import("../Compilation")} Compilation */
12
+ /** @import Compilation from "../Compilation" */
13
13
 
14
14
  class HotModuleReplacementRuntimeModule extends RuntimeModule {
15
15
  constructor() {