@depup/webpack 5.109.2-depup.0 → 5.110.1-depup.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.
- package/README.md +5 -5
- package/changes.json +7 -7
- package/lib/APIPlugin.js +123 -17
- package/lib/AsyncDependenciesBlock.js +10 -7
- package/lib/AutomaticPrefetchPlugin.js +1 -1
- package/lib/BannerPlugin.js +10 -6
- package/lib/CacheFacade.js +6 -6
- package/lib/Chunk.js +14 -11
- package/lib/ChunkGraph.js +26 -17
- package/lib/ChunkGroup.js +7 -7
- package/lib/ChunkTemplate.js +35 -44
- package/lib/CircularModulesPlugin.js +205 -28
- package/lib/CleanPlugin.js +4 -7
- package/lib/CodeGenerationResults.js +11 -8
- package/lib/CompatibilityPlugin.js +7 -7
- package/lib/Compilation.js +688 -409
- package/lib/Compiler.js +53 -38
- package/lib/ConcatenationScope.js +117 -8
- package/lib/ConditionalInitFragment.js +3 -3
- package/lib/ConstPlugin.js +13 -11
- package/lib/ContextExclusionPlugin.js +1 -1
- package/lib/ContextModule.js +146 -54
- package/lib/ContextModuleFactory.js +46 -14
- package/lib/ContextReplacementPlugin.js +12 -14
- package/lib/DefinePlugin.js +121 -37
- package/lib/DependenciesBlock.js +9 -6
- package/lib/Dependency.js +36 -16
- package/lib/DependencyTemplate.js +11 -12
- package/lib/DependencyTemplates.js +3 -3
- package/lib/DotenvPlugin.js +50 -13
- package/lib/DynamicEntryPlugin.js +8 -4
- package/lib/EntryOptionPlugin.js +8 -4
- package/lib/EntryPlugin.js +2 -2
- package/lib/Entrypoint.js +6 -2
- package/lib/EnvironmentPlugin.js +2 -2
- package/lib/EvalDevToolModulePlugin.js +8 -4
- package/lib/EvalSourceMapDevToolPlugin.js +15 -8
- package/lib/ExportsInfo.js +101 -14
- package/lib/ExportsInfoApiPlugin.js +2 -4
- package/lib/ExternalModule.js +232 -77
- package/lib/ExternalModuleFactoryPlugin.js +97 -38
- package/lib/ExternalsPlugin.js +10 -6
- package/lib/FileSystemInfo.js +44 -70
- package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
- package/lib/FlagDependencyExportsPlugin.js +76 -19
- package/lib/FlagDependencyUsagePlugin.js +32 -47
- package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
- package/lib/Generator.js +36 -15
- package/lib/HotModuleReplacementPlugin.js +16 -44
- package/lib/IgnorePlugin.js +8 -4
- package/lib/IgnoreWarningsPlugin.js +2 -2
- package/lib/InitFragment.js +8 -4
- package/lib/JavascriptMetaInfoPlugin.js +35 -4
- package/lib/LazyBarrel.js +3 -4
- package/lib/LibraryTemplatePlugin.js +10 -6
- package/lib/LoaderOptionsPlugin.js +7 -3
- package/lib/LoaderTargetPlugin.js +1 -1
- package/lib/MainTemplate.js +49 -42
- package/lib/ManifestPlugin.js +12 -11
- package/lib/Module.js +62 -33
- package/lib/ModuleFactory.js +3 -3
- package/lib/ModuleFilenameHelpers.js +9 -4
- package/lib/ModuleGraph.js +195 -21
- package/lib/ModuleGraphConnection.js +6 -13
- package/lib/ModuleInfoHeaderPlugin.js +8 -10
- package/lib/ModuleTemplate.js +62 -63
- package/lib/MultiCompiler.js +130 -64
- package/lib/MultiStats.js +40 -9
- package/lib/MultiWatching.js +3 -3
- package/lib/NoEmitOnErrorsPlugin.js +1 -1
- package/lib/NodeStuffPlugin.js +29 -19
- package/lib/NormalModule.js +141 -85
- package/lib/NormalModuleFactory.js +555 -110
- package/lib/NormalModuleReplacementPlugin.js +5 -8
- package/lib/NullFactory.js +6 -2
- package/lib/OptionsApply.js +7 -3
- package/lib/Parser.js +7 -3
- package/lib/PlatformPlugin.js +2 -2
- package/lib/PrefetchPlugin.js +1 -1
- package/lib/ProgressPlugin.js +16 -13
- package/lib/ProvidePlugin.js +3 -5
- package/lib/RawModule.js +25 -17
- package/lib/RecordIdsPlugin.js +3 -3
- package/lib/RequestShortener.js +1 -1
- package/lib/ResolverFactory.js +2 -2
- package/lib/RuntimeGlobals.js +22 -10
- package/lib/RuntimeModule.js +29 -19
- package/lib/RuntimePlugin.js +332 -169
- package/lib/RuntimeTemplate.js +2792 -352
- package/lib/SelfModuleFactory.js +7 -3
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
- package/lib/SourceMapDevToolPlugin.js +30 -20
- package/lib/Stats.js +3 -4
- package/lib/Template.js +32 -22
- package/lib/TemplatedPathPlugin.js +96 -14
- package/lib/UseStrictPlugin.js +4 -6
- package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
- package/lib/WarnDeprecatedOptionPlugin.js +1 -1
- package/lib/WarnNoModeSetPlugin.js +1 -1
- package/lib/WatchIgnorePlugin.js +8 -6
- package/lib/Watching.js +8 -8
- package/lib/WebpackIsIncludedPlugin.js +2 -4
- package/lib/WebpackOptionsApply.js +308 -18
- package/lib/WebpackOptionsDefaulter.js +6 -2
- package/lib/asset/AssetBytesGenerator.js +12 -10
- package/lib/asset/AssetBytesParser.js +2 -4
- package/lib/asset/AssetGenerator.js +188 -95
- package/lib/asset/AssetModule.js +7 -3
- package/lib/asset/AssetModulesPlugin.js +110 -38
- package/lib/asset/AssetParser.js +9 -7
- package/lib/asset/AssetSourceGenerator.js +60 -13
- package/lib/asset/AssetSourceParser.js +2 -4
- package/lib/asset/RawDataUrlModule.js +24 -16
- package/lib/asset/WebManifestGenerator.js +8 -10
- package/lib/asset/WebManifestParser.js +24 -10
- package/lib/async-modules/AsyncModuleHelpers.js +2 -2
- package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
- package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
- package/lib/async-modules/isGeneratorLowered.js +4 -4
- package/lib/buildChunkGraph.js +36 -27
- package/lib/bun/BunTargetPlugin.js +1 -1
- package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
- package/lib/cache/AddManagedPathsPlugin.js +1 -1
- package/lib/cache/IdleFileCachePlugin.js +2 -2
- package/lib/cache/MemoryCachePlugin.js +18 -10
- package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
- package/lib/cache/PackFileCacheStrategy.js +30 -23
- package/lib/cache/ResolverCachePlugin.js +38 -18
- package/lib/cache/getLazyHashedEtag.js +1 -2
- package/lib/cache/mergeEtags.js +1 -1
- package/lib/cli.js +1 -3
- package/lib/config/browserslistTargetHandler.js +41 -5
- package/lib/config/defaults.js +261 -79
- package/lib/config/defineConfig.js +10 -2
- package/lib/config/getClaimedAssetTypes.js +65 -0
- package/lib/config/normalization.js +36 -16
- package/lib/config/target.js +46 -3
- package/lib/container/ContainerEntryDependency.js +1 -1
- package/lib/container/ContainerEntryModule.js +24 -15
- package/lib/container/ContainerEntryModuleFactory.js +7 -3
- package/lib/container/ContainerPlugin.js +9 -10
- package/lib/container/ContainerReferencePlugin.js +6 -2
- package/lib/container/FallbackDependency.js +1 -1
- package/lib/container/FallbackModule.js +24 -17
- package/lib/container/FallbackModuleFactory.js +7 -3
- package/lib/container/HoistContainerReferencesPlugin.js +6 -11
- package/lib/container/ModuleFederationPlugin.js +7 -24
- package/lib/container/RemoteModule.js +27 -19
- package/lib/container/RemoteRuntimeModule.js +10 -8
- package/lib/container/moduleFederationHooks.js +32 -0
- package/lib/css/CssGenerator.js +171 -43
- package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
- package/lib/css/CssLoadingRuntimeModule.js +57 -24
- package/lib/css/CssModule.js +10 -7
- package/lib/css/CssModulesPlugin.js +168 -88
- package/lib/css/CssParser.js +1113 -568
- package/lib/css/CssServerStylesRuntimeModule.js +54 -0
- package/lib/css/cssMinify.js +168 -0
- package/lib/css/data.js +5324 -0
- package/lib/css/syntax.js +9579 -232
- package/lib/debug/ProfilingPlugin.js +14 -9
- package/lib/deno/DenoTargetPlugin.js +1 -1
- package/lib/dependencies/AMDDefineDependency.js +112 -87
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
- package/lib/dependencies/AMDPlugin.js +9 -7
- package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
- package/lib/dependencies/AMDRequireContextDependency.js +2 -2
- package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
- package/lib/dependencies/AMDRequireDependency.js +8 -7
- package/lib/dependencies/AMDRequireItemDependency.js +1 -1
- package/lib/dependencies/AMDRuntimeModules.js +21 -1
- package/lib/dependencies/BuildTimeConstDependency.js +102 -0
- package/lib/dependencies/CachedConstDependency.js +11 -8
- package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
- package/lib/dependencies/CommonJsExportRequireDependency.js +121 -45
- package/lib/dependencies/CommonJsExportsDependency.js +53 -49
- package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
- package/lib/dependencies/CommonJsFullRequireDependency.js +119 -34
- package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -50
- package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
- package/lib/dependencies/CommonJsPlugin.js +35 -6
- package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
- package/lib/dependencies/CommonJsRequireDependency.js +156 -27
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
- package/lib/dependencies/ConstDependency.js +8 -9
- package/lib/dependencies/ContextDependency.js +12 -8
- package/lib/dependencies/ContextDependencyHelpers.js +14 -9
- package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -4
- package/lib/dependencies/ContextElementDependency.js +31 -12
- package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
- package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
- package/lib/dependencies/CssIcssExportDependency.js +56 -28
- package/lib/dependencies/CssIcssImportDependency.js +17 -13
- package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
- package/lib/dependencies/CssImportDependency.js +18 -9
- package/lib/dependencies/CssUrlDependency.js +17 -13
- package/lib/dependencies/DllEntryDependency.js +1 -1
- package/lib/dependencies/DynamicExports.js +2 -2
- package/lib/dependencies/ExportBindingInitFragment.js +36 -9
- package/lib/dependencies/ExportsInfoDependency.js +7 -8
- package/lib/dependencies/ExternalModuleDependency.js +9 -5
- package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
- package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
- package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
- package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +13 -10
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +78 -12
- package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
- package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +143 -63
- package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
- package/lib/dependencies/HarmonyExports.js +7 -4
- package/lib/dependencies/HarmonyImportDependency.js +27 -19
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +31 -24
- package/lib/dependencies/HarmonyImportGuard.js +20 -30
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +38 -9
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +97 -49
- package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
- package/lib/dependencies/HtmlEntryDependency.js +37 -29
- package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
- package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
- package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
- package/lib/dependencies/HtmlSourceDependency.js +22 -14
- package/lib/dependencies/ImportContextDependency.js +2 -2
- package/lib/dependencies/ImportDependency.js +24 -20
- package/lib/dependencies/ImportEagerDependency.js +6 -9
- package/lib/dependencies/ImportMetaContextDependency.js +2 -2
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
- package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
- package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
- package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
- package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
- package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
- package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
- package/lib/dependencies/ImportMetaPlugin.js +154 -71
- package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
- package/lib/dependencies/ImportParserPlugin.js +49 -35
- package/lib/dependencies/ImportPhase.js +12 -5
- package/lib/dependencies/ImportPlugin.js +7 -3
- package/lib/dependencies/ImportWeakDependency.js +6 -9
- package/lib/dependencies/JsonExportsDependency.js +11 -7
- package/lib/dependencies/LoaderDependency.js +2 -2
- package/lib/dependencies/LoaderImportDependency.js +2 -2
- package/lib/dependencies/LoaderPlugin.js +11 -7
- package/lib/dependencies/LocalModuleDependency.js +5 -5
- package/lib/dependencies/LocalModulesHelpers.js +1 -1
- package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
- package/lib/dependencies/ModuleDependency.js +9 -6
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
- package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
- package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
- package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
- package/lib/dependencies/NullDependency.js +3 -3
- package/lib/dependencies/ProvidedDependency.js +14 -10
- package/lib/dependencies/PureExpressionDependency.js +9 -10
- package/lib/dependencies/RequireContextDependency.js +2 -2
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
- package/lib/dependencies/RequireContextPlugin.js +8 -4
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
- package/lib/dependencies/RequireEnsureDependency.js +8 -7
- package/lib/dependencies/RequireEnsurePlugin.js +7 -3
- package/lib/dependencies/RequireHeaderDependency.js +51 -12
- package/lib/dependencies/RequireIncludeDependency.js +6 -6
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
- package/lib/dependencies/RequireIncludePlugin.js +7 -3
- package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
- package/lib/dependencies/RequireResolveContextDependency.js +2 -2
- package/lib/dependencies/RequireResolveDependency.js +4 -4
- package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
- package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
- package/lib/dependencies/StaticExportsDependency.js +2 -2
- package/lib/dependencies/SystemPlugin.js +10 -6
- package/lib/dependencies/SystemRuntimeModule.js +10 -0
- package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
- package/lib/dependencies/URLContextDependency.js +2 -2
- package/lib/dependencies/URLDependency.js +110 -64
- package/lib/dependencies/URLPlugin.js +7 -3
- package/lib/dependencies/UnsupportedDependency.js +4 -4
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
- package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
- package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
- package/lib/dependencies/WorkerAndWorkletPlugin.js +46 -28
- package/lib/dependencies/WorkerDependency.js +28 -22
- package/lib/dependencies/WorkletDependency.js +15 -14
- package/lib/dependencies/getFunctionExpression.js +8 -4
- package/lib/dependencies/processExportInfo.js +5 -5
- package/lib/dll/DelegatedModule.js +34 -22
- package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
- package/lib/dll/DelegatedPlugin.js +2 -2
- package/lib/dll/DllEntryPlugin.js +2 -2
- package/lib/dll/DllModule.js +22 -15
- package/lib/dll/DllModuleFactory.js +7 -3
- package/lib/dll/DllPlugin.js +7 -5
- package/lib/dll/DllReferencePlugin.js +10 -7
- package/lib/dll/LibManifestPlugin.js +5 -5
- package/lib/electron/ElectronTargetPlugin.js +53 -49
- package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
- package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
- package/lib/errors/BroadContextsWarning.js +43 -0
- package/lib/errors/BuildCycleError.js +1 -1
- package/lib/errors/CacheEffectivenessWarning.js +55 -0
- package/lib/errors/ChunkRenderError.js +1 -1
- package/lib/errors/CircularDependenciesWarning.js +38 -0
- package/lib/errors/CodeGenerationError.js +1 -1
- package/lib/errors/CommentCompilationWarning.js +1 -1
- package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
- package/lib/errors/DuplicateModulesWarning.js +45 -0
- package/lib/errors/DynamicExportsWarning.js +30 -0
- package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
- package/lib/errors/EntrypointOverlapWarning.js +45 -0
- package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
- package/lib/errors/EvalUsageWarning.js +28 -0
- package/lib/errors/HookWebpackError.js +5 -5
- package/lib/errors/HotspotsWarning.js +57 -0
- package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
- package/lib/errors/InlinedAssetsWarning.js +36 -0
- package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
- package/lib/errors/LargeModulesWarning.js +45 -0
- package/lib/errors/LegacyJavascriptWarning.js +48 -0
- package/lib/errors/MissingSideEffectsWarning.js +36 -0
- package/lib/errors/MixedExportsWarning.js +41 -0
- package/lib/errors/ModuleDependencyError.js +13 -16
- package/lib/errors/ModuleDependencyWarning.js +5 -15
- package/lib/errors/ModuleHashingError.js +1 -1
- package/lib/errors/ModuleNotFoundError.js +2 -2
- package/lib/errors/ModuleParseError.js +1 -2
- package/lib/errors/ModuleRestoreError.js +1 -1
- package/lib/errors/ModuleStoreError.js +1 -1
- package/lib/errors/NodeStuffInWebError.js +1 -1
- package/lib/errors/OsDependentRuleWarning.js +31 -0
- package/lib/errors/PureAnnotationsWarning.js +36 -0
- package/lib/errors/RedundantDynamicImportWarning.js +31 -0
- package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
- package/lib/errors/SplitChunksCappedWarning.js +41 -0
- package/lib/errors/TinyChunksWarning.js +40 -0
- package/lib/errors/TopLevelThisWarning.js +34 -0
- package/lib/errors/UnsplitVendorsWarning.js +42 -0
- package/lib/errors/UnsupportedFeatureWarning.js +1 -1
- package/lib/errors/UnusedAliasesWarning.js +29 -0
- package/lib/errors/UnusedDefinesWarning.js +29 -0
- package/lib/errors/UnusedExternalsWarning.js +29 -0
- package/lib/errors/UnusedReexportsWarning.js +42 -0
- package/lib/errors/UnusedRuleWarning.js +29 -0
- package/lib/errors/WebpackError.js +9 -5
- package/lib/errors/deriveStackFromNestedError.js +90 -0
- package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
- package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
- package/lib/esm/ModuleChunkLoadingPlugin.js +89 -51
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +155 -62
- package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
- package/lib/hmr/LazyCompilationPlugin.js +45 -24
- package/lib/hmr/lazyCompilationBackend.js +9 -6
- package/lib/hmr/parserHooks.js +56 -0
- package/lib/html/HtmlGenerator.js +277 -77
- package/lib/html/HtmlModule.js +7 -3
- package/lib/html/HtmlModulesPlugin.js +282 -162
- package/lib/html/HtmlParser.js +31 -86
- package/lib/html/data.js +1928 -0
- package/lib/html/htmlMinify.js +288 -0
- package/lib/html/syntax.js +5557 -1155
- package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
- package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
- package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
- package/lib/ids/HashedModuleIdsPlugin.js +6 -2
- package/lib/ids/IdHelpers.js +7 -8
- package/lib/ids/NamedChunkIdsPlugin.js +1 -1
- package/lib/ids/NamedModuleIdsPlugin.js +1 -1
- package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
- package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
- package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
- package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
- package/lib/ids/SyncModuleIdsPlugin.js +4 -4
- package/lib/index.js +10 -0
- package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
- package/lib/javascript/BasicEvaluatedExpression.js +18 -14
- package/lib/javascript/ChunkFormatHelpers.js +6 -6
- package/lib/javascript/ChunkHelpers.js +1 -1
- package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
- package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
- package/lib/javascript/JavascriptGenerator.js +65 -165
- package/lib/javascript/JavascriptModule.js +9 -3
- package/lib/javascript/JavascriptModulesPlugin.js +98 -113
- package/lib/javascript/JavascriptParser.js +242 -99
- package/lib/javascript/JavascriptParserHelpers.js +10 -7
- package/lib/javascript/ScopeAnalyzer.js +1094 -0
- package/lib/javascript/StartupHelpers.js +55 -9
- package/lib/javascript/syntax.js +2678 -232
- package/lib/json/JsonData.js +8 -4
- package/lib/json/JsonGenerator.js +38 -16
- package/lib/json/JsonModule.js +7 -3
- package/lib/json/JsonModulesPlugin.js +1 -1
- package/lib/json/JsonParser.js +5 -6
- package/lib/library/AbstractLibraryPlugin.js +20 -14
- package/lib/library/AmdLibraryPlugin.js +11 -7
- package/lib/library/AssignLibraryPlugin.js +19 -13
- package/lib/library/EnableLibraryPlugin.js +2 -2
- package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
- package/lib/library/JsonpLibraryPlugin.js +11 -7
- package/lib/library/ModuleLibraryPlugin.js +256 -64
- package/lib/library/SystemLibraryPlugin.js +12 -8
- package/lib/library/UmdLibraryPlugin.js +62 -25
- package/lib/loaders/LoaderRunner.js +14 -1
- package/lib/loaders/loadLoader.js +8 -4
- package/lib/logging/createConsoleLogger.js +7 -4
- package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
- package/lib/node/NodeEnvironmentPlugin.js +17 -3
- package/lib/node/NodeSourcePlugin.js +1 -1
- package/lib/node/NodeTargetPlugin.js +4 -3
- package/lib/node/NodeTemplatePlugin.js +1 -1
- package/lib/node/NodeWatchFileSystem.js +70 -9
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
- package/lib/node/ReadFileCompileAsyncWasmPlugin.js +72 -19
- package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
- package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
- package/lib/node/nodeConsole.js +7 -3
- package/lib/optimize/AggressiveMergingPlugin.js +2 -2
- package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
- package/lib/optimize/ConcatenatedModule.js +985 -470
- package/lib/optimize/ConstExportsPlugin.js +11 -7
- package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
- package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
- package/lib/optimize/InlineExports.js +9 -5
- package/lib/optimize/InnerGraph.js +28 -12
- package/lib/optimize/InnerGraphPlugin.js +23 -18
- package/lib/optimize/LimitChunkCountPlugin.js +7 -3
- package/lib/optimize/MangleExportsPlugin.js +7 -8
- package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
- package/lib/optimize/MinChunkSizePlugin.js +7 -3
- package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
- package/lib/optimize/RealContentHashPlugin.js +10 -6
- package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
- package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
- package/lib/optimize/RuntimeChunkPlugin.js +2 -2
- package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
- package/lib/optimize/SplitChunksPlugin.js +86 -24
- package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
- package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
- package/lib/performance/BroadContextsPlugin.js +142 -0
- package/lib/performance/CacheEffectivenessPlugin.js +125 -0
- package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
- package/lib/performance/DuplicateModulesPlugin.js +93 -0
- package/lib/performance/DuplicatePackagesPlugin.js +119 -0
- package/lib/performance/DuplicatePackagesWarning.js +84 -0
- package/lib/performance/DynamicExportsPlugin.js +120 -0
- package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
- package/lib/performance/EntrypointOverlapPlugin.js +122 -0
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
- package/lib/performance/EvalUsagePlugin.js +115 -0
- package/lib/performance/HotspotsPlugin.js +296 -0
- package/lib/performance/InlinedAssetsPlugin.js +99 -0
- package/lib/performance/LargeModulesPlugin.js +126 -0
- package/lib/performance/LegacyJavascriptPlugin.js +139 -0
- package/lib/performance/MissingSideEffectsPlugin.js +138 -0
- package/lib/performance/MixedExportsPlugin.js +136 -0
- package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
- package/lib/performance/PureAnnotationsPlugin.js +219 -0
- package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
- package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
- package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
- package/lib/performance/SizeLimitsPlugin.js +139 -7
- package/lib/performance/SplitChunksCappedPlugin.js +99 -0
- package/lib/performance/TinyChunksPlugin.js +128 -0
- package/lib/performance/TopLevelThisPlugin.js +208 -0
- package/lib/performance/UnsplitVendorsPlugin.js +112 -0
- package/lib/performance/UnusedAliasesPlugin.js +253 -0
- package/lib/performance/UnusedDefinesPlugin.js +87 -0
- package/lib/performance/UnusedExternalsPlugin.js +110 -0
- package/lib/performance/UnusedReexportsPlugin.js +159 -0
- package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
- package/lib/performance/getModuleSize.js +22 -0
- package/lib/performance/getSourceModules.js +22 -0
- package/lib/performance/hasOnlyUnusedExports.js +40 -0
- package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
- package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
- package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
- package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
- package/lib/prefetch/ResourceHintPlugin.js +295 -78
- package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
- package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
- package/lib/prefetch/parseResourceHintOptions.js +31 -4
- package/lib/rules/BasicEffectRulePlugin.js +2 -2
- package/lib/rules/BasicMatcherRulePlugin.js +8 -4
- package/lib/rules/GlobMatcherRulePlugin.js +68 -0
- package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
- package/lib/rules/RuleSetCompiler.js +146 -12
- package/lib/rules/UseEffectRulePlugin.js +18 -11
- package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
- package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
- package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
- package/lib/runtime/BaseUriRuntimeModule.js +33 -7
- package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
- package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
- package/lib/runtime/CompatRuntimeModule.js +5 -3
- package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
- package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
- package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
- package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
- package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
- package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
- package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
- package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
- package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
- package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
- package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
- package/lib/runtime/GlobalRuntimeModule.js +18 -0
- package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
- package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +23 -6
- package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
- package/lib/runtime/NonceRuntimeModule.js +10 -0
- package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
- package/lib/runtime/PublicPathRuntimeModule.js +12 -2
- package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
- package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
- package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
- package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
- package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
- package/lib/runtime/SystemContextRuntimeModule.js +10 -0
- package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
- package/lib/runtime/WorkerRuntimeModule.js +11 -1
- package/lib/runtime/baseUri.js +63 -0
- package/lib/schemes/DataUriPlugin.js +1 -1
- package/lib/schemes/FileUriPlugin.js +1 -1
- package/lib/schemes/HttpUriPlugin.js +24 -15
- package/lib/schemes/VirtualUrlPlugin.js +13 -7
- package/lib/serialization/AggregateErrorSerializer.js +1 -1
- package/lib/serialization/BinaryMiddleware.js +4 -4
- package/lib/serialization/ErrorObjectSerializer.js +1 -1
- package/lib/serialization/FileMiddleware.js +7 -7
- package/lib/serialization/ObjectMiddleware.js +139 -114
- package/lib/serialization/PlainObjectSerializer.js +19 -16
- package/lib/sharing/ConsumeSharedModule.js +30 -21
- package/lib/sharing/ConsumeSharedPlugin.js +18 -10
- package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
- package/lib/sharing/ProvideSharedModule.js +25 -16
- package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
- package/lib/sharing/ProvideSharedPlugin.js +8 -4
- package/lib/sharing/SharePlugin.js +17 -5
- package/lib/sharing/ShareRuntimeModule.js +4 -4
- package/lib/sharing/resolveMatchedConfigs.js +9 -6
- package/lib/sharing/utils.js +1 -3
- package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
- package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
- package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
- package/lib/stats/StatsFactory.js +25 -26
- package/lib/stats/StatsPrinter.js +16 -12
- package/lib/typescript/TypeScriptPlugin.js +12 -14
- package/lib/url/URLParserPlugin.js +26 -13
- package/lib/util/AsyncQueue.js +4 -3
- package/lib/util/Hash.js +5 -1
- package/lib/util/LazySet.js +35 -22
- package/lib/util/LocConverter.js +36 -13
- package/lib/util/SourceProcessor.js +1050 -24
- package/lib/util/StringXor.js +1 -1
- package/lib/util/chainedImports.js +9 -5
- package/lib/util/cleverMerge.js +1 -1
- package/lib/util/comparators.js +45 -14
- package/lib/util/concatenate.js +203 -77
- package/lib/util/conventions.js +5 -1
- package/lib/util/createHash.js +2 -2
- package/lib/util/createHooksRegistry.js +8 -10
- package/lib/util/dataURL.js +225 -1
- package/lib/util/extractSourceMap.js +4 -3
- package/lib/util/findCaseMismatch.js +139 -0
- package/lib/util/formatLocation.js +1 -2
- package/lib/util/fs.js +22 -5
- package/lib/util/globUtils.js +298 -24
- package/lib/util/hash/BatchedHash.js +5 -1
- package/lib/util/hash/BulkUpdateHash.js +5 -1
- package/lib/util/hash/DebugHash.js +5 -1
- package/lib/util/hash/hash-digest.js +6 -2
- package/lib/util/identifier.js +4 -0
- package/lib/util/implicitTypeLoaderFallback.js +1 -1
- package/lib/util/internalSerializables.js +6 -0
- package/lib/util/lazyModule.js +56 -0
- package/lib/util/makeSerializable.js +7 -3
- package/lib/util/matchAlias.js +25 -0
- package/lib/util/mimeTypes.js +11 -5
- package/lib/util/nonNumericOnlyHash.js +4 -3
- package/lib/util/parseJson.js +5 -3
- package/lib/util/preloadModuleType.js +32 -0
- package/lib/util/registerExternalSerializer.js +7 -5
- package/lib/util/runtime.js +2 -2
- package/lib/util/semver.js +1 -1
- package/lib/util/serialization.js +28 -28
- package/lib/util/source.js +2 -2
- package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
- package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
- package/lib/wasm/wasmModuleFilename.js +54 -0
- package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +41 -21
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +43 -21
- package/lib/wasm-async/AsyncWasmModule.js +3 -3
- package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
- package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
- package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
- package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +34 -8
- package/lib/wasm-sync/SyncWasmModule.js +2 -2
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
- package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
- package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
- package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
- package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
- package/lib/wasm-sync/WebAssemblyParser.js +4 -6
- package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
- package/lib/web/FetchCompileAsyncWasmPlugin.js +101 -19
- package/lib/web/FetchCompileWasmPlugin.js +46 -16
- package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
- package/lib/web/JsonpTemplatePlugin.js +2 -2
- package/lib/webpack.js +22 -11
- package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
- package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
- package/module.d.ts +1 -0
- package/package.json +32 -25
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +670 -36
- package/schemas/plugins/HtmlParserOptions.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.json +10 -0
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
- package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
- package/schemas/plugins/css/CssParserOptions.check.js +1 -1
- package/types.d.ts +3144 -454
- package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
|
@@ -6,23 +6,60 @@
|
|
|
6
6
|
|
|
7
7
|
const { RawSource } = require("webpack-sources");
|
|
8
8
|
const ModuleFilenameHelpers = require("../ModuleFilenameHelpers");
|
|
9
|
+
const {
|
|
10
|
+
ASSET_URL_TYPE,
|
|
11
|
+
JAVASCRIPT_TYPE
|
|
12
|
+
} = require("../ModuleSourceTypeConstants");
|
|
9
13
|
const RuntimeGlobals = require("../RuntimeGlobals");
|
|
10
14
|
const CssUrlDependency = require("../dependencies/CssUrlDependency");
|
|
11
15
|
const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
|
|
12
16
|
const URLDependency = require("../dependencies/URLDependency");
|
|
13
|
-
const
|
|
14
|
-
const
|
|
17
|
+
const WorkerDependency = require("../dependencies/WorkerDependency");
|
|
18
|
+
const lazyModule = require("../util/lazyModule");
|
|
19
|
+
const memoize = require("../util/memoize");
|
|
20
|
+
const {
|
|
21
|
+
PUBLIC_PATH_AUTO,
|
|
22
|
+
PUBLIC_PATH_FULL_HASH
|
|
23
|
+
} = require("../util/publicPathPlaceholder");
|
|
24
|
+
const { guessAsAttribute } = require("./parseResourceHintOptions");
|
|
15
25
|
const parseResourceHintOptions = require("./parseResourceHintOptions");
|
|
16
26
|
|
|
17
|
-
/** @
|
|
18
|
-
/** @
|
|
19
|
-
/** @
|
|
20
|
-
/** @
|
|
21
|
-
/** @
|
|
22
|
-
/** @
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
|
|
27
|
+
/** @import Chunk from "../Chunk" */
|
|
28
|
+
/** @import ChunkGraph from "../ChunkGraph" */
|
|
29
|
+
/** @import CodeGenerationResults from "../CodeGenerationResults" */
|
|
30
|
+
/** @import Compilation from "../Compilation" */
|
|
31
|
+
/** @import Compiler from "../Compiler" */
|
|
32
|
+
/** @import Module, { RuntimeRequirements } from "../Module" */
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The attributes a `<link>` carries besides its href and `as`.
|
|
36
|
+
* @typedef {object} StartupHintAttributes
|
|
37
|
+
* @property {("low" | "high" | "auto" | undefined)=} fetchPriority
|
|
38
|
+
* @property {string=} type
|
|
39
|
+
* @property {string=} media
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* One asset a chunk hints at startup, merged across every reference to it.
|
|
44
|
+
* @typedef {object} AssetHintEntry
|
|
45
|
+
* @property {Module} assetModule the asset the `<link>` points at
|
|
46
|
+
* @property {Module} originModule the chunk module the reference was written in, which is what a baked href is relative to
|
|
47
|
+
* @property {string} request the original request, for guessing the `as` attribute
|
|
48
|
+
* @property {boolean} preload preload rather than prefetch
|
|
49
|
+
* @property {("low" | "high" | "auto" | undefined)} fetchPriority
|
|
50
|
+
* @property {(string | undefined)} as
|
|
51
|
+
* @property {(string | undefined)} type
|
|
52
|
+
* @property {(string | undefined)} media
|
|
53
|
+
*/
|
|
54
|
+
/**
|
|
55
|
+
* @import {
|
|
56
|
+
* ResourceHintsInitial as ResourceHintsConfig,
|
|
57
|
+
* ResourceHintsOptions,
|
|
58
|
+
* UrlHintRule
|
|
59
|
+
* } from "../../declarations/WebpackOptions"
|
|
60
|
+
*/
|
|
61
|
+
/** @import { HtmlResourceHint } from "../dependencies/HtmlEntryDependency" */
|
|
62
|
+
/** @import { ResourceHintOptions } from "./parseResourceHintOptions" */
|
|
26
63
|
|
|
27
64
|
/**
|
|
28
65
|
* @typedef {object} ResolvedResourceHints
|
|
@@ -90,6 +127,19 @@ const getPublicPathOrigin = (compilation) => {
|
|
|
90
127
|
* @property {(entryName: string) => EntrypointHint[]} getEntrypointHints resolved `<link>`-shaped descriptors for the given entry — auto initial-graph hints plus URL asset hints, then filtered / rewritten through the user function (when `output.resourceHints` is a function). Reads via `stats.entrypoints[name].resourceHints`.
|
|
91
128
|
*/
|
|
92
129
|
|
|
130
|
+
// only a build that actually emits a resource hint needs these
|
|
131
|
+
const getResourceHintRuntimeModule = lazyModule(() =>
|
|
132
|
+
require("./ResourceHintRuntimeModule")
|
|
133
|
+
);
|
|
134
|
+
const getStartupAssetHintRuntimeModule = lazyModule(() =>
|
|
135
|
+
require("./StartupAssetHintRuntimeModule")
|
|
136
|
+
);
|
|
137
|
+
// only reached once a build has an html module, so a js-only build never
|
|
138
|
+
// pays for the html generator this drags in
|
|
139
|
+
const getHtmlEntryDependency = memoize(() =>
|
|
140
|
+
require("../dependencies/HtmlEntryDependency")
|
|
141
|
+
);
|
|
142
|
+
|
|
93
143
|
const PLUGIN_NAME = "ResourceHintPlugin";
|
|
94
144
|
|
|
95
145
|
/** @type {WeakMap<Compilation, CompilationResolver>} */
|
|
@@ -114,16 +164,6 @@ const isUrlAssetDep = (dep) =>
|
|
|
114
164
|
dep instanceof CssUrlDependency ||
|
|
115
165
|
dep instanceof HtmlSourceDependency;
|
|
116
166
|
|
|
117
|
-
/**
|
|
118
|
-
* True for the CSS / HTML URL-asset deps whose templates don't run for JS
|
|
119
|
-
* output — the plugin lifts their hint flags into JS runtime requirements
|
|
120
|
-
* itself. JS `URLDependency` lifts its own, so it is excluded here.
|
|
121
|
-
* @param {import("../Dependency")} dep dependency
|
|
122
|
-
* @returns {dep is CssUrlDependency | HtmlSourceDependency} whether it is a CSS/HTML URL asset dep
|
|
123
|
-
*/
|
|
124
|
-
const isCssOrHtmlUrlAssetDep = (dep) =>
|
|
125
|
-
dep instanceof CssUrlDependency || dep instanceof HtmlSourceDependency;
|
|
126
|
-
|
|
127
167
|
/**
|
|
128
168
|
* Entry chunk name for a hint's `hostChunks` (Vite's `hostId`); the id is a
|
|
129
169
|
* stable fallback for unnamed chunks.
|
|
@@ -327,9 +367,7 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
|
|
|
327
367
|
/** @type {{ filename?: string }} */
|
|
328
368
|
(target.buildInfo);
|
|
329
369
|
if (!buildInfo || !buildInfo.filename) continue;
|
|
330
|
-
const asAttribute =
|
|
331
|
-
dep.asAttribute ||
|
|
332
|
-
ResourceHintRuntimeModule.guessAsAttribute(dep.request);
|
|
370
|
+
const asAttribute = dep.asAttribute || guessAsAttribute(dep.request);
|
|
333
371
|
/** @type {EntrypointHint} */
|
|
334
372
|
const h = {
|
|
335
373
|
rel: dep.preload ? "preload" : "prefetch",
|
|
@@ -348,14 +386,13 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
|
|
|
348
386
|
// `stats.entrypoints[name].resourceHints` see `"js"`.
|
|
349
387
|
let hostType = /** @type {"html" | "js"} */ ("js");
|
|
350
388
|
|
|
351
|
-
const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
|
|
352
|
-
|
|
353
389
|
outer: for (const module of compilation.modules) {
|
|
354
390
|
if (!module.getSourceTypes || !module.getSourceTypes().has("html")) {
|
|
355
391
|
continue;
|
|
356
392
|
}
|
|
357
393
|
const presDeps = module.presentationalDependencies;
|
|
358
394
|
if (!presDeps) continue;
|
|
395
|
+
const HtmlEntryDependency = getHtmlEntryDependency();
|
|
359
396
|
for (const dep of presDeps) {
|
|
360
397
|
if (
|
|
361
398
|
dep instanceof HtmlEntryDependency &&
|
|
@@ -377,6 +414,214 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
|
|
|
377
414
|
);
|
|
378
415
|
};
|
|
379
416
|
|
|
417
|
+
/**
|
|
418
|
+
* Renders the `<link>` calls a chunk fires at startup, for every asset and worker
|
|
419
|
+
* chunk it references with a resource hint. Run while runtime requirements are still
|
|
420
|
+
* open, so what an href reads is added to `set` rather than assumed: an href spelled
|
|
421
|
+
* as a literal leaves `.p` and `.u` out of the chunk entirely.
|
|
422
|
+
* @param {Chunk} chunk the chunk the calls are emitted into
|
|
423
|
+
* @param {Compilation} compilation the compilation
|
|
424
|
+
* @param {ChunkGraph} chunkGraph the chunk graph
|
|
425
|
+
* @param {CodeGenerationResults} codeGenerationResults the code generation results
|
|
426
|
+
* @param {RuntimeRequirements} set the chunk's runtime requirements
|
|
427
|
+
* @returns {string[]} one call per hinted asset, in emission order
|
|
428
|
+
*/
|
|
429
|
+
const collectStartupAssetHintLines = (
|
|
430
|
+
chunk,
|
|
431
|
+
compilation,
|
|
432
|
+
chunkGraph,
|
|
433
|
+
codeGenerationResults,
|
|
434
|
+
set
|
|
435
|
+
) => {
|
|
436
|
+
const { moduleGraph, runtimeTemplate } = compilation;
|
|
437
|
+
const resolver =
|
|
438
|
+
/** @type {CompilationResolver} */
|
|
439
|
+
(compilationResolvers.get(compilation));
|
|
440
|
+
/** @type {string[]} */
|
|
441
|
+
const lines = [];
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* @param {string} fn the `<link>` helper
|
|
445
|
+
* @param {string} href the href expression
|
|
446
|
+
* @param {string} as the `as` attribute
|
|
447
|
+
* @param {StartupHintAttributes} attributes the remaining attributes
|
|
448
|
+
* @returns {void}
|
|
449
|
+
*/
|
|
450
|
+
const push = (fn, href, as, attributes) => {
|
|
451
|
+
set.add(fn);
|
|
452
|
+
lines.push(
|
|
453
|
+
`${fn}(${href}, ${JSON.stringify(as)}, ${
|
|
454
|
+
attributes.type ? JSON.stringify(attributes.type) : "undefined"
|
|
455
|
+
}, ${attributes.media ? JSON.stringify(attributes.media) : "undefined"}, ${
|
|
456
|
+
attributes.fetchPriority
|
|
457
|
+
? JSON.stringify(attributes.fetchPriority)
|
|
458
|
+
: "undefined"
|
|
459
|
+
});`
|
|
460
|
+
);
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
// The analyzable worker form can't wrap its own href without losing the literal
|
|
464
|
+
// specifier, so its `<link>` fires here — keyed by chunk, hence a separate pass.
|
|
465
|
+
/** @type {Set<string | number>} */
|
|
466
|
+
const seenWorkerChunks = new Set();
|
|
467
|
+
for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
|
|
468
|
+
for (const block of module.blocks) {
|
|
469
|
+
for (const dep of block.dependencies) {
|
|
470
|
+
if (!(dep instanceof WorkerDependency)) continue;
|
|
471
|
+
const hint = dep.options.resourceHint;
|
|
472
|
+
if (!hint || (!hint.preload && !hint.prefetch)) continue;
|
|
473
|
+
const group = chunkGraph.getBlockChunkGroup(block);
|
|
474
|
+
if (!group) continue;
|
|
475
|
+
const workerChunk =
|
|
476
|
+
/** @type {import("../Entrypoint")} */
|
|
477
|
+
(group).getEntrypointChunk();
|
|
478
|
+
if (workerChunk.id === null || seenWorkerChunks.has(workerChunk.id)) {
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
seenWorkerChunks.add(workerChunk.id);
|
|
482
|
+
// The same specifier the `new Worker(...)` call site bakes, asked of the
|
|
483
|
+
// same module, so the two agree on whether a literal is spellable.
|
|
484
|
+
const specifier = runtimeTemplate.supportsAnalyzable(
|
|
485
|
+
"url",
|
|
486
|
+
chunkGraph,
|
|
487
|
+
module
|
|
488
|
+
)
|
|
489
|
+
? runtimeTemplate._getAnalyzableChunkSpecifier(
|
|
490
|
+
dep.options.publicPath,
|
|
491
|
+
workerChunk,
|
|
492
|
+
module,
|
|
493
|
+
chunkGraph,
|
|
494
|
+
set
|
|
495
|
+
)
|
|
496
|
+
: null;
|
|
497
|
+
// Without one the call site keeps the runtime form, where it wraps its own
|
|
498
|
+
// href — firing the `<link>` here too would emit the call twice.
|
|
499
|
+
if (specifier === null) continue;
|
|
500
|
+
push(
|
|
501
|
+
hint.preload
|
|
502
|
+
? RuntimeGlobals.preloadAsset
|
|
503
|
+
: RuntimeGlobals.prefetchAsset,
|
|
504
|
+
`${runtimeTemplate.importMetaUrl(specifier)}.href`,
|
|
505
|
+
hint.as || "script",
|
|
506
|
+
hint
|
|
507
|
+
);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
// Dedupe per asset module so two references can't emit two `<link>`s: `preload`
|
|
513
|
+
// wins over `prefetch`, and the last explicit attribute override sticks.
|
|
514
|
+
/** @type {Map<string, AssetHintEntry>} */
|
|
515
|
+
const perAsset = new Map();
|
|
516
|
+
for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
|
|
517
|
+
const deps =
|
|
518
|
+
/** @type {{ dependencies?: import("../Dependency")[] }} */
|
|
519
|
+
(module).dependencies;
|
|
520
|
+
if (!deps) continue;
|
|
521
|
+
for (const dep of deps) {
|
|
522
|
+
if (!isUrlAssetDep(dep)) continue;
|
|
523
|
+
if (!dep.prefetch && !dep.preload) continue;
|
|
524
|
+
const assetModule = moduleGraph.getModule(dep);
|
|
525
|
+
if (!assetModule) continue;
|
|
526
|
+
// Already a `<link>` in the html `<head>` emitted by `HtmlEntryDependency`,
|
|
527
|
+
// so the runtime hint would leave the DOM with two tags for one url.
|
|
528
|
+
if (resolver.isHtmlHinted(assetModule)) continue;
|
|
529
|
+
const key = assetModule.identifier();
|
|
530
|
+
const urlDep =
|
|
531
|
+
/** @type {URLDependency & Partial<CssUrlDependency> & Partial<HtmlSourceDependency>} */
|
|
532
|
+
(dep);
|
|
533
|
+
const existing = perAsset.get(key);
|
|
534
|
+
if (existing) {
|
|
535
|
+
if (dep.preload) existing.preload = true;
|
|
536
|
+
if (dep.fetchPriority) existing.fetchPriority = dep.fetchPriority;
|
|
537
|
+
if (urlDep.asAttribute) existing.as = urlDep.asAttribute;
|
|
538
|
+
if (urlDep.typeAttribute) existing.type = urlDep.typeAttribute;
|
|
539
|
+
if (urlDep.mediaAttribute) existing.media = urlDep.mediaAttribute;
|
|
540
|
+
} else {
|
|
541
|
+
perAsset.set(key, {
|
|
542
|
+
assetModule: /** @type {Module} */ (assetModule),
|
|
543
|
+
originModule: module,
|
|
544
|
+
request: dep.request,
|
|
545
|
+
preload: Boolean(dep.preload),
|
|
546
|
+
fetchPriority: dep.fetchPriority,
|
|
547
|
+
as: urlDep.asAttribute,
|
|
548
|
+
type: urlDep.typeAttribute,
|
|
549
|
+
media: urlDep.mediaAttribute
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
for (const entry of perAsset.values()) {
|
|
556
|
+
const { assetModule } = entry;
|
|
557
|
+
let href;
|
|
558
|
+
// An asset with a javascript wrapper exposes its url through it; one without has
|
|
559
|
+
// no `__webpack_modules__` entry to require.
|
|
560
|
+
if (assetModule.getSourceTypes().has(JAVASCRIPT_TYPE)) {
|
|
561
|
+
href = runtimeTemplate.moduleRaw({
|
|
562
|
+
chunkGraph,
|
|
563
|
+
module: assetModule,
|
|
564
|
+
request: entry.request,
|
|
565
|
+
runtimeRequirements: set,
|
|
566
|
+
weak: false
|
|
567
|
+
});
|
|
568
|
+
} else {
|
|
569
|
+
const has = codeGenerationResults.has(assetModule, chunk.runtime);
|
|
570
|
+
const urlData = has
|
|
571
|
+
? codeGenerationResults.getData(assetModule, chunk.runtime, "url")
|
|
572
|
+
: undefined;
|
|
573
|
+
const resolved = urlData && urlData[ASSET_URL_TYPE];
|
|
574
|
+
// A generator `publicPath` overrides `output.publicPath`, so prefer it; only the
|
|
575
|
+
// two placeholders below are still unresolved when this runs.
|
|
576
|
+
const templated =
|
|
577
|
+
typeof resolved === "string" &&
|
|
578
|
+
(resolved.includes(PUBLIC_PATH_AUTO) ||
|
|
579
|
+
resolved.includes(PUBLIC_PATH_FULL_HASH));
|
|
580
|
+
if (typeof resolved === "string" && !templated) {
|
|
581
|
+
href = JSON.stringify(resolved);
|
|
582
|
+
} else {
|
|
583
|
+
const filename = has
|
|
584
|
+
? codeGenerationResults.getData(
|
|
585
|
+
assetModule,
|
|
586
|
+
chunk.runtime,
|
|
587
|
+
"filename"
|
|
588
|
+
)
|
|
589
|
+
: undefined;
|
|
590
|
+
if (typeof filename !== "string") continue;
|
|
591
|
+
// The literal the `new URL()` call site bakes, asked of the same module —
|
|
592
|
+
// but written into a runtime module, which no `eval` devtool wraps.
|
|
593
|
+
const specifier = runtimeTemplate.supportsAnalyzable(
|
|
594
|
+
"url-runtime",
|
|
595
|
+
chunkGraph,
|
|
596
|
+
entry.originModule
|
|
597
|
+
)
|
|
598
|
+
? runtimeTemplate.getAnalyzableAssetUrl(
|
|
599
|
+
entry.originModule,
|
|
600
|
+
chunkGraph,
|
|
601
|
+
filename,
|
|
602
|
+
chunk.runtime
|
|
603
|
+
)
|
|
604
|
+
: null;
|
|
605
|
+
if (specifier !== null) {
|
|
606
|
+
href = `${runtimeTemplate.importMetaUrl(specifier)}.href`;
|
|
607
|
+
} else {
|
|
608
|
+
set.add(RuntimeGlobals.publicPath);
|
|
609
|
+
href = `${RuntimeGlobals.publicPath} + ${JSON.stringify(filename)}`;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
push(
|
|
614
|
+
entry.preload
|
|
615
|
+
? RuntimeGlobals.preloadAsset
|
|
616
|
+
: RuntimeGlobals.prefetchAsset,
|
|
617
|
+
href,
|
|
618
|
+
entry.as || guessAsAttribute(entry.request),
|
|
619
|
+
entry
|
|
620
|
+
);
|
|
621
|
+
}
|
|
622
|
+
return lines;
|
|
623
|
+
};
|
|
624
|
+
|
|
380
625
|
/**
|
|
381
626
|
* Adds runtime support for `__webpack_require__.PA` / `__webpack_require__.LA`,
|
|
382
627
|
* the helpers that inject `<link rel="prefetch">` / `<link rel="preload">`
|
|
@@ -493,8 +738,6 @@ class ResourceHintPlugin {
|
|
|
493
738
|
apply(compiler) {
|
|
494
739
|
const hints = this._hints;
|
|
495
740
|
|
|
496
|
-
const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
|
|
497
|
-
|
|
498
741
|
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
499
742
|
// Lazy-computed on first access — walk every HTML module's
|
|
500
743
|
// `HtmlEntryDependency`s, resolve each named entry, and collect
|
|
@@ -521,6 +764,7 @@ class ResourceHintPlugin {
|
|
|
521
764
|
// they don't affect module resolution, only rendering.
|
|
522
765
|
const presDeps = module.presentationalDependencies;
|
|
523
766
|
if (!presDeps) continue;
|
|
767
|
+
const HtmlEntryDependency = getHtmlEntryDependency();
|
|
524
768
|
for (const dep of presDeps) {
|
|
525
769
|
if (
|
|
526
770
|
!(dep instanceof HtmlEntryDependency) ||
|
|
@@ -583,56 +827,28 @@ class ResourceHintPlugin {
|
|
|
583
827
|
getEntrypointHints: (entryName) =>
|
|
584
828
|
collectEntrypointHints(compilation, entryName, hints)
|
|
585
829
|
});
|
|
586
|
-
//
|
|
587
|
-
//
|
|
588
|
-
// output, so we need to lift those flags into the JS chunk's
|
|
589
|
-
// runtime requirements ourselves. Iterate only css/html modules
|
|
590
|
-
// (pure-JS chunks skip the walk entirely).
|
|
830
|
+
// Rendered here, not in the runtime module: requirements are still open, so a
|
|
831
|
+
// literal href costs no `.p`/`.u`, and async chunks are reached as well.
|
|
591
832
|
compilation.hooks.additionalChunkRuntimeRequirements.tap(
|
|
592
833
|
PLUGIN_NAME,
|
|
593
|
-
(chunk, set, { chunkGraph }) => {
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
// (covering async chunks too) — `runtimeRequirementInTree`
|
|
612
|
-
// alone would only attach it to the runtime chunk, so a
|
|
613
|
-
// hinted `new URL(...)` in an async chunk would never
|
|
614
|
-
// fire its `<link>` injection. We add it whenever this
|
|
615
|
-
// chunk already pulls in `startupAssetHints` (via JS
|
|
616
|
-
// `URLDependency` template) or whenever CSS / HTML lifts
|
|
617
|
-
// it in here.
|
|
618
|
-
if (
|
|
619
|
-
hasPrefetch ||
|
|
620
|
-
hasPreload ||
|
|
621
|
-
set.has(RuntimeGlobals.startupAssetHints)
|
|
622
|
-
) {
|
|
623
|
-
set.add(RuntimeGlobals.startupAssetHints);
|
|
624
|
-
// CSS-only asset modules aren't in JS `__webpack_modules__`,
|
|
625
|
-
// so the startup-hint runtime falls back to
|
|
626
|
-
// `__webpack_require__.p + "filename"`. Make sure
|
|
627
|
-
// `publicPath` is in this chunk's runtime.
|
|
628
|
-
set.add(RuntimeGlobals.publicPath);
|
|
629
|
-
if (hasPrefetch) set.add(RuntimeGlobals.prefetchAsset);
|
|
630
|
-
if (hasPreload) set.add(RuntimeGlobals.preloadAsset);
|
|
631
|
-
compilation.addRuntimeModule(
|
|
632
|
-
chunk,
|
|
633
|
-
new StartupAssetHintRuntimeModule()
|
|
634
|
-
);
|
|
635
|
-
}
|
|
834
|
+
(chunk, set, { chunkGraph, codeGenerationResults }) => {
|
|
835
|
+
// Browser markup, and no DOM to put it in — the call sites skip their
|
|
836
|
+
// hints under build-time execution too (`URLDependency`).
|
|
837
|
+
if (hints === "none" || chunkGraph.buildTimeExecution) return;
|
|
838
|
+
const lines = collectStartupAssetHintLines(
|
|
839
|
+
chunk,
|
|
840
|
+
compilation,
|
|
841
|
+
chunkGraph,
|
|
842
|
+
codeGenerationResults,
|
|
843
|
+
set
|
|
844
|
+
);
|
|
845
|
+
if (lines.length === 0) return;
|
|
846
|
+
set.add(RuntimeGlobals.startupAssetHints);
|
|
847
|
+
compilation.addLazyRuntimeModule(
|
|
848
|
+
chunk,
|
|
849
|
+
getStartupAssetHintRuntimeModule,
|
|
850
|
+
(Ctor) => new Ctor(lines)
|
|
851
|
+
);
|
|
636
852
|
}
|
|
637
853
|
);
|
|
638
854
|
for (const [rel, runtimeGlobal] of /** @type {const} */ ([
|
|
@@ -642,9 +858,10 @@ class ResourceHintPlugin {
|
|
|
642
858
|
compilation.hooks.runtimeRequirementInTree
|
|
643
859
|
.for(runtimeGlobal)
|
|
644
860
|
.tap(PLUGIN_NAME, (chunk) => {
|
|
645
|
-
compilation.
|
|
861
|
+
compilation.addLazyRuntimeModule(
|
|
646
862
|
chunk,
|
|
647
|
-
|
|
863
|
+
getResourceHintRuntimeModule,
|
|
864
|
+
(Ctor) => new Ctor(rel)
|
|
648
865
|
);
|
|
649
866
|
});
|
|
650
867
|
}
|
|
@@ -9,6 +9,7 @@ const Compilation = require("../Compilation");
|
|
|
9
9
|
const RuntimeGlobals = require("../RuntimeGlobals");
|
|
10
10
|
const RuntimeModule = require("../RuntimeModule");
|
|
11
11
|
const Template = require("../Template");
|
|
12
|
+
const { guessAsAttribute } = require("./parseResourceHintOptions");
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* @typedef {object} ResourceHintRuntimeModulePluginHooks
|
|
@@ -19,27 +20,6 @@ const Template = require("../Template");
|
|
|
19
20
|
/** @type {WeakMap<Compilation, ResourceHintRuntimeModulePluginHooks>} */
|
|
20
21
|
const compilationHooksMap = new WeakMap();
|
|
21
22
|
|
|
22
|
-
/**
|
|
23
|
-
* Maps a request/filename to the value of the `<link>` `as` attribute. Best
|
|
24
|
-
* effort — falls back to `"fetch"` when the type cannot be guessed. Pattern
|
|
25
|
-
* matches against the path part, ignoring any query string suffix.
|
|
26
|
-
* @param {string} request request/filename
|
|
27
|
-
* @returns {string} value for the `as` attribute
|
|
28
|
-
*/
|
|
29
|
-
const guessAsAttribute = (request) => {
|
|
30
|
-
if (/\.(png|jpe?g|gif|svg|webp|avif|bmp|ico|tiff?)(\?.*)?$/i.test(request)) {
|
|
31
|
-
return "image";
|
|
32
|
-
}
|
|
33
|
-
if (/\.(woff2?|ttf|otf|eot)(\?.*)?$/i.test(request)) return "font";
|
|
34
|
-
if (/\.css(\?.*)?$/i.test(request)) return "style";
|
|
35
|
-
if (/\.[cm]?jsx?(\?.*)?$/i.test(request)) return "script";
|
|
36
|
-
if (/\.[cm]?tsx?(\?.*)?$/i.test(request)) return "script";
|
|
37
|
-
if (/\.(mp3|wav|flac|aac|m4a|ogg|oga)(\?.*)?$/i.test(request)) return "audio";
|
|
38
|
-
if (/\.(mp4|webm|mkv|mov|m4v|ogv|avi)(\?.*)?$/i.test(request)) return "video";
|
|
39
|
-
if (/\.vtt(\?.*)?$/i.test(request)) return "track";
|
|
40
|
-
return "fetch";
|
|
41
|
-
};
|
|
42
|
-
|
|
43
23
|
class ResourceHintRuntimeModule extends RuntimeModule {
|
|
44
24
|
/**
|
|
45
25
|
* @param {Compilation} compilation the compilation
|
|
@@ -7,16 +7,8 @@
|
|
|
7
7
|
const RuntimeGlobals = require("../RuntimeGlobals");
|
|
8
8
|
const RuntimeModule = require("../RuntimeModule");
|
|
9
9
|
const Template = require("../Template");
|
|
10
|
-
const CssUrlDependency = require("../dependencies/CssUrlDependency");
|
|
11
|
-
const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
|
|
12
|
-
const URLDependency = require("../dependencies/URLDependency");
|
|
13
|
-
const ResourceHintRuntimeModule = require("./ResourceHintRuntimeModule");
|
|
14
10
|
|
|
15
|
-
/** @
|
|
16
|
-
/** @typedef {import("../ChunkGraph")} ChunkGraph */
|
|
17
|
-
/** @typedef {import("../Compilation")} Compilation */
|
|
18
|
-
/** @typedef {import("../Module")} Module */
|
|
19
|
-
/** @typedef {import("../ModuleGraph")} ModuleGraph */
|
|
11
|
+
/** @import Compilation from "../Compilation" */
|
|
20
12
|
|
|
21
13
|
/**
|
|
22
14
|
* Fires `<link rel="prefetch">` / `<link rel="preload">` for every asset
|
|
@@ -25,10 +17,17 @@ const ResourceHintRuntimeModule = require("./ResourceHintRuntimeModule");
|
|
|
25
17
|
* user module evaluates, so by the time user code reaches the
|
|
26
18
|
* corresponding `new URL(...)` (or hands the URL to `<img>`, `fetch`,
|
|
27
19
|
* `new Worker`, etc.), the browser already has the response in flight.
|
|
20
|
+
*
|
|
21
|
+
* The calls themselves are rendered by `ResourceHintPlugin`, while runtime
|
|
22
|
+
* requirements are still open — see `collectStartupAssetHintLines`.
|
|
28
23
|
*/
|
|
29
24
|
class StartupAssetHintRuntimeModule extends RuntimeModule {
|
|
30
|
-
|
|
25
|
+
/**
|
|
26
|
+
* @param {string[]} lines the `<link>` calls this chunk fires at startup
|
|
27
|
+
*/
|
|
28
|
+
constructor(lines) {
|
|
31
29
|
super("startup asset hints", RuntimeModule.STAGE_TRIGGER);
|
|
30
|
+
this._lines = lines;
|
|
32
31
|
}
|
|
33
32
|
|
|
34
33
|
/**
|
|
@@ -37,129 +36,7 @@ class StartupAssetHintRuntimeModule extends RuntimeModule {
|
|
|
37
36
|
*/
|
|
38
37
|
generate() {
|
|
39
38
|
const compilation = /** @type {Compilation} */ (this.compilation);
|
|
40
|
-
const
|
|
41
|
-
const moduleGraph = /** @type {ModuleGraph} */ (compilation.moduleGraph);
|
|
42
|
-
const runtimeTemplate = compilation.runtimeTemplate;
|
|
43
|
-
const chunk = /** @type {Chunk} */ (this.chunk);
|
|
44
|
-
const runtimeRequirements =
|
|
45
|
-
/** @type {Set<string>} */
|
|
46
|
-
(chunkGraph.getTreeRuntimeRequirements(chunk));
|
|
47
|
-
|
|
48
|
-
// Dedupe per asset module: if the same asset is referenced twice
|
|
49
|
-
// (e.g. CSS rule says `prefetch`, a JS magic comment says
|
|
50
|
-
// `preload`), pick `preload` over `prefetch` and keep the most
|
|
51
|
-
// recently seen explicit attribute overrides. Avoids emitting a
|
|
52
|
-
// duplicate `<link>` and ordering-dependent winners.
|
|
53
|
-
/**
|
|
54
|
-
* @typedef {object} AssetHintEntry
|
|
55
|
-
* @property {import("../Module")} assetModule
|
|
56
|
-
* @property {string} request
|
|
57
|
-
* @property {boolean} preload
|
|
58
|
-
* @property {("low" | "high" | "auto" | undefined)} fetchPriority
|
|
59
|
-
* @property {(string | undefined)} as
|
|
60
|
-
* @property {(string | undefined)} type
|
|
61
|
-
* @property {(string | undefined)} media
|
|
62
|
-
*/
|
|
63
|
-
// Per-asset dedupe vs the HTML-head emission by `HtmlEntryDependency`:
|
|
64
|
-
// if the asset is reachable from an HTML entrypoint's chunks, its
|
|
65
|
-
// `<link>` lands in that HTML `<head>` already — skip the runtime
|
|
66
|
-
// hint for that asset so the DOM doesn't carry two tags for one URL.
|
|
67
|
-
// Set is computed once per compilation from the module graph (stable
|
|
68
|
-
// across cache reads), never from a mutable cross-module marker.
|
|
69
|
-
const ResourceHintPlugin = require("./ResourceHintPlugin");
|
|
70
|
-
|
|
71
|
-
// `output.resourceHints: "none"` is a hard off switch — the plugin's
|
|
72
|
-
// runtime-requirements hook already skips adding this module then, so no
|
|
73
|
-
// `"none"` guard is needed here.
|
|
74
|
-
const { isHtmlHinted } =
|
|
75
|
-
ResourceHintPlugin.getCompilationResolver(compilation);
|
|
76
|
-
|
|
77
|
-
/** @type {Map<string, AssetHintEntry>} */
|
|
78
|
-
const perAsset = new Map();
|
|
79
|
-
for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
|
|
80
|
-
const deps =
|
|
81
|
-
/** @type {{ dependencies?: import("../Dependency")[] }} */
|
|
82
|
-
(module).dependencies;
|
|
83
|
-
if (!deps) continue;
|
|
84
|
-
for (const dep of deps) {
|
|
85
|
-
if (
|
|
86
|
-
!(dep instanceof URLDependency) &&
|
|
87
|
-
!(dep instanceof CssUrlDependency) &&
|
|
88
|
-
!(dep instanceof HtmlSourceDependency)
|
|
89
|
-
) {
|
|
90
|
-
continue;
|
|
91
|
-
}
|
|
92
|
-
if (!dep.prefetch && !dep.preload) continue;
|
|
93
|
-
const assetModule = moduleGraph.getModule(dep);
|
|
94
|
-
if (!assetModule) continue;
|
|
95
|
-
if (isHtmlHinted(assetModule)) continue;
|
|
96
|
-
const key = assetModule.identifier();
|
|
97
|
-
const urlDep =
|
|
98
|
-
/** @type {URLDependency & Partial<CssUrlDependency> & Partial<HtmlSourceDependency>} */
|
|
99
|
-
(dep);
|
|
100
|
-
const existing = perAsset.get(key);
|
|
101
|
-
if (existing) {
|
|
102
|
-
if (dep.preload) existing.preload = true;
|
|
103
|
-
if (dep.fetchPriority) existing.fetchPriority = dep.fetchPriority;
|
|
104
|
-
if (urlDep.asAttribute) existing.as = urlDep.asAttribute;
|
|
105
|
-
if (urlDep.typeAttribute) existing.type = urlDep.typeAttribute;
|
|
106
|
-
if (urlDep.mediaAttribute) existing.media = urlDep.mediaAttribute;
|
|
107
|
-
} else {
|
|
108
|
-
perAsset.set(key, {
|
|
109
|
-
assetModule: /** @type {Module} */ (assetModule),
|
|
110
|
-
request: dep.request,
|
|
111
|
-
preload: Boolean(dep.preload),
|
|
112
|
-
fetchPriority: dep.fetchPriority,
|
|
113
|
-
as: urlDep.asAttribute,
|
|
114
|
-
type: urlDep.typeAttribute,
|
|
115
|
-
media: urlDep.mediaAttribute
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
const lines = [];
|
|
121
|
-
for (const entry of perAsset.values()) {
|
|
122
|
-
const fn = entry.preload
|
|
123
|
-
? RuntimeGlobals.preloadAsset
|
|
124
|
-
: RuntimeGlobals.prefetchAsset;
|
|
125
|
-
// For CSS-only assets (referenced from `url(...)` but never
|
|
126
|
-
// from JS) the module produces no JS source, so
|
|
127
|
-
// `__webpack_require__(id)` would throw at runtime. Use the
|
|
128
|
-
// emitted filename + publicPath directly in that case; asset
|
|
129
|
-
// modules referenced from JS stay on the existing `moduleRaw`
|
|
130
|
-
// path which yields the same URL.
|
|
131
|
-
const hasJsSourceType = entry.assetModule
|
|
132
|
-
.getSourceTypes()
|
|
133
|
-
.has("javascript");
|
|
134
|
-
let hrefExpr;
|
|
135
|
-
if (hasJsSourceType) {
|
|
136
|
-
hrefExpr = runtimeTemplate.moduleRaw({
|
|
137
|
-
chunkGraph,
|
|
138
|
-
module: entry.assetModule,
|
|
139
|
-
request: entry.request,
|
|
140
|
-
runtimeRequirements,
|
|
141
|
-
weak: false
|
|
142
|
-
});
|
|
143
|
-
} else {
|
|
144
|
-
const buildInfo =
|
|
145
|
-
/** @type {{ filename?: string }} */
|
|
146
|
-
(entry.assetModule.buildInfo);
|
|
147
|
-
if (!buildInfo || !buildInfo.filename) continue;
|
|
148
|
-
runtimeRequirements.add(RuntimeGlobals.publicPath);
|
|
149
|
-
hrefExpr = `${RuntimeGlobals.publicPath} + ${JSON.stringify(buildInfo.filename)}`;
|
|
150
|
-
}
|
|
151
|
-
const as =
|
|
152
|
-
entry.as || ResourceHintRuntimeModule.guessAsAttribute(entry.request);
|
|
153
|
-
lines.push(
|
|
154
|
-
`${fn}(${hrefExpr}, ${JSON.stringify(as)}, ${
|
|
155
|
-
entry.type ? JSON.stringify(entry.type) : "undefined"
|
|
156
|
-
}, ${entry.media ? JSON.stringify(entry.media) : "undefined"}, ${
|
|
157
|
-
entry.fetchPriority
|
|
158
|
-
? JSON.stringify(entry.fetchPriority)
|
|
159
|
-
: "undefined"
|
|
160
|
-
});`
|
|
161
|
-
);
|
|
162
|
-
}
|
|
39
|
+
const lines = this._lines;
|
|
163
40
|
if (lines.length === 0) return null;
|
|
164
41
|
// `__webpack_nonce__` set inside the entry module is too late — the
|
|
165
42
|
// entry hasn't run yet. Read the nonce off the `<script>` tag that
|