@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
|
@@ -21,21 +21,28 @@ const { makePathsRelative } = require("../util/identifier");
|
|
|
21
21
|
const memoize = require("../util/memoize");
|
|
22
22
|
const MinMaxSizeWarning = require("./MinMaxSizeWarning");
|
|
23
23
|
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
24
|
+
/**
|
|
25
|
+
* @import {
|
|
26
|
+
* OptimizationSplitChunksCacheGroup,
|
|
27
|
+
* OptimizationSplitChunksOptions,
|
|
28
|
+
* OptimizationSplitChunksSizes
|
|
29
|
+
* } from "../../declarations/WebpackOptions"
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* @import {
|
|
33
|
+
* OutputNormalizedWithDefaults as OutputOptions
|
|
34
|
+
* } from "../config/defaults"
|
|
35
|
+
*/
|
|
36
|
+
/** @import { ChunkName, ChunkFilenameTemplate } from "../Chunk" */
|
|
37
|
+
/** @import ChunkGraph from "../ChunkGraph" */
|
|
38
|
+
/** @import ChunkGroup from "../ChunkGroup" */
|
|
39
|
+
/** @import Compilation from "../Compilation" */
|
|
40
|
+
/** @import Compiler from "../Compiler" */
|
|
41
|
+
/** @import Module, { SourceType } from "../Module" */
|
|
42
|
+
/** @import ModuleGraph from "../ModuleGraph" */
|
|
36
43
|
/** @typedef {import("../util/deterministicGrouping").GroupedItems<Module>} DeterministicGroupingGroupedItemsForModule */
|
|
37
44
|
/** @typedef {import("../util/deterministicGrouping").Options<Module>} DeterministicGroupingOptionsForModule */
|
|
38
|
-
/** @
|
|
45
|
+
/** @import { Sizes } from "../util/deterministicGrouping" */
|
|
39
46
|
|
|
40
47
|
/**
|
|
41
48
|
* Defines the chunk filter fn callback.
|
|
@@ -212,6 +219,27 @@ const hashFilename = (name, outputOptions) => {
|
|
|
212
219
|
return digest.slice(0, 8);
|
|
213
220
|
};
|
|
214
221
|
|
|
222
|
+
/**
|
|
223
|
+
* A split `maxInitialRequests`/`maxAsyncRequests` refused, recorded for
|
|
224
|
+
* `performance.splitChunksCapped`.
|
|
225
|
+
* @typedef {object} CappedSplit
|
|
226
|
+
* @property {string} cacheGroup the cache group whose split was refused
|
|
227
|
+
* @property {Chunk} chunk the chunk it would have been taken out of
|
|
228
|
+
* @property {"maxAsyncRequests" | "maxInitialRequests"} limit the option that refused it
|
|
229
|
+
* @property {number} maxRequests the value that option had
|
|
230
|
+
* @property {number} modules how many modules the split would have moved
|
|
231
|
+
*/
|
|
232
|
+
|
|
233
|
+
/** @type {WeakMap<Compilation, CappedSplit[]>} */
|
|
234
|
+
const CAPPED_SPLITS = new WeakMap();
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Reads back the splits a request cap refused during this compilation.
|
|
238
|
+
* @param {Compilation} compilation the compilation
|
|
239
|
+
* @returns {CappedSplit[] | undefined} the refused splits, or `undefined` when nothing recorded them
|
|
240
|
+
*/
|
|
241
|
+
const getCappedSplits = (compilation) => CAPPED_SPLITS.get(compilation);
|
|
242
|
+
|
|
215
243
|
/**
|
|
216
244
|
* Returns the number of requests.
|
|
217
245
|
* @param {Chunk} chunk the chunk
|
|
@@ -690,7 +718,7 @@ const createCacheGroupSource = (options, key, defaultSizeTypes) => {
|
|
|
690
718
|
|
|
691
719
|
const PLUGIN_NAME = "SplitChunksPlugin";
|
|
692
720
|
|
|
693
|
-
|
|
721
|
+
class SplitChunksPlugin {
|
|
694
722
|
/**
|
|
695
723
|
* Creates an instance of SplitChunksPlugin.
|
|
696
724
|
* @param {OptimizationSplitChunksOptions=} options plugin options
|
|
@@ -897,6 +925,19 @@ module.exports = class SplitChunksPlugin {
|
|
|
897
925
|
(chunks) => {
|
|
898
926
|
if (alreadyOptimized) return;
|
|
899
927
|
alreadyOptimized = true;
|
|
928
|
+
const { performance } = compilation.options;
|
|
929
|
+
// Mirrors both of `SplitChunksCappedPlugin`'s gates: a build that
|
|
930
|
+
// would not report records nothing and allocates nothing.
|
|
931
|
+
/** @type {CappedSplit[] | undefined} */
|
|
932
|
+
let cappedSplits;
|
|
933
|
+
if (
|
|
934
|
+
performance !== false &&
|
|
935
|
+
performance.splitChunksCapped === true &&
|
|
936
|
+
Boolean(performance.hints)
|
|
937
|
+
) {
|
|
938
|
+
cappedSplits = [];
|
|
939
|
+
CAPPED_SPLITS.set(compilation, cappedSplits);
|
|
940
|
+
}
|
|
900
941
|
logger.time("prepare");
|
|
901
942
|
const chunkGraph = compilation.chunkGraph;
|
|
902
943
|
const moduleGraph = compilation.moduleGraph;
|
|
@@ -1644,19 +1685,36 @@ module.exports = class SplitChunksPlugin {
|
|
|
1644
1685
|
Number.isFinite(item.cacheGroup.maxAsyncRequests))
|
|
1645
1686
|
) {
|
|
1646
1687
|
for (const chunk of usedChunks) {
|
|
1647
|
-
// respect max requests
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
)
|
|
1655
|
-
|
|
1688
|
+
// respect max requests: a chunk that is both initial and
|
|
1689
|
+
// async answers to the stricter of the two caps
|
|
1690
|
+
const isOnlyInitial = chunk.isOnlyInitial();
|
|
1691
|
+
const byAsyncRequests =
|
|
1692
|
+
!isOnlyInitial &&
|
|
1693
|
+
(!chunk.canBeInitial() ||
|
|
1694
|
+
item.cacheGroup.maxAsyncRequests <
|
|
1695
|
+
item.cacheGroup.maxInitialRequests);
|
|
1696
|
+
const maxRequests = byAsyncRequests
|
|
1697
|
+
? item.cacheGroup.maxAsyncRequests
|
|
1698
|
+
: item.cacheGroup.maxInitialRequests;
|
|
1656
1699
|
if (
|
|
1657
1700
|
Number.isFinite(maxRequests) &&
|
|
1658
1701
|
getRequests(chunk) >= maxRequests
|
|
1659
1702
|
) {
|
|
1703
|
+
if (cappedSplits !== undefined) {
|
|
1704
|
+
cappedSplits.push({
|
|
1705
|
+
cacheGroup: item.cacheGroup.key,
|
|
1706
|
+
chunk,
|
|
1707
|
+
// which cap it was cannot be read back off the value:
|
|
1708
|
+
// the two are equal by default in production
|
|
1709
|
+
limit: byAsyncRequests
|
|
1710
|
+
? "maxAsyncRequests"
|
|
1711
|
+
: "maxInitialRequests",
|
|
1712
|
+
maxRequests:
|
|
1713
|
+
/** @type {number} */
|
|
1714
|
+
(maxRequests),
|
|
1715
|
+
modules: item.modules.size
|
|
1716
|
+
});
|
|
1717
|
+
}
|
|
1660
1718
|
usedChunks.delete(chunk);
|
|
1661
1719
|
}
|
|
1662
1720
|
}
|
|
@@ -1983,4 +2041,8 @@ module.exports = class SplitChunksPlugin {
|
|
|
1983
2041
|
);
|
|
1984
2042
|
});
|
|
1985
2043
|
}
|
|
1986
|
-
}
|
|
2044
|
+
}
|
|
2045
|
+
|
|
2046
|
+
SplitChunksPlugin.getCappedSplits = getCappedSplits;
|
|
2047
|
+
|
|
2048
|
+
module.exports = SplitChunksPlugin;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
const WebpackError = require("../errors/WebpackError");
|
|
9
9
|
const formatSize = require("../util/formatSize");
|
|
10
10
|
|
|
11
|
-
/** @
|
|
11
|
+
/** @import { AssetDetails } from "./SizeLimitsPlugin" */
|
|
12
12
|
|
|
13
13
|
class AssetsOverSizeLimitWarning extends WebpackError {
|
|
14
14
|
/**
|
|
@@ -18,7 +18,15 @@ class AssetsOverSizeLimitWarning extends WebpackError {
|
|
|
18
18
|
*/
|
|
19
19
|
constructor(assetsOverSizeLimit, assetLimit) {
|
|
20
20
|
const assetLists = assetsOverSizeLimit
|
|
21
|
-
.map((asset) =>
|
|
21
|
+
.map((asset) => {
|
|
22
|
+
const largest = asset.modules
|
|
23
|
+
? `\n Largest modules: ${asset.modules
|
|
24
|
+
.map((module) => `${module.name} (${formatSize(module.size)})`)
|
|
25
|
+
.join(", ")}`
|
|
26
|
+
: "";
|
|
27
|
+
|
|
28
|
+
return `\n ${asset.name} (${formatSize(asset.size)})${largest}`;
|
|
29
|
+
})
|
|
22
30
|
.join("");
|
|
23
31
|
|
|
24
32
|
super(`asset size limit: The following asset(s) exceed the recommended size limit (${formatSize(
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Alexander Akait @alexander-akait
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const AsyncChunkWaterfallWarning = require("../errors/AsyncChunkWaterfallWarning");
|
|
9
|
+
|
|
10
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
11
|
+
/** @import ChunkGroup from "../ChunkGroup" */
|
|
12
|
+
/** @import Compiler from "../Compiler" */
|
|
13
|
+
/** @import { WaterfallDetails } from "../errors/AsyncChunkWaterfallWarning" */
|
|
14
|
+
|
|
15
|
+
const PLUGIN_NAME = "AsyncChunkWaterfallsPlugin";
|
|
16
|
+
|
|
17
|
+
// Enough to name the offenders without printing the whole chunk graph.
|
|
18
|
+
const MAX_REPORTED_WATERFALLS = 5;
|
|
19
|
+
|
|
20
|
+
// Two levels is the shape `import()` is for — a route that loads its own data.
|
|
21
|
+
// Three is where the round trips start outweighing what splitting saved.
|
|
22
|
+
const MIN_REPORTED_DEPTH = 3;
|
|
23
|
+
|
|
24
|
+
class AsyncChunkWaterfallsPlugin {
|
|
25
|
+
/**
|
|
26
|
+
* Creates an instance of AsyncChunkWaterfallsPlugin.
|
|
27
|
+
* @param {PerformanceOptions} options the plugin options
|
|
28
|
+
*/
|
|
29
|
+
constructor(options) {
|
|
30
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
31
|
+
this.hints = options.hints;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
36
|
+
* @param {Compiler} compiler the compiler instance
|
|
37
|
+
* @returns {void}
|
|
38
|
+
*/
|
|
39
|
+
apply(compiler) {
|
|
40
|
+
const hints = this.hints;
|
|
41
|
+
|
|
42
|
+
if (!hints) return;
|
|
43
|
+
|
|
44
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
45
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
46
|
+
// hint reported earlier would change the build's identity.
|
|
47
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
48
|
+
const { chunkGraph } = compilation;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The name to print for a group; ids exist by `afterSeal`.
|
|
52
|
+
* @param {ChunkGroup} group the group
|
|
53
|
+
* @returns {string} what to call it
|
|
54
|
+
*/
|
|
55
|
+
const nameOf = (group) => {
|
|
56
|
+
if (group.name) return group.name;
|
|
57
|
+
|
|
58
|
+
const [chunk] = group.chunks;
|
|
59
|
+
|
|
60
|
+
return chunk && chunk.id !== null ? `${chunk.id}` : "(unnamed)";
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// Breadth-first from the initial groups, so the depth recorded for a
|
|
64
|
+
// group is the fewest requests a client makes to reach it.
|
|
65
|
+
/** @type {Map<ChunkGroup, ChunkGroup[]>} */
|
|
66
|
+
const pathTo = new Map();
|
|
67
|
+
/** @type {ChunkGroup[]} */
|
|
68
|
+
const queue = [];
|
|
69
|
+
|
|
70
|
+
for (const group of compilation.chunkGroups) {
|
|
71
|
+
if (!group.isInitial()) continue;
|
|
72
|
+
|
|
73
|
+
pathTo.set(group, []);
|
|
74
|
+
queue.push(group);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** @type {WaterfallDetails[]} */
|
|
78
|
+
const waterfalls = [];
|
|
79
|
+
let deepest = 0;
|
|
80
|
+
|
|
81
|
+
for (let i = 0; i < queue.length; i++) {
|
|
82
|
+
const group = queue[i];
|
|
83
|
+
const path = /** @type {ChunkGroup[]} */ (pathTo.get(group));
|
|
84
|
+
|
|
85
|
+
for (const child of group.getChildren()) {
|
|
86
|
+
if (pathTo.has(child)) continue;
|
|
87
|
+
|
|
88
|
+
const childPath = [...path, child];
|
|
89
|
+
|
|
90
|
+
pathTo.set(child, childPath);
|
|
91
|
+
queue.push(child);
|
|
92
|
+
|
|
93
|
+
if (childPath.length < MIN_REPORTED_DEPTH) continue;
|
|
94
|
+
|
|
95
|
+
// Only the end of a chain is reported: every prefix of it is a
|
|
96
|
+
// waterfall too, and naming them all says the same thing N times.
|
|
97
|
+
if (child.getNumberOfChildren() > 0) continue;
|
|
98
|
+
|
|
99
|
+
let size = 0;
|
|
100
|
+
|
|
101
|
+
for (const step of childPath) {
|
|
102
|
+
for (const chunk of step.chunks) {
|
|
103
|
+
size += chunkGraph.getChunkSize(chunk);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
deepest = Math.max(deepest, childPath.length);
|
|
108
|
+
waterfalls.push({ chain: childPath.map(nameOf), size });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (waterfalls.length === 0) return;
|
|
113
|
+
|
|
114
|
+
// Deepest first, then largest: the worst round-trip cost leads.
|
|
115
|
+
waterfalls.sort(
|
|
116
|
+
(a, b) => b.chain.length - a.chain.length || b.size - a.size
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
const warning = new AsyncChunkWaterfallWarning(
|
|
120
|
+
waterfalls.slice(0, MAX_REPORTED_WATERFALLS),
|
|
121
|
+
deepest
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
if (hints === "error") {
|
|
125
|
+
compilation.errors.push(warning);
|
|
126
|
+
} else if (hints === "stats") {
|
|
127
|
+
compilation.hints.push(warning);
|
|
128
|
+
} else {
|
|
129
|
+
compilation.warnings.push(warning);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
module.exports = AsyncChunkWaterfallsPlugin;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Alexander Akait @alexander-akait
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const ContextModule = require("../ContextModule");
|
|
9
|
+
const BroadContextsWarning = require("../errors/BroadContextsWarning");
|
|
10
|
+
const { compareStrings } = require("../util/comparators");
|
|
11
|
+
const getModuleSize = require("./getModuleSize");
|
|
12
|
+
|
|
13
|
+
/** @typedef {import("../../declarations/WebpackOptions").PerformanceOptions} PerformanceOptions */
|
|
14
|
+
/** @typedef {import("../Compiler")} Compiler */
|
|
15
|
+
/** @typedef {import("../Dependency")} Dependency */
|
|
16
|
+
/** @typedef {import("../Module")} Module */
|
|
17
|
+
/** @typedef {import("../errors/BroadContextsWarning").BroadContextDetails} BroadContextDetails */
|
|
18
|
+
|
|
19
|
+
const PLUGIN_NAME = "BroadContextsPlugin";
|
|
20
|
+
|
|
21
|
+
// Enough to name the offenders without printing every context in the build.
|
|
22
|
+
const MAX_REPORTED_CONTEXTS = 5;
|
|
23
|
+
|
|
24
|
+
// A directory holding a handful of files costs little however it is matched,
|
|
25
|
+
// and warning about it would bury the contexts that do carry weight.
|
|
26
|
+
const MIN_REPORTED_MODULES = 20;
|
|
27
|
+
|
|
28
|
+
// A bare leading wildcard takes every name in the directory, whether it is
|
|
29
|
+
// `require.context`'s default or one webpack derived from an expression.
|
|
30
|
+
const WILDCARD_PREFIX = "^\\.\\/.*";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Whether a context takes whatever the directory holds. A pattern that narrows
|
|
34
|
+
* by anything other than a leading wildcard is left alone, as is one webpack
|
|
35
|
+
* cannot read — an unrecognized filter is never guessed at.
|
|
36
|
+
* @param {ContextModule} module a context module
|
|
37
|
+
* @returns {boolean} true when nothing narrows it
|
|
38
|
+
*/
|
|
39
|
+
const isBroad = (module) => {
|
|
40
|
+
const { regExp, include, exclude } = module.options;
|
|
41
|
+
|
|
42
|
+
if (include || exclude) return false;
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
Boolean(regExp) &&
|
|
46
|
+
/** @type {RegExp} */ (regExp).source.startsWith(WILDCARD_PREFIX)
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
class BroadContextsPlugin {
|
|
51
|
+
/**
|
|
52
|
+
* Creates an instance of BroadContextsPlugin.
|
|
53
|
+
* @param {PerformanceOptions} options the plugin options
|
|
54
|
+
*/
|
|
55
|
+
constructor(options) {
|
|
56
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
57
|
+
this.hints = options.hints;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
62
|
+
* @param {Compiler} compiler the compiler instance
|
|
63
|
+
* @returns {void}
|
|
64
|
+
*/
|
|
65
|
+
apply(compiler) {
|
|
66
|
+
const hints = this.hints;
|
|
67
|
+
|
|
68
|
+
if (!hints) return;
|
|
69
|
+
|
|
70
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
71
|
+
// `afterSeal` is past the hash, which folds every message into it — a
|
|
72
|
+
// hint reported earlier would change the build's identity.
|
|
73
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
74
|
+
const { moduleGraph, requestShortener } = compilation;
|
|
75
|
+
/** @type {BroadContextDetails[]} */
|
|
76
|
+
const broad = [];
|
|
77
|
+
|
|
78
|
+
for (const module of compilation.modules) {
|
|
79
|
+
if (!(module instanceof ContextModule)) continue;
|
|
80
|
+
if (!isBroad(module)) continue;
|
|
81
|
+
|
|
82
|
+
// One file is reached under several requests — with and without its
|
|
83
|
+
// extension — so the dependencies outnumber what is really matched.
|
|
84
|
+
/** @type {Set<Module>} */
|
|
85
|
+
const matched = new Set();
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @param {Dependency[]} dependencies the dependencies to walk
|
|
89
|
+
* @returns {void}
|
|
90
|
+
*/
|
|
91
|
+
const collect = (dependencies) => {
|
|
92
|
+
for (const dependency of dependencies) {
|
|
93
|
+
const matchedModule = moduleGraph.getModule(dependency);
|
|
94
|
+
|
|
95
|
+
if (matchedModule) matched.add(matchedModule);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
collect(module.dependencies);
|
|
100
|
+
|
|
101
|
+
// A lazy context keeps each match in a block of its own, so reading
|
|
102
|
+
// only `dependencies` would report it as matching nothing.
|
|
103
|
+
for (const block of module.blocks) collect(block.dependencies);
|
|
104
|
+
|
|
105
|
+
if (matched.size < MIN_REPORTED_MODULES) continue;
|
|
106
|
+
|
|
107
|
+
let size = 0;
|
|
108
|
+
|
|
109
|
+
for (const matchedModule of matched) {
|
|
110
|
+
size += getModuleSize(matchedModule);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
broad.push({
|
|
114
|
+
name: module.readableIdentifier(requestShortener),
|
|
115
|
+
modules: matched.size,
|
|
116
|
+
size
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (broad.length === 0) return;
|
|
121
|
+
|
|
122
|
+
// Ties break by name: module order is not stable across runs.
|
|
123
|
+
broad.sort((a, b) => b.size - a.size || compareStrings(a.name, b.name));
|
|
124
|
+
|
|
125
|
+
const warning = new BroadContextsWarning(
|
|
126
|
+
broad.slice(0, MAX_REPORTED_CONTEXTS),
|
|
127
|
+
broad.length
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
if (hints === "error") {
|
|
131
|
+
compilation.errors.push(warning);
|
|
132
|
+
} else if (hints === "stats") {
|
|
133
|
+
compilation.hints.push(warning);
|
|
134
|
+
} else {
|
|
135
|
+
compilation.warnings.push(warning);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
module.exports = BroadContextsPlugin;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Alexander Akait @alexander-akait
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const RuntimeModule = require("../RuntimeModule");
|
|
9
|
+
const CacheEffectivenessWarning = require("../errors/CacheEffectivenessWarning");
|
|
10
|
+
|
|
11
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
12
|
+
/** @import Compiler from "../Compiler" */
|
|
13
|
+
/** @import { BuildInfo } from "../Module" */
|
|
14
|
+
|
|
15
|
+
const PLUGIN_NAME = "CacheEffectivenessPlugin";
|
|
16
|
+
|
|
17
|
+
// A reason shared by many modules is the one worth fixing, so report the
|
|
18
|
+
// frequent ones and count the rest.
|
|
19
|
+
const MAX_REPORTED_REASONS = 3;
|
|
20
|
+
|
|
21
|
+
const UNSPECIFIED_REASON = "reason not stated";
|
|
22
|
+
|
|
23
|
+
class CacheEffectivenessPlugin {
|
|
24
|
+
/**
|
|
25
|
+
* Creates an instance of CacheEffectivenessPlugin.
|
|
26
|
+
* @param {PerformanceOptions} options the plugin options
|
|
27
|
+
*/
|
|
28
|
+
constructor(options) {
|
|
29
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
30
|
+
this.hints = options.hints;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
35
|
+
* @param {Compiler} compiler the compiler instance
|
|
36
|
+
* @returns {void}
|
|
37
|
+
*/
|
|
38
|
+
apply(compiler) {
|
|
39
|
+
const hints = this.hints;
|
|
40
|
+
|
|
41
|
+
if (!hints) return;
|
|
42
|
+
|
|
43
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
44
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
45
|
+
let total = 0;
|
|
46
|
+
let rebuilt = 0;
|
|
47
|
+
let uncacheable = 0;
|
|
48
|
+
/** @type {Map<string, number>} */
|
|
49
|
+
const modulesByReason = new Map();
|
|
50
|
+
|
|
51
|
+
for (const module of compilation.modules) {
|
|
52
|
+
// Runtime modules are generated per compilation, never built and
|
|
53
|
+
// never cached, so counting them makes a cold build look warm.
|
|
54
|
+
if (module instanceof RuntimeModule) continue;
|
|
55
|
+
|
|
56
|
+
total++;
|
|
57
|
+
|
|
58
|
+
if (compilation.builtModules.has(module)) rebuilt++;
|
|
59
|
+
|
|
60
|
+
// Every built module carries one; `cacheable` being `undefined` is
|
|
61
|
+
// the module never reporting either way, not it opting out.
|
|
62
|
+
const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
|
|
63
|
+
|
|
64
|
+
if (buildInfo.cacheable !== false) continue;
|
|
65
|
+
|
|
66
|
+
uncacheable++;
|
|
67
|
+
|
|
68
|
+
const reasons =
|
|
69
|
+
buildInfo.notCacheableReasons &&
|
|
70
|
+
buildInfo.notCacheableReasons.length > 0
|
|
71
|
+
? buildInfo.notCacheableReasons
|
|
72
|
+
: [UNSPECIFIED_REASON];
|
|
73
|
+
|
|
74
|
+
for (const reason of reasons) {
|
|
75
|
+
modulesByReason.set(reason, (modulesByReason.get(reason) || 0) + 1);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Work redone despite a warm cache needs both ends: everything rebuilt
|
|
80
|
+
// is a cold build, nothing rebuilt is the cache working.
|
|
81
|
+
const warmRebuild = rebuilt > 0 && rebuilt < total;
|
|
82
|
+
|
|
83
|
+
if (!warmRebuild && uncacheable === 0) return;
|
|
84
|
+
|
|
85
|
+
// Most frequent first, and by reason where two are as frequent: the
|
|
86
|
+
// map is keyed in the order the modules were walked, which is not the
|
|
87
|
+
// same twice, and only three reasons are reported — so an unbroken tie
|
|
88
|
+
// would vary which of them a build names at all.
|
|
89
|
+
const sorted = [...modulesByReason].sort(
|
|
90
|
+
(a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)
|
|
91
|
+
);
|
|
92
|
+
const reasons = sorted
|
|
93
|
+
.slice(0, MAX_REPORTED_REASONS)
|
|
94
|
+
.map(
|
|
95
|
+
([reason, modules]) =>
|
|
96
|
+
`${reason} (${modules} ${modules === 1 ? "module" : "modules"})`
|
|
97
|
+
);
|
|
98
|
+
const remaining = sorted.length - reasons.length;
|
|
99
|
+
|
|
100
|
+
if (remaining > 0) {
|
|
101
|
+
reasons.push(
|
|
102
|
+
`and ${remaining} other ${remaining === 1 ? "reason" : "reasons"}`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const warning = new CacheEffectivenessWarning({
|
|
107
|
+
total,
|
|
108
|
+
rebuilt,
|
|
109
|
+
uncacheable,
|
|
110
|
+
reasons
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
if (hints === "error") {
|
|
114
|
+
compilation.errors.push(warning);
|
|
115
|
+
} else if (hints === "stats") {
|
|
116
|
+
compilation.hints.push(warning);
|
|
117
|
+
} else {
|
|
118
|
+
compilation.warnings.push(warning);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
module.exports = CacheEffectivenessPlugin;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Alexander Akait @alexander-akait
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
const ConflictingResourceHintsWarning = require("../errors/ConflictingResourceHintsWarning");
|
|
9
|
+
const { compareStrings } = require("../util/comparators");
|
|
10
|
+
|
|
11
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
12
|
+
/** @import ChunkGroup from "../ChunkGroup" */
|
|
13
|
+
/** @import Compiler from "../Compiler" */
|
|
14
|
+
/**
|
|
15
|
+
* @import {
|
|
16
|
+
* ConflictingResourceHintDetails
|
|
17
|
+
* } from "../errors/ConflictingResourceHintsWarning"
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const PLUGIN_NAME = "ConflictingResourceHintsPlugin";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Names a chunk group for a message, falling back to its chunks: an `import()`
|
|
24
|
+
* without `webpackChunkName` produces a group with no name of its own.
|
|
25
|
+
* @param {ChunkGroup} chunkGroup a chunk group
|
|
26
|
+
* @returns {string} a name for it
|
|
27
|
+
*/
|
|
28
|
+
const getChunkGroupName = (chunkGroup) =>
|
|
29
|
+
chunkGroup.name ||
|
|
30
|
+
chunkGroup.chunks.map((chunk) => chunk.name || `${chunk.id}`).join(", ");
|
|
31
|
+
|
|
32
|
+
class ConflictingResourceHintsPlugin {
|
|
33
|
+
/**
|
|
34
|
+
* Creates an instance of ConflictingResourceHintsPlugin.
|
|
35
|
+
* @param {PerformanceOptions} options the plugin options
|
|
36
|
+
*/
|
|
37
|
+
constructor(options) {
|
|
38
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
39
|
+
this.hints = options.hints;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
44
|
+
* @param {Compiler} compiler the compiler instance
|
|
45
|
+
* @returns {void}
|
|
46
|
+
*/
|
|
47
|
+
apply(compiler) {
|
|
48
|
+
const hints = this.hints;
|
|
49
|
+
|
|
50
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
51
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
52
|
+
const { chunkGraph, moduleGraph } = compilation;
|
|
53
|
+
/** @type {ConflictingResourceHintDetails[]} */
|
|
54
|
+
const links = [];
|
|
55
|
+
|
|
56
|
+
for (const chunkGroup of compilation.chunkGroups) {
|
|
57
|
+
const children = chunkGroup.getChildrenByOrders(
|
|
58
|
+
moduleGraph,
|
|
59
|
+
chunkGraph
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
if (!children.prefetch || !children.preload) continue;
|
|
63
|
+
|
|
64
|
+
const preloaded = new Set(children.preload);
|
|
65
|
+
|
|
66
|
+
for (const child of children.prefetch) {
|
|
67
|
+
if (!preloaded.has(child)) continue;
|
|
68
|
+
|
|
69
|
+
links.push({
|
|
70
|
+
parent: getChunkGroupName(chunkGroup),
|
|
71
|
+
child: getChunkGroupName(child)
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (links.length === 0) return;
|
|
77
|
+
|
|
78
|
+
// Chunk group iteration order is not stable across runs.
|
|
79
|
+
links.sort(
|
|
80
|
+
(a, b) =>
|
|
81
|
+
compareStrings(a.parent, b.parent) ||
|
|
82
|
+
compareStrings(a.child, b.child)
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const warning = new ConflictingResourceHintsWarning(links);
|
|
86
|
+
|
|
87
|
+
if (hints === "error") {
|
|
88
|
+
compilation.errors.push(warning);
|
|
89
|
+
} else if (hints === "stats") {
|
|
90
|
+
compilation.hints.push(warning);
|
|
91
|
+
} else {
|
|
92
|
+
compilation.warnings.push(warning);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
module.exports = ConflictingResourceHintsPlugin;
|