@depup/webpack 5.109.2-depup.0 → 5.110.3-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 +46 -35
- 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 +107 -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 +91 -26
- 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 +111 -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 +40 -49
- 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 +152 -103
- 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 +335 -169
- package/lib/RuntimeTemplate.js +2761 -316
- 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 +12 -6
- 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 +270 -78
- package/lib/config/defineConfig.js +10 -2
- package/lib/config/getClaimedAssetTypes.js +65 -0
- package/lib/config/normalization.js +46 -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 +84 -32
- package/lib/css/CssModule.js +10 -7
- package/lib/css/CssModulesPlugin.js +172 -100
- 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 +5334 -0
- package/lib/css/syntax.js +9647 -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 +170 -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 +24 -11
- 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 +23 -14
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +80 -12
- package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
- package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +286 -80
- 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 +121 -60
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +124 -38
- package/lib/dependencies/HarmonyImportGuard.js +20 -30
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +152 -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 +49 -31
- 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 +45 -5
- package/lib/dependencies/ImportDependency.js +33 -50
- 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 +73 -49
- 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 +50 -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 +47 -28
- package/lib/dependencies/WorkerDependency.js +22 -22
- package/lib/dependencies/WorkletDependency.js +18 -21
- package/lib/dependencies/getFunctionExpression.js +8 -4
- package/lib/dependencies/importOptionsCheck.js +47 -0
- 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/DotenvFileError.js +29 -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/ImportedBindingAssignmentError.js +30 -0
- 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 +86 -51
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +161 -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 +366 -200
- 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 +6034 -1384
- 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 +103 -123
- 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 +47 -6
- 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 +65 -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 +1030 -476
- package/lib/optimize/ConstExportsPlugin.js +16 -7
- package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
- package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
- package/lib/optimize/InlineExports.js +130 -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 +121 -41
- 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 -79
- 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 +6 -2
- 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 +34 -7
- 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 +46 -20
- 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 +22 -9
- 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 +20 -24
- package/lib/url/URLParserPlugin.js +26 -13
- package/lib/util/ArrayQueue.js +3 -3
- 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 +1066 -24
- package/lib/util/StringXor.js +1 -1
- package/lib/util/URLAbsoluteSpecifier.js +3 -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 +10 -2
- package/lib/util/createHash.js +2 -2
- package/lib/util/createHooksRegistry.js +8 -10
- package/lib/util/createMappings.js +25 -3
- 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 +8 -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/removeBOM.js +82 -1
- 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 +43 -21
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +45 -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 +29 -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 +105 -19
- package/lib/web/FetchCompileWasmPlugin.js +48 -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 +667 -34
- 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 +3223 -465
- 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.
|
|
@@ -260,7 +300,12 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
|
|
|
260
300
|
const out = [];
|
|
261
301
|
/** @type {Set<string>} */
|
|
262
302
|
const seenKeys = new Set();
|
|
263
|
-
|
|
303
|
+
/**
|
|
304
|
+
* Appends a hint, dropping one already emitted for the same rel + href.
|
|
305
|
+
* @param {EntrypointHint} h hint to append
|
|
306
|
+
* @returns {void}
|
|
307
|
+
*/
|
|
308
|
+
const push = (h) => {
|
|
264
309
|
const key = `${h.rel}\0${h.href}`;
|
|
265
310
|
if (seenKeys.has(key)) return;
|
|
266
311
|
seenKeys.add(key);
|
|
@@ -327,9 +372,7 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
|
|
|
327
372
|
/** @type {{ filename?: string }} */
|
|
328
373
|
(target.buildInfo);
|
|
329
374
|
if (!buildInfo || !buildInfo.filename) continue;
|
|
330
|
-
const asAttribute =
|
|
331
|
-
dep.asAttribute ||
|
|
332
|
-
ResourceHintRuntimeModule.guessAsAttribute(dep.request);
|
|
375
|
+
const asAttribute = dep.asAttribute || guessAsAttribute(dep.request);
|
|
333
376
|
/** @type {EntrypointHint} */
|
|
334
377
|
const h = {
|
|
335
378
|
rel: dep.preload ? "preload" : "prefetch",
|
|
@@ -348,14 +391,13 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
|
|
|
348
391
|
// `stats.entrypoints[name].resourceHints` see `"js"`.
|
|
349
392
|
let hostType = /** @type {"html" | "js"} */ ("js");
|
|
350
393
|
|
|
351
|
-
const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
|
|
352
|
-
|
|
353
394
|
outer: for (const module of compilation.modules) {
|
|
354
395
|
if (!module.getSourceTypes || !module.getSourceTypes().has("html")) {
|
|
355
396
|
continue;
|
|
356
397
|
}
|
|
357
398
|
const presDeps = module.presentationalDependencies;
|
|
358
399
|
if (!presDeps) continue;
|
|
400
|
+
const HtmlEntryDependency = getHtmlEntryDependency();
|
|
359
401
|
for (const dep of presDeps) {
|
|
360
402
|
if (
|
|
361
403
|
dep instanceof HtmlEntryDependency &&
|
|
@@ -377,6 +419,208 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
|
|
|
377
419
|
);
|
|
378
420
|
};
|
|
379
421
|
|
|
422
|
+
/**
|
|
423
|
+
* Renders the `<link>` calls a chunk fires at startup, for every asset and worker
|
|
424
|
+
* chunk it references with a resource hint. Run while runtime requirements are still
|
|
425
|
+
* open, so what an href reads is added to `set` rather than assumed: an href spelled
|
|
426
|
+
* as a literal leaves `.p` and `.u` out of the chunk entirely.
|
|
427
|
+
* @param {Chunk} chunk the chunk the calls are emitted into
|
|
428
|
+
* @param {Compilation} compilation the compilation
|
|
429
|
+
* @param {ChunkGraph} chunkGraph the chunk graph
|
|
430
|
+
* @param {CodeGenerationResults} codeGenerationResults the code generation results
|
|
431
|
+
* @param {RuntimeRequirements} set the chunk's runtime requirements
|
|
432
|
+
* @returns {string[]} one call per hinted asset, in emission order
|
|
433
|
+
*/
|
|
434
|
+
const collectStartupAssetHintLines = (
|
|
435
|
+
chunk,
|
|
436
|
+
compilation,
|
|
437
|
+
chunkGraph,
|
|
438
|
+
codeGenerationResults,
|
|
439
|
+
set
|
|
440
|
+
) => {
|
|
441
|
+
const { moduleGraph, runtimeTemplate } = compilation;
|
|
442
|
+
const resolver =
|
|
443
|
+
/** @type {CompilationResolver} */
|
|
444
|
+
(compilationResolvers.get(compilation));
|
|
445
|
+
/** @type {string[]} */
|
|
446
|
+
const lines = [];
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* @param {string} fn the `<link>` helper
|
|
450
|
+
* @param {string} href the href expression
|
|
451
|
+
* @param {string} as the `as` attribute
|
|
452
|
+
* @param {StartupHintAttributes} attributes the remaining attributes
|
|
453
|
+
* @returns {void}
|
|
454
|
+
*/
|
|
455
|
+
const push = (fn, href, as, attributes) => {
|
|
456
|
+
set.add(fn);
|
|
457
|
+
lines.push(
|
|
458
|
+
`${fn}(${href}, ${JSON.stringify(as)}, ${
|
|
459
|
+
attributes.type ? JSON.stringify(attributes.type) : "undefined"
|
|
460
|
+
}, ${attributes.media ? JSON.stringify(attributes.media) : "undefined"}, ${
|
|
461
|
+
attributes.fetchPriority
|
|
462
|
+
? JSON.stringify(attributes.fetchPriority)
|
|
463
|
+
: "undefined"
|
|
464
|
+
});`
|
|
465
|
+
);
|
|
466
|
+
};
|
|
467
|
+
|
|
468
|
+
// The analyzable worker form can't wrap its own href without losing the literal
|
|
469
|
+
// specifier, so its `<link>` fires here — keyed by chunk, hence a separate pass.
|
|
470
|
+
/** @type {Set<string | number>} */
|
|
471
|
+
const seenWorkerChunks = new Set();
|
|
472
|
+
for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
|
|
473
|
+
for (const block of module.blocks) {
|
|
474
|
+
for (const dep of block.dependencies) {
|
|
475
|
+
if (!(dep instanceof WorkerDependency)) continue;
|
|
476
|
+
const hint = dep.options.resourceHint;
|
|
477
|
+
if (!hint || (!hint.preload && !hint.prefetch)) continue;
|
|
478
|
+
const group = chunkGraph.getBlockChunkGroup(block);
|
|
479
|
+
if (!group) continue;
|
|
480
|
+
const workerChunk =
|
|
481
|
+
/** @type {import("../Entrypoint")} */
|
|
482
|
+
(group).getEntrypointChunk();
|
|
483
|
+
if (workerChunk.id === null || seenWorkerChunks.has(workerChunk.id)) {
|
|
484
|
+
continue;
|
|
485
|
+
}
|
|
486
|
+
seenWorkerChunks.add(workerChunk.id);
|
|
487
|
+
// The same specifier the `new Worker(...)` call site bakes, asked of the
|
|
488
|
+
// same module, so the two agree on whether a literal is spellable.
|
|
489
|
+
const specifier = runtimeTemplate.getAnalyzableWorkerUrl(
|
|
490
|
+
dep.options.publicPath,
|
|
491
|
+
workerChunk,
|
|
492
|
+
module,
|
|
493
|
+
chunkGraph,
|
|
494
|
+
set
|
|
495
|
+
);
|
|
496
|
+
// Without one the call site keeps the runtime form, where it wraps its own
|
|
497
|
+
// href — firing the `<link>` here too would emit the call twice.
|
|
498
|
+
if (specifier === null) continue;
|
|
499
|
+
push(
|
|
500
|
+
hint.preload
|
|
501
|
+
? RuntimeGlobals.preloadAsset
|
|
502
|
+
: RuntimeGlobals.prefetchAsset,
|
|
503
|
+
`${runtimeTemplate.importMetaUrl(specifier)}.href`,
|
|
504
|
+
hint.as || "script",
|
|
505
|
+
hint
|
|
506
|
+
);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// Dedupe per asset module so two references can't emit two `<link>`s: `preload`
|
|
512
|
+
// wins over `prefetch`, and the last explicit attribute override sticks.
|
|
513
|
+
/** @type {Map<string, AssetHintEntry>} */
|
|
514
|
+
const perAsset = new Map();
|
|
515
|
+
for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
|
|
516
|
+
const deps =
|
|
517
|
+
/** @type {{ dependencies?: import("../Dependency")[] }} */
|
|
518
|
+
(module).dependencies;
|
|
519
|
+
if (!deps) continue;
|
|
520
|
+
for (const dep of deps) {
|
|
521
|
+
if (!isUrlAssetDep(dep)) continue;
|
|
522
|
+
if (!dep.prefetch && !dep.preload) continue;
|
|
523
|
+
const assetModule = moduleGraph.getModule(dep);
|
|
524
|
+
if (!assetModule) continue;
|
|
525
|
+
// Already a `<link>` in the html `<head>` emitted by `HtmlEntryDependency`,
|
|
526
|
+
// so the runtime hint would leave the DOM with two tags for one url.
|
|
527
|
+
if (resolver.isHtmlHinted(assetModule)) continue;
|
|
528
|
+
const key = assetModule.identifier();
|
|
529
|
+
const urlDep =
|
|
530
|
+
/** @type {URLDependency & Partial<CssUrlDependency> & Partial<HtmlSourceDependency>} */
|
|
531
|
+
(dep);
|
|
532
|
+
const existing = perAsset.get(key);
|
|
533
|
+
if (existing) {
|
|
534
|
+
if (dep.preload) existing.preload = true;
|
|
535
|
+
if (dep.fetchPriority) existing.fetchPriority = dep.fetchPriority;
|
|
536
|
+
if (urlDep.asAttribute) existing.as = urlDep.asAttribute;
|
|
537
|
+
if (urlDep.typeAttribute) existing.type = urlDep.typeAttribute;
|
|
538
|
+
if (urlDep.mediaAttribute) existing.media = urlDep.mediaAttribute;
|
|
539
|
+
} else {
|
|
540
|
+
perAsset.set(key, {
|
|
541
|
+
assetModule: /** @type {Module} */ (assetModule),
|
|
542
|
+
originModule: module,
|
|
543
|
+
request: dep.request,
|
|
544
|
+
preload: Boolean(dep.preload),
|
|
545
|
+
fetchPriority: dep.fetchPriority,
|
|
546
|
+
as: urlDep.asAttribute,
|
|
547
|
+
type: urlDep.typeAttribute,
|
|
548
|
+
media: urlDep.mediaAttribute
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
for (const entry of perAsset.values()) {
|
|
555
|
+
const { assetModule } = entry;
|
|
556
|
+
let href;
|
|
557
|
+
// An asset with a javascript wrapper exposes its url through it; one without has
|
|
558
|
+
// no `__webpack_modules__` entry to require.
|
|
559
|
+
if (assetModule.getSourceTypes().has(JAVASCRIPT_TYPE)) {
|
|
560
|
+
href = runtimeTemplate.moduleRaw({
|
|
561
|
+
chunkGraph,
|
|
562
|
+
module: assetModule,
|
|
563
|
+
request: entry.request,
|
|
564
|
+
runtimeRequirements: set,
|
|
565
|
+
weak: false
|
|
566
|
+
});
|
|
567
|
+
} else {
|
|
568
|
+
const has = codeGenerationResults.has(assetModule, chunk.runtime);
|
|
569
|
+
const urlData = has
|
|
570
|
+
? codeGenerationResults.getData(assetModule, chunk.runtime, "url")
|
|
571
|
+
: undefined;
|
|
572
|
+
const resolved = urlData && urlData[ASSET_URL_TYPE];
|
|
573
|
+
// A generator `publicPath` overrides `output.publicPath`, so prefer it; only the
|
|
574
|
+
// two placeholders below are still unresolved when this runs.
|
|
575
|
+
const templated =
|
|
576
|
+
typeof resolved === "string" &&
|
|
577
|
+
(resolved.includes(PUBLIC_PATH_AUTO) ||
|
|
578
|
+
resolved.includes(PUBLIC_PATH_FULL_HASH));
|
|
579
|
+
if (typeof resolved === "string" && !templated) {
|
|
580
|
+
href = JSON.stringify(resolved);
|
|
581
|
+
} else {
|
|
582
|
+
const filename = has
|
|
583
|
+
? codeGenerationResults.getData(
|
|
584
|
+
assetModule,
|
|
585
|
+
chunk.runtime,
|
|
586
|
+
"filename"
|
|
587
|
+
)
|
|
588
|
+
: undefined;
|
|
589
|
+
if (typeof filename !== "string") continue;
|
|
590
|
+
// The literal the `new URL()` call site bakes, asked of the same module —
|
|
591
|
+
// but written into a runtime module, which no `eval` devtool wraps.
|
|
592
|
+
const specifier = runtimeTemplate.supportsAnalyzable(
|
|
593
|
+
"url-runtime",
|
|
594
|
+
chunkGraph,
|
|
595
|
+
entry.originModule
|
|
596
|
+
)
|
|
597
|
+
? runtimeTemplate.getAnalyzableAssetUrl(
|
|
598
|
+
entry.originModule,
|
|
599
|
+
chunkGraph,
|
|
600
|
+
filename,
|
|
601
|
+
chunk.runtime
|
|
602
|
+
)
|
|
603
|
+
: null;
|
|
604
|
+
if (specifier !== null) {
|
|
605
|
+
href = `${runtimeTemplate.importMetaUrl(specifier)}.href`;
|
|
606
|
+
} else {
|
|
607
|
+
set.add(RuntimeGlobals.publicPath);
|
|
608
|
+
href = `${RuntimeGlobals.publicPath} + ${JSON.stringify(filename)}`;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
push(
|
|
613
|
+
entry.preload
|
|
614
|
+
? RuntimeGlobals.preloadAsset
|
|
615
|
+
: RuntimeGlobals.prefetchAsset,
|
|
616
|
+
href,
|
|
617
|
+
entry.as || guessAsAttribute(entry.request),
|
|
618
|
+
entry
|
|
619
|
+
);
|
|
620
|
+
}
|
|
621
|
+
return lines;
|
|
622
|
+
};
|
|
623
|
+
|
|
380
624
|
/**
|
|
381
625
|
* Adds runtime support for `__webpack_require__.PA` / `__webpack_require__.LA`,
|
|
382
626
|
* the helpers that inject `<link rel="prefetch">` / `<link rel="preload">`
|
|
@@ -493,8 +737,6 @@ class ResourceHintPlugin {
|
|
|
493
737
|
apply(compiler) {
|
|
494
738
|
const hints = this._hints;
|
|
495
739
|
|
|
496
|
-
const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
|
|
497
|
-
|
|
498
740
|
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
499
741
|
// Lazy-computed on first access — walk every HTML module's
|
|
500
742
|
// `HtmlEntryDependency`s, resolve each named entry, and collect
|
|
@@ -521,6 +763,7 @@ class ResourceHintPlugin {
|
|
|
521
763
|
// they don't affect module resolution, only rendering.
|
|
522
764
|
const presDeps = module.presentationalDependencies;
|
|
523
765
|
if (!presDeps) continue;
|
|
766
|
+
const HtmlEntryDependency = getHtmlEntryDependency();
|
|
524
767
|
for (const dep of presDeps) {
|
|
525
768
|
if (
|
|
526
769
|
!(dep instanceof HtmlEntryDependency) ||
|
|
@@ -583,56 +826,28 @@ class ResourceHintPlugin {
|
|
|
583
826
|
getEntrypointHints: (entryName) =>
|
|
584
827
|
collectEntrypointHints(compilation, entryName, hints)
|
|
585
828
|
});
|
|
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).
|
|
829
|
+
// Rendered here, not in the runtime module: requirements are still open, so a
|
|
830
|
+
// literal href costs no `.p`/`.u`, and async chunks are reached as well.
|
|
591
831
|
compilation.hooks.additionalChunkRuntimeRequirements.tap(
|
|
592
832
|
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
|
-
}
|
|
833
|
+
(chunk, set, { chunkGraph, codeGenerationResults }) => {
|
|
834
|
+
// Browser markup, and no DOM to put it in — the call sites skip their
|
|
835
|
+
// hints under build-time execution too (`URLDependency`).
|
|
836
|
+
if (hints === "none" || chunkGraph.buildTimeExecution) return;
|
|
837
|
+
const lines = collectStartupAssetHintLines(
|
|
838
|
+
chunk,
|
|
839
|
+
compilation,
|
|
840
|
+
chunkGraph,
|
|
841
|
+
codeGenerationResults,
|
|
842
|
+
set
|
|
843
|
+
);
|
|
844
|
+
if (lines.length === 0) return;
|
|
845
|
+
set.add(RuntimeGlobals.startupAssetHints);
|
|
846
|
+
compilation.addLazyRuntimeModule(
|
|
847
|
+
chunk,
|
|
848
|
+
getStartupAssetHintRuntimeModule,
|
|
849
|
+
(Ctor) => new Ctor(lines)
|
|
850
|
+
);
|
|
636
851
|
}
|
|
637
852
|
);
|
|
638
853
|
for (const [rel, runtimeGlobal] of /** @type {const} */ ([
|
|
@@ -642,9 +857,10 @@ class ResourceHintPlugin {
|
|
|
642
857
|
compilation.hooks.runtimeRequirementInTree
|
|
643
858
|
.for(runtimeGlobal)
|
|
644
859
|
.tap(PLUGIN_NAME, (chunk) => {
|
|
645
|
-
compilation.
|
|
860
|
+
compilation.addLazyRuntimeModule(
|
|
646
861
|
chunk,
|
|
647
|
-
|
|
862
|
+
getResourceHintRuntimeModule,
|
|
863
|
+
(Ctor) => new Ctor(rel)
|
|
648
864
|
);
|
|
649
865
|
});
|
|
650
866
|
}
|
|
@@ -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
|