@depup/webpack 5.110.3-depup.0 → 5.111.1-depup.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -8
- package/changes.json +7 -11
- package/lib/APIPlugin.js +26 -11
- package/lib/AutomaticPrefetchPlugin.js +1 -1
- package/lib/Cache.js +8 -3
- package/lib/CacheFacade.js +1 -1
- package/lib/CircularModulesPlugin.js +157 -55
- package/lib/CleanPlugin.js +2 -2
- package/lib/CompatibilityPlugin.js +3 -4
- package/lib/Compilation.js +336 -337
- package/lib/Compiler.js +213 -51
- package/lib/ConstPlugin.js +16 -132
- package/lib/CopyPlugin.js +1054 -0
- package/lib/DefinePlugin.js +24 -8
- package/lib/DependencyTemplate.js +2 -1
- package/lib/DotenvPlugin.js +24 -28
- package/lib/ErrorHelpers.js +113 -0
- package/lib/ExportsInfo.js +20 -16
- package/lib/ExternalModule.js +47 -22
- package/lib/FileSystemInfo.js +17 -14
- package/lib/FlagDependencyExportsPlugin.js +53 -34
- package/lib/FlagDependencyUsagePlugin.js +9 -13
- package/lib/Generator.js +24 -2
- package/lib/HotModuleReplacementPlugin.js +55 -7
- package/lib/IgnorePlugin.js +1 -1
- package/lib/JavascriptMetaInfoPlugin.js +5 -3
- package/lib/LoaderOptionsPlugin.js +1 -1
- package/lib/MainTemplate.js +5 -1
- package/lib/Module.js +19 -10
- package/lib/ModuleGraph.js +6 -9
- package/lib/MultiCompiler.js +7 -17
- package/lib/MultiWatching.js +1 -1
- package/lib/NormalModule.js +135 -50
- package/lib/NormalModuleFactory.js +1 -1
- package/lib/RuntimeGlobals.js +21 -7
- package/lib/RuntimeModule.js +28 -12
- package/lib/RuntimePlugin.js +30 -3
- package/lib/RuntimeTemplate.js +813 -518
- package/lib/SourceMapDevToolPlugin.js +54 -104
- package/lib/TemplatedPathPlugin.js +16 -59
- package/lib/Watching.js +9 -0
- package/lib/WebpackOptionsApply.js +84 -91
- package/lib/asset/AssetBytesGenerator.js +7 -1
- package/lib/asset/AssetGenerator.js +50 -24
- package/lib/asset/AssetModule.js +3 -0
- package/lib/asset/AssetSourceGenerator.js +7 -1
- package/lib/asset/WebManifestParser.js +7 -5
- package/lib/buildChunkGraph.js +11 -15
- package/lib/cache/AddBuildDependenciesPlugin.js +33 -4
- package/lib/cache/IdleFileCachePlugin.js +2 -2
- package/lib/cache/MemoryCachePlugin.js +4 -4
- package/lib/cache/MemoryWithGcCachePlugin.js +7 -8
- package/lib/cache/PackFileCacheStrategy.js +17 -19
- package/lib/cache/getLazyHashedEtag.js +3 -5
- package/lib/config/browserslistTargetHandler.js +17 -4
- package/lib/config/defaults.js +138 -128
- package/lib/config/getClaimedAssetTypes.js +10 -11
- package/lib/config/normalization.js +82 -12
- package/lib/config/target.js +13 -4
- package/lib/container/ContainerReferencePlugin.js +6 -0
- package/lib/container/RemoteRuntimeModule.js +9 -0
- package/lib/container/declaredRemotes.js +39 -0
- package/lib/{ContextExclusionPlugin.js → context/ContextExclusionPlugin.js} +1 -1
- package/lib/{ContextModule.js → context/ContextModule.js} +54 -115
- package/lib/{ContextModuleFactory.js → context/ContextModuleFactory.js} +19 -21
- package/lib/{ContextReplacementPlugin.js → context/ContextReplacementPlugin.js} +4 -4
- package/lib/css/CssGenerator.js +27 -11
- package/lib/css/CssInjectStyleRuntimeModule.js +9 -0
- package/lib/css/CssLoadingRuntimeModule.js +94 -36
- package/lib/css/CssModule.js +1 -1
- package/lib/css/CssModulesPlugin.js +7 -6
- package/lib/css/CssParser.js +162 -31
- package/lib/css/CssServerStylesRuntimeModule.js +9 -0
- package/lib/css/cssMinify.js +43 -32
- package/lib/css/data.js +3514 -869
- package/lib/css/syntax.js +6370 -1220
- package/lib/debug/ProfilingPlugin.js +7 -4
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -3
- package/lib/dependencies/AMDRuntimeModules.js +18 -0
- package/lib/dependencies/CommonJsExportRequireDependency.js +13 -12
- package/lib/dependencies/CommonJsExportsParserPlugin.js +12 -13
- package/lib/dependencies/CommonJsImportsParserPlugin.js +5 -5
- package/lib/dependencies/CommonJsPlugin.js +19 -3
- package/lib/dependencies/CommonJsRequireDependency.js +14 -5
- package/lib/dependencies/CommonJsSelfReferenceDependency.js +2 -4
- package/lib/dependencies/ContextDependency.js +1 -1
- package/lib/dependencies/ContextDependencyHelpers.js +3 -9
- package/lib/dependencies/ContextElementDependency.js +1 -1
- package/lib/dependencies/CssIcssExportDependency.js +13 -9
- package/lib/dependencies/CssIcssImportDependency.js +3 -6
- package/lib/dependencies/CssUrlDependency.js +3 -5
- package/lib/dependencies/HarmonyCompatibilityDependency.js +67 -22
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +3 -4
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +10 -7
- package/lib/dependencies/HarmonyExportExpressionDependency.js +47 -33
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +74 -17
- package/lib/dependencies/HarmonyExportInitFragment.js +110 -23
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +25 -58
- package/lib/dependencies/HarmonyImportBareSideEffectDependency.js +59 -0
- package/lib/dependencies/HarmonyImportDependency.js +6 -1
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +111 -17
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +3 -4
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +40 -3
- package/lib/dependencies/HarmonyModulesPlugin.js +20 -0
- package/lib/dependencies/HtmlEntryDependency.js +124 -102
- package/lib/dependencies/HtmlInlineScriptDependency.js +3 -4
- package/lib/dependencies/HtmlInlineStyleDependency.js +3 -4
- package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +1 -1
- package/lib/dependencies/ImportMetaGlobHelpers.js +1 -1
- package/lib/dependencies/ImportMetaMainDependency.js +104 -0
- package/lib/dependencies/ImportMetaPlugin.js +67 -25
- package/lib/dependencies/ImportParserPlugin.js +1 -1
- package/lib/dependencies/LoaderPlugin.js +26 -1
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
- package/lib/dependencies/SystemRuntimeModule.js +9 -0
- package/lib/dependencies/URLContextDependency.js +1 -1
- package/lib/dependencies/URLDependency.js +6 -5
- package/lib/dependencies/WorkerAndWorkletPlugin.js +15 -21
- package/lib/dependencies/WorkerDependency.js +7 -7
- package/lib/dependencies/WorkletDependency.js +7 -11
- package/lib/dll/DelegatedModule.js +18 -1
- package/lib/dll/DllReferencePlugin.js +11 -8
- package/lib/dll/LibManifestPlugin.js +1 -1
- package/lib/errors/AnalyzableBailoutsWarning.js +41 -0
- package/lib/errors/DuplicateModulesWarning.js +12 -7
- package/lib/errors/EmptyCopyPatternWarning.js +26 -0
- package/lib/errors/ExternalStarReexportError.js +44 -0
- package/lib/errors/HookWebpackError.js +3 -2
- package/lib/errors/MissingSourceMapsWarning.js +36 -0
- package/lib/errors/ModuleParseError.js +2 -1
- package/lib/errors/UnusedAssetsWarning.js +36 -0
- package/lib/errors/UnusedFederationWarning.js +35 -0
- package/lib/errors/UnusedModulesWarning.js +38 -0
- package/lib/esm/ExportWebpackRequireRuntimeModule.js +9 -0
- package/lib/esm/ModuleChunkFormatPlugin.js +28 -3
- package/lib/esm/ModuleChunkLoadingPlugin.js +30 -11
- package/lib/esm/ModuleChunkLoadingRuntimeModule.js +92 -60
- package/lib/hmr/HotModuleReplacement.runtime.js +8 -2
- package/lib/hmr/HotModuleReplacementRuntimeModule.js +9 -0
- package/lib/hmr/LazyCompilationPlugin.js +3 -5
- package/lib/html/HtmlGenerator.js +72 -87
- package/lib/html/HtmlModulesPlugin.js +418 -200
- package/lib/html/HtmlParser.js +110 -147
- package/lib/html/builtinEmbeddedRenderer.js +107 -0
- package/lib/html/data.js +142 -7
- package/lib/html/htmlMinify.js +92 -122
- package/lib/html/syntax.js +1618 -1391
- package/lib/ids/HashedModuleIdsPlugin.js +2 -1
- package/lib/index.js +49 -3
- package/lib/javascript/ChunkFormatHelpers.js +4 -3
- package/lib/javascript/JavascriptGenerator.js +8 -1
- package/lib/javascript/JavascriptModule.js +1 -0
- package/lib/javascript/JavascriptModulesPlugin.js +73 -72
- package/lib/javascript/JavascriptParser.js +1970 -900
- package/lib/javascript/StartupHelpers.js +27 -3
- package/lib/javascript/data.js +172 -0
- package/lib/javascript/grammar.js +5546 -0
- package/lib/javascript/parser.js +1500 -0
- package/lib/javascript/regexp.js +1762 -0
- package/lib/javascript/regexpData.js +51 -0
- package/lib/javascript/syntax.js +9061 -5262
- package/lib/json/JsonGenerator.js +7 -1
- package/lib/library/ModuleLibraryPlugin.js +171 -132
- package/lib/loaders/LoaderRunner.js +137 -9
- package/lib/node/NodeWatchFileSystem.js +3 -9
- package/lib/node/ReadFileChunkLoadingRuntimeModule.js +22 -0
- package/lib/node/RequireChunkLoadingRuntimeModule.js +22 -0
- package/lib/optimize/AggressiveMergingPlugin.js +3 -5
- package/lib/optimize/ConcatenatedModule.js +178 -120
- package/lib/optimize/ConstExportsPlugin.js +50 -39
- package/lib/optimize/FlagIncludedChunksPlugin.js +3 -11
- package/lib/optimize/InlineExports.js +20 -123
- package/lib/optimize/InnerGraphPlugin.js +7 -13
- package/lib/optimize/LimitChunkCountPlugin.js +5 -8
- package/lib/optimize/MangleExportsPlugin.js +13 -4
- package/lib/optimize/ModuleConcatenationPlugin.js +27 -5
- package/lib/optimize/RealContentHashPlugin.js +68 -9
- package/lib/optimize/SideEffectsFlagPlugin.js +24 -28
- package/lib/optimize/SplitChunksPlugin.js +2 -4
- package/lib/performance/AnalyzableBailoutsPlugin.js +115 -0
- package/lib/performance/BroadContextsPlugin.js +1 -1
- package/lib/performance/CacheEffectivenessPlugin.js +7 -7
- package/lib/performance/DuplicateModulesPlugin.js +57 -13
- package/lib/performance/EvalUsagePlugin.js +5 -2
- package/lib/performance/MissingSourceMapsPlugin.js +115 -0
- package/lib/performance/PureAnnotationsPlugin.js +6 -3
- package/lib/performance/SizeLimitsPlugin.js +2 -4
- package/lib/performance/TopLevelThisPlugin.js +5 -4
- package/lib/performance/UnusedAssetsPlugin.js +109 -0
- package/lib/performance/UnusedFederationPlugin.js +147 -0
- package/lib/performance/UnusedModulesPlugin.js +141 -0
- package/lib/performance/UnusedReexportsPlugin.js +1 -55
- package/lib/performance/isOnlyReexported.js +65 -0
- package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +25 -5
- package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +8 -8
- package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +9 -0
- package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +9 -0
- package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +9 -0
- package/lib/prefetch/ResourceHintPlugin.js +18 -23
- package/lib/prefetch/ResourceHintRuntimeModule.js +9 -0
- package/lib/prefetch/StartupAssetHintRuntimeModule.js +16 -10
- package/lib/rules/RuleSetCompiler.js +211 -4
- package/lib/runtime/AsyncModuleRuntimeModule.js +98 -66
- package/lib/runtime/AutoPublicPathRuntimeModule.js +9 -0
- package/lib/runtime/BaseUriRuntimeModule.js +9 -0
- package/lib/runtime/ChunkNameRuntimeModule.js +9 -0
- package/lib/runtime/EnsureChunkRuntimeModule.js +35 -16
- package/lib/runtime/GetChunkFilenameRuntimeModule.js +12 -4
- package/lib/runtime/GetFullHashRuntimeModule.js +9 -0
- package/lib/runtime/GetMainFilenameRuntimeModule.js +9 -0
- package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +9 -0
- package/lib/runtime/GlobalRuntimeModule.js +11 -4
- package/lib/runtime/HasOwnPropertyRuntimeModule.js +9 -0
- package/lib/runtime/HelperRuntimeModule.js +10 -0
- package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +305 -224
- package/lib/runtime/NonceRuntimeModule.js +9 -0
- package/lib/runtime/OnChunksLoadedRuntimeModule.js +67 -20
- package/lib/runtime/PublicPathRuntimeModule.js +9 -0
- package/lib/runtime/RuntimeIdRuntimeModule.js +9 -0
- package/lib/runtime/SpecNamespaceObjectRuntimeModule.js +90 -0
- package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +9 -0
- package/lib/runtime/StartupEntrypointRuntimeModule.js +9 -0
- package/lib/runtime/SystemContextRuntimeModule.js +9 -0
- package/lib/runtime/ToBinaryRuntimeModule.js +9 -0
- package/lib/schemes/DataUriPlugin.js +3 -6
- package/lib/schemes/VirtualUrlPlugin.js +1 -1
- package/lib/serialization/BinaryMiddleware.js +9 -9
- package/lib/serialization/FileMiddleware.js +16 -16
- package/lib/serialization/ObjectMiddleware.js +168 -139
- package/lib/sharing/ConsumeSharedPlugin.js +12 -0
- package/lib/sharing/ConsumeSharedRuntimeModule.js +11 -0
- package/lib/sharing/ShareRuntimeModule.js +9 -0
- package/lib/sharing/declaredShared.js +47 -0
- package/lib/stats/DefaultStatsFactoryPlugin.js +6 -5
- package/lib/stats/DefaultStatsPrinterPlugin.js +3 -0
- package/lib/typescript/TypeScriptPlugin.js +2 -3
- package/lib/url/URLParserPlugin.js +6 -8
- package/lib/util/LocConverter.js +4 -7
- package/lib/util/SourceProcessor.js +91 -91
- package/lib/util/async.js +292 -0
- package/lib/util/buildDiagnostics.js +69 -0
- package/lib/util/chainedImports.js +3 -4
- package/lib/util/concatenate.js +4 -4
- package/lib/util/createHooksRegistry.js +1 -2
- package/lib/util/dataURL.js +2 -3
- package/lib/util/deterministicGrouping.js +8 -13
- package/lib/util/findGraphRoots.js +6 -13
- package/lib/util/fs.js +27 -1
- package/lib/util/globUtils.js +1 -1
- package/lib/util/handlerKeys.js +40 -0
- package/lib/util/hash/wasm-hash.js +3 -4
- package/lib/util/identifier.js +20 -0
- package/lib/util/internalSerializables.js +5 -1
- package/lib/util/registerExternalSerializer.js +6 -45
- package/lib/util/semver.js +5 -3
- package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +9 -0
- package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +9 -0
- package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -1
- package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +5 -1
- package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +12 -4
- package/lib/wasm-sync/WebAssemblyGenerator.js +6 -1
- package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -1
- package/lib/wasm-sync/WebAssemblyUtils.js +2 -4
- package/lib/web/JsonpChunkLoadingRuntimeModule.js +36 -0
- package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +19 -0
- package/package.json +55 -46
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +379 -66
- package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
- package/schemas/plugins/ManifestPlugin.check.js +1 -1
- package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
- package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
- package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
- package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
- package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
- package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
- package/schemas/plugins/dll/DllReferencePlugin.check.js +1 -1
- package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +1 -1
- package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
- package/types.d.ts +1723 -604
- package/lib/dependencies/ExportBindingInitFragment.js +0 -191
- package/lib/errors/EntrypointOverlapWarning.js +0 -45
- package/lib/performance/EntrypointOverlapPlugin.js +0 -122
|
@@ -0,0 +1,109 @@
|
|
|
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 { ASSET_TYPE } = require("../ModuleSourceTypeConstants");
|
|
9
|
+
const HarmonyImportBareSideEffectDependency = require("../dependencies/HarmonyImportBareSideEffectDependency");
|
|
10
|
+
const HarmonyImportSideEffectDependency = require("../dependencies/HarmonyImportSideEffectDependency");
|
|
11
|
+
const UnusedAssetsWarning = require("../errors/UnusedAssetsWarning");
|
|
12
|
+
const { compareStrings } = require("../util/comparators");
|
|
13
|
+
const getModuleSize = require("./getModuleSize");
|
|
14
|
+
|
|
15
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
16
|
+
/** @import Compiler from "../Compiler" */
|
|
17
|
+
/** @import { UnusedAssetDetails } from "../errors/UnusedAssetsWarning" */
|
|
18
|
+
|
|
19
|
+
const PLUGIN_NAME = "UnusedAssetsPlugin";
|
|
20
|
+
|
|
21
|
+
// Enough to name the offenders without listing every asset in the build.
|
|
22
|
+
const MAX_REPORTED_ASSETS = 5;
|
|
23
|
+
|
|
24
|
+
class UnusedAssetsPlugin {
|
|
25
|
+
/**
|
|
26
|
+
* Creates an instance of UnusedAssetsPlugin.
|
|
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 { moduleGraph, requestShortener } = compilation;
|
|
49
|
+
/** @type {UnusedAssetDetails[]} */
|
|
50
|
+
const found = [];
|
|
51
|
+
let total = 0;
|
|
52
|
+
|
|
53
|
+
for (const module of compilation.modules) {
|
|
54
|
+
// An inlined one carries no asset type: it is a data url in the
|
|
55
|
+
// importer, whose bytes `inlinedAssets` is the check for.
|
|
56
|
+
if (!module.getSourceTypes().has(ASSET_TYPE)) continue;
|
|
57
|
+
|
|
58
|
+
let onlyUnread = false;
|
|
59
|
+
|
|
60
|
+
for (const connection of moduleGraph.getIncomingConnections(module)) {
|
|
61
|
+
const dependency = connection.dependency;
|
|
62
|
+
|
|
63
|
+
// Anything else — a `url()`, a `new URL()`, an html `src` — reads
|
|
64
|
+
// the file, and a bare import asks for it on purpose.
|
|
65
|
+
if (
|
|
66
|
+
!(dependency instanceof HarmonyImportSideEffectDependency) ||
|
|
67
|
+
dependency instanceof HarmonyImportBareSideEffectDependency
|
|
68
|
+
) {
|
|
69
|
+
onlyUnread = false;
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
onlyUnread = true;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!onlyUnread) continue;
|
|
77
|
+
|
|
78
|
+
const size = Math.round(getModuleSize(module));
|
|
79
|
+
|
|
80
|
+
total += size;
|
|
81
|
+
found.push({
|
|
82
|
+
name: module.readableIdentifier(requestShortener),
|
|
83
|
+
size
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (found.length === 0) return;
|
|
88
|
+
|
|
89
|
+
// Largest first; ties break by name, module order is not stable.
|
|
90
|
+
found.sort((a, b) => b.size - a.size || compareStrings(a.name, b.name));
|
|
91
|
+
|
|
92
|
+
const warning = new UnusedAssetsWarning(
|
|
93
|
+
found.slice(0, MAX_REPORTED_ASSETS),
|
|
94
|
+
total
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
if (hints === "error") {
|
|
98
|
+
compilation.errors.push(warning);
|
|
99
|
+
} else if (hints === "stats") {
|
|
100
|
+
compilation.hints.push(warning);
|
|
101
|
+
} else {
|
|
102
|
+
compilation.warnings.push(warning);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
module.exports = UnusedAssetsPlugin;
|
|
@@ -0,0 +1,147 @@
|
|
|
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 RemoteModule = require("../container/RemoteModule");
|
|
9
|
+
const { getDeclaredRemotes } = require("../container/declaredRemotes");
|
|
10
|
+
const UnusedFederationWarning = require("../errors/UnusedFederationWarning");
|
|
11
|
+
const ConsumeSharedModule = require("../sharing/ConsumeSharedModule");
|
|
12
|
+
const { getDeclaredShared } = require("../sharing/declaredShared");
|
|
13
|
+
const { compareStrings } = require("../util/comparators");
|
|
14
|
+
|
|
15
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
16
|
+
/** @import Compiler from "../Compiler" */
|
|
17
|
+
/** @import { UnusedFederationDetails } from "../errors/UnusedFederationWarning" */
|
|
18
|
+
|
|
19
|
+
const PLUGIN_NAME = "UnusedFederationPlugin";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param {Set<string>} used the share keys modules were created for
|
|
23
|
+
* @param {string} shareKey the declared share key
|
|
24
|
+
* @returns {boolean} whether anything under the share key was used
|
|
25
|
+
*/
|
|
26
|
+
const someUsedStartsWith = (used, shareKey) => {
|
|
27
|
+
for (const usedKey of used) {
|
|
28
|
+
if (usedKey.startsWith(shareKey)) return true;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return false;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Applies the rule `ContainerReferencePlugin` factorizes by, so that a remote
|
|
36
|
+
* name holding slashes is told apart from an exposed path holding them too.
|
|
37
|
+
* @param {string} request the request a remote module was created for
|
|
38
|
+
* @param {string} name the declared remote name
|
|
39
|
+
* @returns {boolean} whether the request names this remote
|
|
40
|
+
*/
|
|
41
|
+
const isRequestFor = (request, name) =>
|
|
42
|
+
request.startsWith(name) &&
|
|
43
|
+
(request.length === name.length || request[name.length] === "/");
|
|
44
|
+
|
|
45
|
+
class UnusedFederationPlugin {
|
|
46
|
+
/**
|
|
47
|
+
* Creates an instance of UnusedFederationPlugin.
|
|
48
|
+
* @param {PerformanceOptions} options the plugin options
|
|
49
|
+
*/
|
|
50
|
+
constructor(options) {
|
|
51
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
52
|
+
this.hints = options.hints;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
57
|
+
* @param {Compiler} compiler the compiler instance
|
|
58
|
+
* @returns {void}
|
|
59
|
+
*/
|
|
60
|
+
apply(compiler) {
|
|
61
|
+
const hints = this.hints;
|
|
62
|
+
|
|
63
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
64
|
+
// Reported past the hash, which folds every message into it, so a hint
|
|
65
|
+
// pushed earlier would change the build's identity.
|
|
66
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
67
|
+
const declaredShared = getDeclaredShared(compilation);
|
|
68
|
+
const declaredRemotes = getDeclaredRemotes(compilation);
|
|
69
|
+
|
|
70
|
+
if (declaredShared === undefined && declaredRemotes === undefined) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Nothing was factorized, so no shared or remote module could exist.
|
|
75
|
+
if (compilation.modules.size === 0) return;
|
|
76
|
+
|
|
77
|
+
/** @type {Set<string>} */
|
|
78
|
+
const usedShared = new Set();
|
|
79
|
+
/** @type {Set<string>} */
|
|
80
|
+
const remoteRequests = new Set();
|
|
81
|
+
|
|
82
|
+
for (const module of compilation.modules) {
|
|
83
|
+
if (module instanceof ConsumeSharedModule) {
|
|
84
|
+
usedShared.add(module.options.shareKey);
|
|
85
|
+
} else if (module instanceof RemoteModule) {
|
|
86
|
+
remoteRequests.add(module.request);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** @type {UnusedFederationDetails[]} */
|
|
91
|
+
const unused = [];
|
|
92
|
+
|
|
93
|
+
if (declaredShared !== undefined) {
|
|
94
|
+
// Matched on the share key, since that is what the module carries,
|
|
95
|
+
// but reported by the config key, which is what the config spells.
|
|
96
|
+
for (const { name, shareKey, prefix } of declaredShared) {
|
|
97
|
+
const used = prefix
|
|
98
|
+
? someUsedStartsWith(usedShared, shareKey)
|
|
99
|
+
: usedShared.has(shareKey);
|
|
100
|
+
|
|
101
|
+
if (!used) unused.push({ name, kind: "shared" });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (declaredRemotes !== undefined) {
|
|
106
|
+
/** @type {Set<string>} */
|
|
107
|
+
const usedRemotes = new Set();
|
|
108
|
+
|
|
109
|
+
// Declaration order is precedence: `factorize` takes the first
|
|
110
|
+
// name a request matches, so a later one it also matches is dead.
|
|
111
|
+
for (const request of remoteRequests) {
|
|
112
|
+
for (const name of declaredRemotes) {
|
|
113
|
+
if (isRequestFor(request, name)) {
|
|
114
|
+
usedRemotes.add(name);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
for (const name of declaredRemotes) {
|
|
121
|
+
if (!usedRemotes.has(name)) unused.push({ name, kind: "remote" });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (unused.length === 0) return;
|
|
126
|
+
|
|
127
|
+
// Ties break by name: declaration order is not worth preserving here.
|
|
128
|
+
unused.sort(
|
|
129
|
+
(a, b) =>
|
|
130
|
+
compareStrings(a.kind, b.kind) || compareStrings(a.name, b.name)
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
const warning = new UnusedFederationWarning(unused);
|
|
134
|
+
|
|
135
|
+
if (hints === "error") {
|
|
136
|
+
compilation.errors.push(warning);
|
|
137
|
+
} else if (hints === "stats") {
|
|
138
|
+
compilation.hints.push(warning);
|
|
139
|
+
} else {
|
|
140
|
+
compilation.warnings.push(warning);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
module.exports = UnusedFederationPlugin;
|
|
@@ -0,0 +1,141 @@
|
|
|
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 HarmonyImportBareSideEffectDependency = require("../dependencies/HarmonyImportBareSideEffectDependency");
|
|
9
|
+
const UnusedModulesWarning = require("../errors/UnusedModulesWarning");
|
|
10
|
+
const { compareStrings } = require("../util/comparators");
|
|
11
|
+
const getModuleSize = require("./getModuleSize");
|
|
12
|
+
const hasOnlyUnusedExports = require("./hasOnlyUnusedExports");
|
|
13
|
+
const isOnlyReexported = require("./isOnlyReexported");
|
|
14
|
+
|
|
15
|
+
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
16
|
+
/** @import Compiler from "../Compiler" */
|
|
17
|
+
/** @import Module, { BuildInfo } from "../Module" */
|
|
18
|
+
/** @import ModuleGraph from "../ModuleGraph" */
|
|
19
|
+
/** @import { UnusedModuleDetails } from "../errors/UnusedModulesWarning" */
|
|
20
|
+
|
|
21
|
+
const PLUGIN_NAME = "UnusedModulesPlugin";
|
|
22
|
+
|
|
23
|
+
// Enough to name the offenders without listing every module kept this way.
|
|
24
|
+
const MAX_REPORTED_MODULES = 5;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Whether some importer bound a name from this module. A bare `import "..."`
|
|
28
|
+
* binds nothing, so it can only have been written for what importing does —
|
|
29
|
+
* that is deliberate, and not what this hint is about.
|
|
30
|
+
* @param {Module} module the module to look up
|
|
31
|
+
* @param {ModuleGraph} moduleGraph the module graph
|
|
32
|
+
* @returns {boolean} true when every importer bound something
|
|
33
|
+
*/
|
|
34
|
+
const everyImportBinds = (module, moduleGraph) => {
|
|
35
|
+
for (const connection of moduleGraph.getIncomingConnections(module)) {
|
|
36
|
+
if (
|
|
37
|
+
connection.dependency instanceof HarmonyImportBareSideEffectDependency
|
|
38
|
+
) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return true;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
class UnusedModulesPlugin {
|
|
47
|
+
/**
|
|
48
|
+
* Creates an instance of UnusedModulesPlugin.
|
|
49
|
+
* @param {PerformanceOptions} options the plugin options
|
|
50
|
+
*/
|
|
51
|
+
constructor(options) {
|
|
52
|
+
/** @type {PerformanceOptions["hints"]} */
|
|
53
|
+
this.hints = options.hints;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Applies the plugin by registering its hooks on the compiler.
|
|
58
|
+
* @param {Compiler} compiler the compiler instance
|
|
59
|
+
* @returns {void}
|
|
60
|
+
*/
|
|
61
|
+
apply(compiler) {
|
|
62
|
+
const hints = this.hints;
|
|
63
|
+
|
|
64
|
+
if (!hints) return;
|
|
65
|
+
|
|
66
|
+
compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
|
|
67
|
+
/** @type {UnusedModulesWarning | undefined} */
|
|
68
|
+
let warning;
|
|
69
|
+
|
|
70
|
+
// Usage is final here, and concatenation has not merged the modules
|
|
71
|
+
// away yet, so each one can still be measured and attributed.
|
|
72
|
+
compilation.hooks.optimizeModules.tap(PLUGIN_NAME, (modules) => {
|
|
73
|
+
const { chunkGraph, moduleGraph, requestShortener } = compilation;
|
|
74
|
+
/** @type {UnusedModuleDetails[]} */
|
|
75
|
+
const found = [];
|
|
76
|
+
let size = 0;
|
|
77
|
+
|
|
78
|
+
for (const module of modules) {
|
|
79
|
+
// One webpack already left out costs nothing — and with no chunk it
|
|
80
|
+
// has no runtime, which is all `hasOnlyUnusedExports` reads usage in.
|
|
81
|
+
if (chunkGraph.getNumberOfModuleChunks(module) === 0) continue;
|
|
82
|
+
if (!hasOnlyUnusedExports(module, moduleGraph, chunkGraph)) continue;
|
|
83
|
+
|
|
84
|
+
// A barrel's leftover is the same finding with a different cause,
|
|
85
|
+
// and `UnusedReexportsPlugin` states it with the re-export named.
|
|
86
|
+
if (isOnlyReexported(module, moduleGraph)) continue;
|
|
87
|
+
|
|
88
|
+
if (!everyImportBinds(module, moduleGraph)) continue;
|
|
89
|
+
|
|
90
|
+
// Recorded while parsing, so a module restored from the cache still has it.
|
|
91
|
+
// Absent means the module is kept for a reason this hint cannot name.
|
|
92
|
+
const diagnostics =
|
|
93
|
+
/** @type {BuildInfo} */
|
|
94
|
+
(module.buildInfo).diagnostics;
|
|
95
|
+
const statement =
|
|
96
|
+
diagnostics === undefined
|
|
97
|
+
? undefined
|
|
98
|
+
: diagnostics.sideEffectStatement;
|
|
99
|
+
|
|
100
|
+
if (statement === undefined) continue;
|
|
101
|
+
|
|
102
|
+
const bytes = Math.round(getModuleSize(module));
|
|
103
|
+
|
|
104
|
+
size += bytes;
|
|
105
|
+
found.push({
|
|
106
|
+
name: module.readableIdentifier(requestShortener),
|
|
107
|
+
size: bytes,
|
|
108
|
+
statement
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (found.length === 0) return;
|
|
113
|
+
|
|
114
|
+
// Largest first; ties break by name, module order is not stable.
|
|
115
|
+
found.sort((a, b) => b.size - a.size || compareStrings(a.name, b.name));
|
|
116
|
+
|
|
117
|
+
warning = new UnusedModulesWarning(
|
|
118
|
+
found.slice(0, MAX_REPORTED_MODULES),
|
|
119
|
+
found.length,
|
|
120
|
+
size
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Reported past the hash: `createHash` folds every message into it, so
|
|
125
|
+
// a hint pushed earlier would change the build's identity.
|
|
126
|
+
compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
|
|
127
|
+
if (warning === undefined) return;
|
|
128
|
+
|
|
129
|
+
if (hints === "error") {
|
|
130
|
+
compilation.errors.push(warning);
|
|
131
|
+
} else if (hints === "stats") {
|
|
132
|
+
compilation.hints.push(warning);
|
|
133
|
+
} else {
|
|
134
|
+
compilation.warnings.push(warning);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
module.exports = UnusedModulesPlugin;
|
|
@@ -5,17 +5,14 @@
|
|
|
5
5
|
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
const HarmonyExportImportedSpecifierDependency = require("../dependencies/HarmonyExportImportedSpecifierDependency");
|
|
9
|
-
const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency");
|
|
10
8
|
const UnusedReexportsWarning = require("../errors/UnusedReexportsWarning");
|
|
11
9
|
const { compareStrings } = require("../util/comparators");
|
|
12
10
|
const getModuleSize = require("./getModuleSize");
|
|
13
11
|
const hasOnlyUnusedExports = require("./hasOnlyUnusedExports");
|
|
12
|
+
const isOnlyReexported = require("./isOnlyReexported");
|
|
14
13
|
|
|
15
14
|
/** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
|
|
16
15
|
/** @import Compiler from "../Compiler" */
|
|
17
|
-
/** @import Module from "../Module" */
|
|
18
|
-
/** @import ModuleGraph from "../ModuleGraph" */
|
|
19
16
|
/** @import { UnusedReexportDetails } from "../errors/UnusedReexportsWarning" */
|
|
20
17
|
|
|
21
18
|
const PLUGIN_NAME = "UnusedReexportsPlugin";
|
|
@@ -23,57 +20,6 @@ const PLUGIN_NAME = "UnusedReexportsPlugin";
|
|
|
23
20
|
// Enough to name the offenders without listing the barrel.
|
|
24
21
|
const MAX_REPORTED_MODULES = 5;
|
|
25
22
|
|
|
26
|
-
/**
|
|
27
|
-
* Tells whether every module pulling this one in does so by re-exporting it.
|
|
28
|
-
* One an importer wants for its side effects alone is deliberate, not a
|
|
29
|
-
* barrel's leftover.
|
|
30
|
-
* @param {Module} module the module to look up
|
|
31
|
-
* @param {ModuleGraph} moduleGraph the module graph
|
|
32
|
-
* @returns {boolean} true when only re-exports pull it in
|
|
33
|
-
*/
|
|
34
|
-
const isOnlyReexported = (module, moduleGraph) => {
|
|
35
|
-
// A re-export emits a side-effect edge of its own, so edges are grouped by
|
|
36
|
-
// the statement they come from — `sourceOrder` — rather than by their type.
|
|
37
|
-
/** @type {Map<Module, Set<number | undefined>>} */
|
|
38
|
-
const reexportedStatements = new Map();
|
|
39
|
-
/** @type {[Module, number | undefined][]} */
|
|
40
|
-
const edges = [];
|
|
41
|
-
|
|
42
|
-
for (const connection of moduleGraph.getIncomingConnections(module)) {
|
|
43
|
-
const origin = connection.originModule;
|
|
44
|
-
|
|
45
|
-
// An entry has no origin: it is in the build because it was asked for.
|
|
46
|
-
if (!origin) return false;
|
|
47
|
-
|
|
48
|
-
const dependency = connection.dependency;
|
|
49
|
-
|
|
50
|
-
// Only an ESM import statement can carry a re-export.
|
|
51
|
-
if (!(dependency instanceof HarmonyImportDependency)) return false;
|
|
52
|
-
|
|
53
|
-
if (dependency instanceof HarmonyExportImportedSpecifierDependency) {
|
|
54
|
-
const statements = reexportedStatements.get(origin);
|
|
55
|
-
|
|
56
|
-
if (statements === undefined) {
|
|
57
|
-
reexportedStatements.set(origin, new Set([dependency.sourceOrder]));
|
|
58
|
-
} else {
|
|
59
|
-
statements.add(dependency.sourceOrder);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
edges.push([origin, dependency.sourceOrder]);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (edges.length === 0) return false;
|
|
67
|
-
|
|
68
|
-
for (const [origin, sourceOrder] of edges) {
|
|
69
|
-
const statements = reexportedStatements.get(origin);
|
|
70
|
-
|
|
71
|
-
if (statements === undefined || !statements.has(sourceOrder)) return false;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return true;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
23
|
class UnusedReexportsPlugin {
|
|
78
24
|
/**
|
|
79
25
|
* Creates an instance of UnusedReexportsPlugin.
|
|
@@ -0,0 +1,65 @@
|
|
|
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 HarmonyExportImportedSpecifierDependency = require("../dependencies/HarmonyExportImportedSpecifierDependency");
|
|
9
|
+
const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency");
|
|
10
|
+
|
|
11
|
+
/** @import Module from "../Module" */
|
|
12
|
+
/** @import ModuleGraph from "../ModuleGraph" */
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Tells whether every module pulling this one in does so by re-exporting it.
|
|
16
|
+
* One an importer wants for its side effects alone is deliberate, not a
|
|
17
|
+
* barrel's leftover.
|
|
18
|
+
* @param {Module} module the module to look up
|
|
19
|
+
* @param {ModuleGraph} moduleGraph the module graph
|
|
20
|
+
* @returns {boolean} true when only re-exports pull it in
|
|
21
|
+
*/
|
|
22
|
+
const isOnlyReexported = (module, moduleGraph) => {
|
|
23
|
+
// A re-export emits a side-effect edge of its own, so edges are grouped by
|
|
24
|
+
// the statement they come from — `sourceOrder` — rather than by their type.
|
|
25
|
+
/** @type {Map<Module, Set<number | undefined>>} */
|
|
26
|
+
const reexportedStatements = new Map();
|
|
27
|
+
/** @type {[Module, number | undefined][]} */
|
|
28
|
+
const edges = [];
|
|
29
|
+
|
|
30
|
+
for (const connection of moduleGraph.getIncomingConnections(module)) {
|
|
31
|
+
const origin = connection.originModule;
|
|
32
|
+
|
|
33
|
+
// An entry has no origin: it is in the build because it was asked for.
|
|
34
|
+
if (!origin) return false;
|
|
35
|
+
|
|
36
|
+
const dependency = connection.dependency;
|
|
37
|
+
|
|
38
|
+
// Only an ESM import statement can carry a re-export.
|
|
39
|
+
if (!(dependency instanceof HarmonyImportDependency)) return false;
|
|
40
|
+
|
|
41
|
+
if (dependency instanceof HarmonyExportImportedSpecifierDependency) {
|
|
42
|
+
const statements = reexportedStatements.get(origin);
|
|
43
|
+
|
|
44
|
+
if (statements === undefined) {
|
|
45
|
+
reexportedStatements.set(origin, new Set([dependency.sourceOrder]));
|
|
46
|
+
} else {
|
|
47
|
+
statements.add(dependency.sourceOrder);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
edges.push([origin, dependency.sourceOrder]);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (edges.length === 0) return false;
|
|
55
|
+
|
|
56
|
+
for (const [origin, sourceOrder] of edges) {
|
|
57
|
+
const statements = reexportedStatements.get(origin);
|
|
58
|
+
|
|
59
|
+
if (statements === undefined || !statements.has(sourceOrder)) return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return true;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
module.exports = isOnlyReexported;
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
const RuntimeModule = require("../RuntimeModule");
|
|
8
8
|
const Template = require("../Template");
|
|
9
|
+
const { getOnlyHandlerKey } = require("../util/handlerKeys");
|
|
10
|
+
const { propertyAccess } = require("../util/property");
|
|
9
11
|
|
|
10
12
|
/** @import Compilation from "../Compilation" */
|
|
11
13
|
|
|
@@ -33,6 +35,17 @@ class ChunkPrefetchFunctionRuntimeModule extends RuntimeModule {
|
|
|
33
35
|
this.runtimeHandlers = runtimeHandlers;
|
|
34
36
|
}
|
|
35
37
|
|
|
38
|
+
/**
|
|
39
|
+
* The `[handlerMap, key]` pairs this module installs onto a chunk handler map
|
|
40
|
+
* such as `__webpack_require__.f`, or `null` where it cannot name them.
|
|
41
|
+
* @returns {[string, string][] | null} installed chunk handlers (do not mutate)
|
|
42
|
+
*/
|
|
43
|
+
getInstalledChunkHandlers() {
|
|
44
|
+
// Reads a map rather than installing onto one, so reading its code back would
|
|
45
|
+
// render it in a cycle.
|
|
46
|
+
return RuntimeModule.NO_CHUNK_HANDLERS;
|
|
47
|
+
}
|
|
48
|
+
|
|
36
49
|
/**
|
|
37
50
|
* Generates runtime code for this runtime module.
|
|
38
51
|
* @returns {string | null} runtime code
|
|
@@ -41,17 +54,24 @@ class ChunkPrefetchFunctionRuntimeModule extends RuntimeModule {
|
|
|
41
54
|
const { runtimeFunction, runtimeHandlers } = this;
|
|
42
55
|
const compilation = /** @type {Compilation} */ (this.compilation);
|
|
43
56
|
const { runtimeTemplate } = compilation;
|
|
57
|
+
const only =
|
|
58
|
+
runtimeFunction === null
|
|
59
|
+
? null
|
|
60
|
+
: getOnlyHandlerKey(this, runtimeHandlers);
|
|
44
61
|
return Template.asString([
|
|
45
62
|
`${runtimeHandlers} = {};`,
|
|
46
63
|
...(runtimeFunction === null
|
|
47
64
|
? []
|
|
48
65
|
: [
|
|
49
66
|
`${runtimeFunction} = ${runtimeTemplate.basicFunction("chunkId", [
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
67
|
+
// One handler needs no walk over the others, and most chunks carry one.
|
|
68
|
+
only === null
|
|
69
|
+
? // map is shorter than forEach
|
|
70
|
+
`Object.keys(${runtimeHandlers}).map(${runtimeTemplate.basicFunction(
|
|
71
|
+
"key",
|
|
72
|
+
`${runtimeHandlers}[key](chunkId);`
|
|
73
|
+
)});`
|
|
74
|
+
: `${runtimeHandlers}${propertyAccess([only])}(chunkId);`
|
|
55
75
|
])};`
|
|
56
76
|
])
|
|
57
77
|
]);
|
|
@@ -50,6 +50,8 @@ class ChunkPrefetchPreloadPlugin {
|
|
|
50
50
|
if (startupChildChunks) {
|
|
51
51
|
set.add(RuntimeGlobals.prefetchChunk);
|
|
52
52
|
set.add(RuntimeGlobals.onChunksLoaded);
|
|
53
|
+
// This is the one startup callback that is queued behind a priority.
|
|
54
|
+
set.add(RuntimeGlobals.hasChunkPriority);
|
|
53
55
|
set.add(RuntimeGlobals.exports);
|
|
54
56
|
compilation.addLazyRuntimeModule(
|
|
55
57
|
chunk,
|
|
@@ -81,10 +83,9 @@ class ChunkPrefetchPreloadPlugin {
|
|
|
81
83
|
);
|
|
82
84
|
}
|
|
83
85
|
if (chunkMap.cssPreload) {
|
|
84
|
-
// CSS-only preload
|
|
85
|
-
// the
|
|
86
|
-
//
|
|
87
|
-
// alone — nothing here calls the one that fans out over them.
|
|
86
|
+
// A CSS-only preload reaches the CSS handler itself, so it asks for
|
|
87
|
+
// the handlers alone: nothing here calls the function fanning out
|
|
88
|
+
// across them.
|
|
88
89
|
set.add(RuntimeGlobals.preloadChunkHandlers);
|
|
89
90
|
compilation.addLazyRuntimeModule(
|
|
90
91
|
chunk,
|
|
@@ -94,10 +95,9 @@ class ChunkPrefetchPreloadPlugin {
|
|
|
94
95
|
}
|
|
95
96
|
}
|
|
96
97
|
);
|
|
97
|
-
// The handlers object
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
// `create`, which runs after the requirement pass is over.
|
|
98
|
+
// The handlers object carries the runtime module, so a chunk asking only for
|
|
99
|
+
// it ships no fan-out function. That is read here rather than in `create`,
|
|
100
|
+
// which runs once the requirement pass is over.
|
|
101
101
|
for (const [type, fn, handlers] of /** @type {const} */ ([
|
|
102
102
|
[
|
|
103
103
|
"prefetch",
|
|
@@ -21,6 +21,15 @@ class ChunkPrefetchStartupRuntimeModule extends RuntimeModule {
|
|
|
21
21
|
this.startupChunks = startupChunks;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
/**
|
|
25
|
+
* The `[handlerMap, key]` pairs this module installs onto a chunk handler map
|
|
26
|
+
* such as `__webpack_require__.f`, or `null` where it cannot name them.
|
|
27
|
+
* @returns {[string, string][] | null} installed chunk handlers (do not mutate)
|
|
28
|
+
*/
|
|
29
|
+
getInstalledChunkHandlers() {
|
|
30
|
+
return RuntimeModule.NO_CHUNK_HANDLERS;
|
|
31
|
+
}
|
|
32
|
+
|
|
24
33
|
/**
|
|
25
34
|
* Generates runtime code for this runtime module.
|
|
26
35
|
* @returns {string | null} runtime code
|
|
@@ -21,6 +21,15 @@ class ChunkPrefetchTriggerRuntimeModule extends RuntimeModule {
|
|
|
21
21
|
this.chunkMap = chunkMap;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
/**
|
|
25
|
+
* The `[handlerMap, key]` pairs this module installs onto a chunk handler map
|
|
26
|
+
* such as `__webpack_require__.f`, or `null` where it cannot name them.
|
|
27
|
+
* @returns {[string, string][] | null} installed chunk handlers (do not mutate)
|
|
28
|
+
*/
|
|
29
|
+
getInstalledChunkHandlers() {
|
|
30
|
+
return [[RuntimeGlobals.ensureChunkHandlers, "prefetch"]];
|
|
31
|
+
}
|
|
32
|
+
|
|
24
33
|
/**
|
|
25
34
|
* Generates runtime code for this runtime module.
|
|
26
35
|
* @returns {string | null} runtime code
|
|
@@ -24,6 +24,15 @@ class ChunkPreloadTriggerRuntimeModule extends RuntimeModule {
|
|
|
24
24
|
this.handlerKey = handlerKey;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
/**
|
|
28
|
+
* The `[handlerMap, key]` pairs this module installs onto a chunk handler map
|
|
29
|
+
* such as `__webpack_require__.f`, or `null` where it cannot name them.
|
|
30
|
+
* @returns {[string, string][] | null} installed chunk handlers (do not mutate)
|
|
31
|
+
*/
|
|
32
|
+
getInstalledChunkHandlers() {
|
|
33
|
+
return [[RuntimeGlobals.ensureChunkHandlers, this.handlerKey]];
|
|
34
|
+
}
|
|
35
|
+
|
|
27
36
|
/**
|
|
28
37
|
* Generates runtime code for this runtime module.
|
|
29
38
|
* @returns {string | null} runtime code
|