@eriche/webpack 4.47.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/LICENSE +20 -0
- package/README.md +784 -0
- package/SECURITY.md +9 -0
- package/bin/webpack.js +171 -0
- package/buildin/amd-define.js +3 -0
- package/buildin/amd-options.js +2 -0
- package/buildin/global.js +20 -0
- package/buildin/harmony-module.js +24 -0
- package/buildin/module.js +22 -0
- package/buildin/system.js +7 -0
- package/declarations/WebpackOptions.d.ts +1466 -0
- package/declarations/plugins/BannerPlugin.d.ts +49 -0
- package/declarations/plugins/DllPlugin.d.ts +32 -0
- package/declarations/plugins/DllReferencePlugin.d.ts +126 -0
- package/declarations/plugins/HashedModuleIdsPlugin.d.ts +24 -0
- package/declarations/plugins/IgnorePlugin.d.ts +27 -0
- package/declarations/plugins/LoaderOptionsPlugin.d.ts +27 -0
- package/declarations/plugins/ProgressPlugin.d.ts +42 -0
- package/declarations/plugins/SourceMapDevToolPlugin.d.ts +94 -0
- package/declarations/plugins/WatchIgnorePlugin.d.ts +10 -0
- package/declarations/plugins/debug/ProfilingPlugin.d.ts +12 -0
- package/declarations/plugins/optimize/AggressiveSplittingPlugin.d.ts +24 -0
- package/declarations/plugins/optimize/LimitChunkCountPlugin.d.ts +16 -0
- package/declarations/plugins/optimize/MinChunkSizePlugin.d.ts +12 -0
- package/declarations/plugins/optimize/OccurrenceOrderChunkIdsPlugin.d.ts +12 -0
- package/declarations/plugins/optimize/OccurrenceOrderModuleIdsPlugin.d.ts +12 -0
- package/hot/dev-server.js +61 -0
- package/hot/emitter.js +2 -0
- package/hot/log-apply-result.js +44 -0
- package/hot/log.js +59 -0
- package/hot/only-dev-server.js +102 -0
- package/hot/poll.js +37 -0
- package/hot/signal.js +62 -0
- package/lib/APIPlugin.js +84 -0
- package/lib/AbstractMethodError.js +43 -0
- package/lib/AmdMainTemplatePlugin.js +106 -0
- package/lib/AsyncDependenciesBlock.js +110 -0
- package/lib/AsyncDependencyToInitialChunkError.js +31 -0
- package/lib/AutomaticPrefetchPlugin.js +57 -0
- package/lib/BannerPlugin.js +122 -0
- package/lib/BasicEvaluatedExpression.js +248 -0
- package/lib/CachePlugin.js +100 -0
- package/lib/CaseSensitiveModulesWarning.js +67 -0
- package/lib/Chunk.js +875 -0
- package/lib/ChunkGroup.js +513 -0
- package/lib/ChunkRenderError.js +32 -0
- package/lib/ChunkTemplate.js +87 -0
- package/lib/CommentCompilationWarning.js +32 -0
- package/lib/CommonJsStuffPlugin.js +116 -0
- package/lib/CompatibilityPlugin.js +70 -0
- package/lib/Compilation.js +2327 -0
- package/lib/Compiler.js +735 -0
- package/lib/ConcurrentCompilationError.js +19 -0
- package/lib/ConstPlugin.js +348 -0
- package/lib/ContextExclusionPlugin.js +28 -0
- package/lib/ContextModule.js +872 -0
- package/lib/ContextModuleFactory.js +262 -0
- package/lib/ContextReplacementPlugin.js +133 -0
- package/lib/DefinePlugin.js +289 -0
- package/lib/DelegatedModule.js +114 -0
- package/lib/DelegatedModuleFactoryPlugin.js +95 -0
- package/lib/DelegatedPlugin.js +39 -0
- package/lib/DependenciesBlock.js +124 -0
- package/lib/DependenciesBlockVariable.js +72 -0
- package/lib/Dependency.js +89 -0
- package/lib/DllEntryPlugin.js +54 -0
- package/lib/DllModule.js +60 -0
- package/lib/DllModuleFactory.js +29 -0
- package/lib/DllPlugin.js +49 -0
- package/lib/DllReferencePlugin.js +156 -0
- package/lib/DynamicEntryPlugin.js +94 -0
- package/lib/EntryModuleNotFoundError.js +21 -0
- package/lib/EntryOptionPlugin.js +46 -0
- package/lib/Entrypoint.js +64 -0
- package/lib/EnvironmentPlugin.js +72 -0
- package/lib/ErrorHelpers.js +60 -0
- package/lib/EvalDevToolModulePlugin.js +27 -0
- package/lib/EvalDevToolModuleTemplatePlugin.js +61 -0
- package/lib/EvalSourceMapDevToolModuleTemplatePlugin.js +120 -0
- package/lib/EvalSourceMapDevToolPlugin.js +41 -0
- package/lib/ExportPropertyMainTemplatePlugin.js +53 -0
- package/lib/ExtendedAPIPlugin.js +88 -0
- package/lib/ExternalModule.js +179 -0
- package/lib/ExternalModuleFactoryPlugin.js +110 -0
- package/lib/ExternalsPlugin.js +23 -0
- package/lib/FlagAllModulesAsUsedPlugin.js +38 -0
- package/lib/FlagDependencyExportsPlugin.js +174 -0
- package/lib/FlagDependencyUsagePlugin.js +116 -0
- package/lib/FlagInitialModulesAsUsedPlugin.js +36 -0
- package/lib/FunctionModulePlugin.js +19 -0
- package/lib/FunctionModuleTemplatePlugin.js +102 -0
- package/lib/Generator.js +60 -0
- package/lib/GraphHelpers.js +65 -0
- package/lib/HarmonyLinkingError.js +17 -0
- package/lib/HashedModuleIdsPlugin.js +63 -0
- package/lib/HotModuleReplacement.runtime.js +721 -0
- package/lib/HotModuleReplacementPlugin.js +425 -0
- package/lib/HotUpdateChunk.js +17 -0
- package/lib/HotUpdateChunkTemplate.js +78 -0
- package/lib/IgnorePlugin.js +91 -0
- package/lib/JavascriptGenerator.js +229 -0
- package/lib/JavascriptModulesPlugin.js +185 -0
- package/lib/JsonGenerator.js +57 -0
- package/lib/JsonModulesPlugin.js +30 -0
- package/lib/JsonParser.js +27 -0
- package/lib/LibManifestPlugin.js +90 -0
- package/lib/LibraryTemplatePlugin.js +186 -0
- package/lib/LoaderOptionsPlugin.js +58 -0
- package/lib/LoaderTargetPlugin.js +24 -0
- package/lib/MainTemplate.js +568 -0
- package/lib/MemoryOutputFileSystem.js +5 -0
- package/lib/Module.js +435 -0
- package/lib/ModuleBuildError.js +52 -0
- package/lib/ModuleDependencyError.js +35 -0
- package/lib/ModuleDependencyWarning.js +25 -0
- package/lib/ModuleError.js +36 -0
- package/lib/ModuleFilenameHelpers.js +179 -0
- package/lib/ModuleNotFoundError.js +23 -0
- package/lib/ModuleParseError.js +67 -0
- package/lib/ModuleReason.js +48 -0
- package/lib/ModuleTemplate.js +93 -0
- package/lib/ModuleWarning.js +36 -0
- package/lib/MultiCompiler.js +290 -0
- package/lib/MultiEntryPlugin.js +80 -0
- package/lib/MultiModule.js +87 -0
- package/lib/MultiModuleFactory.js +23 -0
- package/lib/MultiStats.js +92 -0
- package/lib/MultiWatching.js +50 -0
- package/lib/NamedChunksPlugin.js +29 -0
- package/lib/NamedModulesPlugin.js +58 -0
- package/lib/NoEmitOnErrorsPlugin.js +20 -0
- package/lib/NoModeWarning.js +23 -0
- package/lib/NodeStuffPlugin.js +118 -0
- package/lib/NormalModule.js +582 -0
- package/lib/NormalModuleFactory.js +528 -0
- package/lib/NormalModuleReplacementPlugin.js +51 -0
- package/lib/NullFactory.js +12 -0
- package/lib/OptionsApply.js +10 -0
- package/lib/OptionsDefaulter.js +141 -0
- package/lib/Parser.js +2454 -0
- package/lib/ParserHelpers.js +103 -0
- package/lib/PrefetchPlugin.js +37 -0
- package/lib/ProgressPlugin.js +307 -0
- package/lib/ProvidePlugin.js +86 -0
- package/lib/RawModule.js +56 -0
- package/lib/RecordIdsPlugin.js +236 -0
- package/lib/RemovedPluginError.js +11 -0
- package/lib/RequestShortener.js +83 -0
- package/lib/RequireJsStuffPlugin.js +66 -0
- package/lib/ResolverFactory.js +74 -0
- package/lib/RuleSet.js +567 -0
- package/lib/RuntimeTemplate.js +336 -0
- package/lib/SetVarMainTemplatePlugin.js +69 -0
- package/lib/SingleEntryPlugin.js +63 -0
- package/lib/SizeFormatHelpers.js +24 -0
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -0
- package/lib/SourceMapDevToolPlugin.js +418 -0
- package/lib/Stats.js +1685 -0
- package/lib/SystemMainTemplatePlugin.js +137 -0
- package/lib/Template.js +291 -0
- package/lib/TemplatedPathPlugin.js +188 -0
- package/lib/UmdMainTemplatePlugin.js +305 -0
- package/lib/UnsupportedFeatureWarning.js +30 -0
- package/lib/UseStrictPlugin.js +54 -0
- package/lib/WarnCaseSensitiveModulesPlugin.js +37 -0
- package/lib/WarnNoModeSetPlugin.js +17 -0
- package/lib/WatchIgnorePlugin.js +106 -0
- package/lib/Watching.js +211 -0
- package/lib/WebpackError.js +31 -0
- package/lib/WebpackOptionsApply.js +546 -0
- package/lib/WebpackOptionsDefaulter.js +391 -0
- package/lib/WebpackOptionsValidationError.js +390 -0
- package/lib/buildChunkGraph.js +712 -0
- package/lib/compareLocations.js +52 -0
- package/lib/debug/ProfilingPlugin.js +442 -0
- package/lib/dependencies/AMDDefineDependency.js +137 -0
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +336 -0
- package/lib/dependencies/AMDPlugin.js +249 -0
- package/lib/dependencies/AMDRequireArrayDependency.js +49 -0
- package/lib/dependencies/AMDRequireContextDependency.js +20 -0
- package/lib/dependencies/AMDRequireDependenciesBlock.js +47 -0
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +274 -0
- package/lib/dependencies/AMDRequireDependency.js +135 -0
- package/lib/dependencies/AMDRequireItemDependency.js +22 -0
- package/lib/dependencies/CommonJsPlugin.js +158 -0
- package/lib/dependencies/CommonJsRequireContextDependency.js +23 -0
- package/lib/dependencies/CommonJsRequireDependency.js +22 -0
- package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +138 -0
- package/lib/dependencies/ConstDependency.js +33 -0
- package/lib/dependencies/ContextDependency.js +68 -0
- package/lib/dependencies/ContextDependencyHelpers.js +232 -0
- package/lib/dependencies/ContextDependencyTemplateAsId.js +43 -0
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +39 -0
- package/lib/dependencies/ContextElementDependency.js +21 -0
- package/lib/dependencies/CriticalDependencyWarning.js +20 -0
- package/lib/dependencies/DelegatedExportsDependency.js +33 -0
- package/lib/dependencies/DelegatedSourceDependency.js +18 -0
- package/lib/dependencies/DependencyReference.js +64 -0
- package/lib/dependencies/DllEntryDependency.js +20 -0
- package/lib/dependencies/HarmonyAcceptDependency.js +48 -0
- package/lib/dependencies/HarmonyAcceptImportDependency.js +23 -0
- package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -0
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +96 -0
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +154 -0
- package/lib/dependencies/HarmonyExportExpressionDependency.js +58 -0
- package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -0
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +659 -0
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +54 -0
- package/lib/dependencies/HarmonyImportDependency.js +109 -0
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +222 -0
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -0
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +163 -0
- package/lib/dependencies/HarmonyInitDependency.js +60 -0
- package/lib/dependencies/HarmonyModulesPlugin.js +143 -0
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +26 -0
- package/lib/dependencies/ImportContextDependency.js +23 -0
- package/lib/dependencies/ImportDependenciesBlock.js +18 -0
- package/lib/dependencies/ImportDependency.js +34 -0
- package/lib/dependencies/ImportEagerDependency.js +32 -0
- package/lib/dependencies/ImportParserPlugin.js +248 -0
- package/lib/dependencies/ImportPlugin.js +79 -0
- package/lib/dependencies/ImportWeakDependency.js +34 -0
- package/lib/dependencies/JsonExportsDependency.js +26 -0
- package/lib/dependencies/LoaderDependency.js +21 -0
- package/lib/dependencies/LoaderPlugin.js +115 -0
- package/lib/dependencies/LocalModule.js +23 -0
- package/lib/dependencies/LocalModuleDependency.js +28 -0
- package/lib/dependencies/LocalModulesHelpers.js +52 -0
- package/lib/dependencies/ModuleDependency.js +23 -0
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -0
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -0
- package/lib/dependencies/ModuleHotAcceptDependency.js +23 -0
- package/lib/dependencies/ModuleHotDeclineDependency.js +23 -0
- package/lib/dependencies/MultiEntryDependency.js +25 -0
- package/lib/dependencies/NullDependency.js +20 -0
- package/lib/dependencies/PrefetchDependency.js +18 -0
- package/lib/dependencies/RequireContextDependency.js +22 -0
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -0
- package/lib/dependencies/RequireContextPlugin.js +143 -0
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -0
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -0
- package/lib/dependencies/RequireEnsureDependency.js +58 -0
- package/lib/dependencies/RequireEnsureItemDependency.js +21 -0
- package/lib/dependencies/RequireEnsurePlugin.js +74 -0
- package/lib/dependencies/RequireHeaderDependency.js +26 -0
- package/lib/dependencies/RequireIncludeDependency.js +39 -0
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -0
- package/lib/dependencies/RequireIncludePlugin.js +61 -0
- package/lib/dependencies/RequireResolveContextDependency.js +23 -0
- package/lib/dependencies/RequireResolveDependency.js +22 -0
- package/lib/dependencies/RequireResolveDependencyParserPlugin.js +86 -0
- package/lib/dependencies/RequireResolveHeaderDependency.js +26 -0
- package/lib/dependencies/SingleEntryDependency.js +21 -0
- package/lib/dependencies/SystemPlugin.js +122 -0
- package/lib/dependencies/UnsupportedDependency.js +27 -0
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +31 -0
- package/lib/dependencies/WebAssemblyImportDependency.js +54 -0
- package/lib/dependencies/WebpackMissingModule.js +20 -0
- package/lib/dependencies/getFunctionExpression.js +52 -0
- package/lib/formatLocation.js +75 -0
- package/lib/logging/Logger.js +128 -0
- package/lib/logging/createConsoleLogger.js +210 -0
- package/lib/logging/runtime.js +36 -0
- package/lib/logging/truncateArgs.js +76 -0
- package/lib/node/NodeChunkTemplatePlugin.js +31 -0
- package/lib/node/NodeEnvironmentPlugin.js +44 -0
- package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +36 -0
- package/lib/node/NodeMainTemplate.runtime.js +32 -0
- package/lib/node/NodeMainTemplateAsync.runtime.js +50 -0
- package/lib/node/NodeMainTemplatePlugin.js +321 -0
- package/lib/node/NodeOutputFileSystem.js +22 -0
- package/lib/node/NodeSourcePlugin.js +141 -0
- package/lib/node/NodeTargetPlugin.js +19 -0
- package/lib/node/NodeTemplatePlugin.js +31 -0
- package/lib/node/NodeWatchFileSystem.js +109 -0
- package/lib/node/ReadFileCompileWasmTemplatePlugin.js +61 -0
- package/lib/node/nodeConsole.js +135 -0
- package/lib/optimize/AggressiveMergingPlugin.js +87 -0
- package/lib/optimize/AggressiveSplittingPlugin.js +294 -0
- package/lib/optimize/ChunkModuleIdRangePlugin.js +66 -0
- package/lib/optimize/ConcatenatedModule.js +1477 -0
- package/lib/optimize/EnsureChunkConditionsPlugin.js +70 -0
- package/lib/optimize/FlagIncludedChunksPlugin.js +99 -0
- package/lib/optimize/LimitChunkCountPlugin.js +231 -0
- package/lib/optimize/MergeDuplicateChunksPlugin.js +78 -0
- package/lib/optimize/MinChunkSizePlugin.js +82 -0
- package/lib/optimize/MinMaxSizeWarning.js +29 -0
- package/lib/optimize/ModuleConcatenationPlugin.js +485 -0
- package/lib/optimize/NaturalChunkOrderPlugin.js +41 -0
- package/lib/optimize/OccurrenceChunkOrderPlugin.js +66 -0
- package/lib/optimize/OccurrenceModuleOrderPlugin.js +112 -0
- package/lib/optimize/OccurrenceOrderPlugin.js +135 -0
- package/lib/optimize/RemoveEmptyChunksPlugin.js +42 -0
- package/lib/optimize/RemoveParentModulesPlugin.js +127 -0
- package/lib/optimize/RuntimeChunkPlugin.js +41 -0
- package/lib/optimize/SideEffectsFlagPlugin.js +352 -0
- package/lib/optimize/SplitChunksPlugin.js +971 -0
- package/lib/performance/AssetsOverSizeLimitWarning.js +30 -0
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +30 -0
- package/lib/performance/NoAsyncChunksWarning.js +21 -0
- package/lib/performance/SizeLimitsPlugin.js +125 -0
- package/lib/util/LazyBucketSortedSet.js +235 -0
- package/lib/util/Queue.js +46 -0
- package/lib/util/Semaphore.js +53 -0
- package/lib/util/SetHelpers.js +48 -0
- package/lib/util/SortableSet.js +140 -0
- package/lib/util/StackedSetMap.js +142 -0
- package/lib/util/TrackingSet.js +35 -0
- package/lib/util/cachedMerge.js +35 -0
- package/lib/util/cleverMerge.js +77 -0
- package/lib/util/createHash.js +174 -0
- package/lib/util/deterministicGrouping.js +274 -0
- package/lib/util/hash/BatchedHash.js +71 -0
- package/lib/util/hash/md4.js +25 -0
- package/lib/util/hash/wasm-hash.js +174 -0
- package/lib/util/identifier.js +127 -0
- package/lib/util/objectToMap.js +16 -0
- package/lib/validateSchema.js +67 -0
- package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +17 -0
- package/lib/wasm/WasmFinalizeExportsPlugin.js +69 -0
- package/lib/wasm/WasmMainTemplatePlugin.js +341 -0
- package/lib/wasm/WebAssemblyGenerator.js +458 -0
- package/lib/wasm/WebAssemblyInInitialChunkError.js +88 -0
- package/lib/wasm/WebAssemblyJavascriptGenerator.js +152 -0
- package/lib/wasm/WebAssemblyModulesPlugin.js +128 -0
- package/lib/wasm/WebAssemblyParser.js +175 -0
- package/lib/wasm/WebAssemblyUtils.js +59 -0
- package/lib/web/FetchCompileWasmTemplatePlugin.js +37 -0
- package/lib/web/JsonpChunkTemplatePlugin.js +71 -0
- package/lib/web/JsonpExportMainTemplatePlugin.js +50 -0
- package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -0
- package/lib/web/JsonpMainTemplate.runtime.js +71 -0
- package/lib/web/JsonpMainTemplatePlugin.js +615 -0
- package/lib/web/JsonpTemplatePlugin.js +23 -0
- package/lib/web/WebEnvironmentPlugin.js +18 -0
- package/lib/webpack.js +206 -0
- package/lib/webpack.web.js +31 -0
- package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -0
- package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -0
- package/lib/webworker/WebWorkerMainTemplate.runtime.js +73 -0
- package/lib/webworker/WebWorkerMainTemplatePlugin.js +192 -0
- package/lib/webworker/WebWorkerTemplatePlugin.js +25 -0
- package/package.json +211 -0
- package/schemas/WebpackOptions.json +2285 -0
- package/schemas/ajv.absolutePath.js +57 -0
- package/schemas/plugins/BannerPlugin.json +101 -0
- package/schemas/plugins/DllPlugin.json +36 -0
- package/schemas/plugins/DllReferencePlugin.json +205 -0
- package/schemas/plugins/HashedModuleIdsPlugin.json +26 -0
- package/schemas/plugins/IgnorePlugin.json +37 -0
- package/schemas/plugins/LoaderOptionsPlugin.json +27 -0
- package/schemas/plugins/ProgressPlugin.json +52 -0
- package/schemas/plugins/SourceMapDevToolPlugin.json +185 -0
- package/schemas/plugins/WatchIgnorePlugin.json +18 -0
- package/schemas/plugins/debug/ProfilingPlugin.json +13 -0
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.json +23 -0
- package/schemas/plugins/optimize/LimitChunkCountPlugin.json +16 -0
- package/schemas/plugins/optimize/MinChunkSizePlugin.json +12 -0
- package/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json +11 -0
- package/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json +11 -0
- package/web_modules/node-libs-browser.js +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Tobias Koppers @sokra
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
const GraphHelpers = require("../GraphHelpers");
|
|
8
|
+
|
|
9
|
+
class EnsureChunkConditionsPlugin {
|
|
10
|
+
apply(compiler) {
|
|
11
|
+
compiler.hooks.compilation.tap(
|
|
12
|
+
"EnsureChunkConditionsPlugin",
|
|
13
|
+
compilation => {
|
|
14
|
+
const handler = chunks => {
|
|
15
|
+
let changed = false;
|
|
16
|
+
for (const module of compilation.modules) {
|
|
17
|
+
if (!module.chunkCondition) continue;
|
|
18
|
+
const sourceChunks = new Set();
|
|
19
|
+
const chunkGroups = new Set();
|
|
20
|
+
for (const chunk of module.chunksIterable) {
|
|
21
|
+
if (!module.chunkCondition(chunk)) {
|
|
22
|
+
sourceChunks.add(chunk);
|
|
23
|
+
for (const group of chunk.groupsIterable) {
|
|
24
|
+
chunkGroups.add(group);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (sourceChunks.size === 0) continue;
|
|
29
|
+
const targetChunks = new Set();
|
|
30
|
+
chunkGroupLoop: for (const chunkGroup of chunkGroups) {
|
|
31
|
+
// Can module be placed in a chunk of this group?
|
|
32
|
+
for (const chunk of chunkGroup.chunks) {
|
|
33
|
+
if (module.chunkCondition(chunk)) {
|
|
34
|
+
targetChunks.add(chunk);
|
|
35
|
+
continue chunkGroupLoop;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// We reached the entrypoint: fail
|
|
39
|
+
if (chunkGroup.isInitial()) {
|
|
40
|
+
throw new Error(
|
|
41
|
+
"Cannot fullfil chunk condition of " + module.identifier()
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
// Try placing in all parents
|
|
45
|
+
for (const group of chunkGroup.parentsIterable) {
|
|
46
|
+
chunkGroups.add(group);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (const sourceChunk of sourceChunks) {
|
|
50
|
+
GraphHelpers.disconnectChunkAndModule(sourceChunk, module);
|
|
51
|
+
}
|
|
52
|
+
for (const targetChunk of targetChunks) {
|
|
53
|
+
GraphHelpers.connectChunkAndModule(targetChunk, module);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (changed) return true;
|
|
57
|
+
};
|
|
58
|
+
compilation.hooks.optimizeChunksBasic.tap(
|
|
59
|
+
"EnsureChunkConditionsPlugin",
|
|
60
|
+
handler
|
|
61
|
+
);
|
|
62
|
+
compilation.hooks.optimizeExtractedChunksBasic.tap(
|
|
63
|
+
"EnsureChunkConditionsPlugin",
|
|
64
|
+
handler
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
module.exports = EnsureChunkConditionsPlugin;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Tobias Koppers @sokra
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
class FlagIncludedChunksPlugin {
|
|
8
|
+
apply(compiler) {
|
|
9
|
+
compiler.hooks.compilation.tap("FlagIncludedChunksPlugin", compilation => {
|
|
10
|
+
compilation.hooks.optimizeChunkIds.tap(
|
|
11
|
+
"FlagIncludedChunksPlugin",
|
|
12
|
+
chunks => {
|
|
13
|
+
// prepare two bit integers for each module
|
|
14
|
+
// 2^31 is the max number represented as SMI in v8
|
|
15
|
+
// we want the bits distributed this way:
|
|
16
|
+
// the bit 2^31 is pretty rar and only one module should get it
|
|
17
|
+
// so it has a probability of 1 / modulesCount
|
|
18
|
+
// the first bit (2^0) is the easiest and every module could get it
|
|
19
|
+
// if it doesn't get a better bit
|
|
20
|
+
// from bit 2^n to 2^(n+1) there is a probability of p
|
|
21
|
+
// so 1 / modulesCount == p^31
|
|
22
|
+
// <=> p = sqrt31(1 / modulesCount)
|
|
23
|
+
// so we use a modulo of 1 / sqrt31(1 / modulesCount)
|
|
24
|
+
const moduleBits = new WeakMap();
|
|
25
|
+
const modulesCount = compilation.modules.length;
|
|
26
|
+
|
|
27
|
+
// precalculate the modulo values for each bit
|
|
28
|
+
const modulo = 1 / Math.pow(1 / modulesCount, 1 / 31);
|
|
29
|
+
const modulos = Array.from(
|
|
30
|
+
{ length: 31 },
|
|
31
|
+
(x, i) => Math.pow(modulo, i) | 0
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
// iterate all modules to generate bit values
|
|
35
|
+
let i = 0;
|
|
36
|
+
for (const module of compilation.modules) {
|
|
37
|
+
let bit = 30;
|
|
38
|
+
while (i % modulos[bit] !== 0) {
|
|
39
|
+
bit--;
|
|
40
|
+
}
|
|
41
|
+
moduleBits.set(module, 1 << bit);
|
|
42
|
+
i++;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// interate all chunks to generate bitmaps
|
|
46
|
+
const chunkModulesHash = new WeakMap();
|
|
47
|
+
for (const chunk of chunks) {
|
|
48
|
+
let hash = 0;
|
|
49
|
+
for (const module of chunk.modulesIterable) {
|
|
50
|
+
hash |= moduleBits.get(module);
|
|
51
|
+
}
|
|
52
|
+
chunkModulesHash.set(chunk, hash);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
for (const chunkA of chunks) {
|
|
56
|
+
const chunkAHash = chunkModulesHash.get(chunkA);
|
|
57
|
+
const chunkAModulesCount = chunkA.getNumberOfModules();
|
|
58
|
+
if (chunkAModulesCount === 0) continue;
|
|
59
|
+
let bestModule = undefined;
|
|
60
|
+
for (const module of chunkA.modulesIterable) {
|
|
61
|
+
if (
|
|
62
|
+
bestModule === undefined ||
|
|
63
|
+
bestModule.getNumberOfChunks() > module.getNumberOfChunks()
|
|
64
|
+
)
|
|
65
|
+
bestModule = module;
|
|
66
|
+
}
|
|
67
|
+
loopB: for (const chunkB of bestModule.chunksIterable) {
|
|
68
|
+
// as we iterate the same iterables twice
|
|
69
|
+
// skip if we find ourselves
|
|
70
|
+
if (chunkA === chunkB) continue;
|
|
71
|
+
|
|
72
|
+
const chunkBModulesCount = chunkB.getNumberOfModules();
|
|
73
|
+
|
|
74
|
+
// ids for empty chunks are not included
|
|
75
|
+
if (chunkBModulesCount === 0) continue;
|
|
76
|
+
|
|
77
|
+
// instead of swapping A and B just bail
|
|
78
|
+
// as we loop twice the current A will be B and B then A
|
|
79
|
+
if (chunkAModulesCount > chunkBModulesCount) continue;
|
|
80
|
+
|
|
81
|
+
// is chunkA in chunkB?
|
|
82
|
+
|
|
83
|
+
// we do a cheap check for the hash value
|
|
84
|
+
const chunkBHash = chunkModulesHash.get(chunkB);
|
|
85
|
+
if ((chunkBHash & chunkAHash) !== chunkAHash) continue;
|
|
86
|
+
|
|
87
|
+
// compare all modules
|
|
88
|
+
for (const m of chunkA.modulesIterable) {
|
|
89
|
+
if (!chunkB.containsModule(m)) continue loopB;
|
|
90
|
+
}
|
|
91
|
+
chunkB.ids.push(chunkA.id);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
module.exports = FlagIncludedChunksPlugin;
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Tobias Koppers @sokra
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
const validateOptions = require("schema-utils");
|
|
8
|
+
const schema = require("../../schemas/plugins/optimize/LimitChunkCountPlugin.json");
|
|
9
|
+
const LazyBucketSortedSet = require("../util/LazyBucketSortedSet");
|
|
10
|
+
|
|
11
|
+
/** @typedef {import("../../declarations/plugins/optimize/LimitChunkCountPlugin").LimitChunkCountPluginOptions} LimitChunkCountPluginOptions */
|
|
12
|
+
/** @typedef {import("../Chunk")} Chunk */
|
|
13
|
+
/** @typedef {import("../Compiler")} Compiler */
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {Object} ChunkCombination
|
|
17
|
+
* @property {boolean} deleted this is set to true when combination was removed
|
|
18
|
+
* @property {number} sizeDiff
|
|
19
|
+
* @property {number} integratedSize
|
|
20
|
+
* @property {Chunk} a
|
|
21
|
+
* @property {Chunk} b
|
|
22
|
+
* @property {number} aIdx
|
|
23
|
+
* @property {number} bIdx
|
|
24
|
+
* @property {number} aSize
|
|
25
|
+
* @property {number} bSize
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
const addToSetMap = (map, key, value) => {
|
|
29
|
+
const set = map.get(key);
|
|
30
|
+
if (set === undefined) {
|
|
31
|
+
map.set(key, new Set([value]));
|
|
32
|
+
} else {
|
|
33
|
+
set.add(value);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
class LimitChunkCountPlugin {
|
|
38
|
+
/**
|
|
39
|
+
* @param {LimitChunkCountPluginOptions=} options options object
|
|
40
|
+
*/
|
|
41
|
+
constructor(options) {
|
|
42
|
+
if (!options) options = {};
|
|
43
|
+
|
|
44
|
+
validateOptions(schema, options, "Limit Chunk Count Plugin");
|
|
45
|
+
this.options = options;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @param {Compiler} compiler the webpack compiler
|
|
50
|
+
* @returns {void}
|
|
51
|
+
*/
|
|
52
|
+
apply(compiler) {
|
|
53
|
+
const options = this.options;
|
|
54
|
+
compiler.hooks.compilation.tap("LimitChunkCountPlugin", compilation => {
|
|
55
|
+
compilation.hooks.optimizeChunksAdvanced.tap(
|
|
56
|
+
"LimitChunkCountPlugin",
|
|
57
|
+
chunks => {
|
|
58
|
+
const maxChunks = options.maxChunks;
|
|
59
|
+
if (!maxChunks) return;
|
|
60
|
+
if (maxChunks < 1) return;
|
|
61
|
+
if (chunks.length <= maxChunks) return;
|
|
62
|
+
|
|
63
|
+
let remainingChunksToMerge = chunks.length - maxChunks;
|
|
64
|
+
|
|
65
|
+
// order chunks in a deterministic way
|
|
66
|
+
const orderedChunks = chunks.slice().sort((a, b) => a.compareTo(b));
|
|
67
|
+
|
|
68
|
+
// create a lazy sorted data structure to keep all combinations
|
|
69
|
+
// this is large. Size = chunks * (chunks - 1) / 2
|
|
70
|
+
// It uses a multi layer bucket sort plus normal sort in the last layer
|
|
71
|
+
// It's also lazy so only accessed buckets are sorted
|
|
72
|
+
const combinations = new LazyBucketSortedSet(
|
|
73
|
+
// Layer 1: ordered by largest size benefit
|
|
74
|
+
c => c.sizeDiff,
|
|
75
|
+
(a, b) => b - a,
|
|
76
|
+
// Layer 2: ordered by smallest combined size
|
|
77
|
+
c => c.integratedSize,
|
|
78
|
+
(a, b) => a - b,
|
|
79
|
+
// Layer 3: ordered by position difference in orderedChunk (-> to be deterministic)
|
|
80
|
+
c => c.bIdx - c.aIdx,
|
|
81
|
+
(a, b) => a - b,
|
|
82
|
+
// Layer 4: ordered by position in orderedChunk (-> to be deterministic)
|
|
83
|
+
(a, b) => a.bIdx - b.bIdx
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
// we keep a mappng from chunk to all combinations
|
|
87
|
+
// but this mapping is not kept up-to-date with deletions
|
|
88
|
+
// so `deleted` flag need to be considered when iterating this
|
|
89
|
+
/** @type {Map<Chunk, Set<ChunkCombination>>} */
|
|
90
|
+
const combinationsByChunk = new Map();
|
|
91
|
+
|
|
92
|
+
orderedChunks.forEach((b, bIdx) => {
|
|
93
|
+
// create combination pairs with size and integrated size
|
|
94
|
+
for (let aIdx = 0; aIdx < bIdx; aIdx++) {
|
|
95
|
+
const a = orderedChunks[aIdx];
|
|
96
|
+
const integratedSize = a.integratedSize(b, options);
|
|
97
|
+
|
|
98
|
+
// filter pairs that do not have an integratedSize
|
|
99
|
+
// meaning they can NOT be integrated!
|
|
100
|
+
if (integratedSize === false) continue;
|
|
101
|
+
|
|
102
|
+
const aSize = a.size(options);
|
|
103
|
+
const bSize = b.size(options);
|
|
104
|
+
const c = {
|
|
105
|
+
deleted: false,
|
|
106
|
+
sizeDiff: aSize + bSize - integratedSize,
|
|
107
|
+
integratedSize,
|
|
108
|
+
a,
|
|
109
|
+
b,
|
|
110
|
+
aIdx,
|
|
111
|
+
bIdx,
|
|
112
|
+
aSize,
|
|
113
|
+
bSize
|
|
114
|
+
};
|
|
115
|
+
combinations.add(c);
|
|
116
|
+
addToSetMap(combinationsByChunk, a, c);
|
|
117
|
+
addToSetMap(combinationsByChunk, b, c);
|
|
118
|
+
}
|
|
119
|
+
return combinations;
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// list of modified chunks during this run
|
|
123
|
+
// combinations affected by this change are skipped to allow
|
|
124
|
+
// futher optimizations
|
|
125
|
+
/** @type {Set<Chunk>} */
|
|
126
|
+
const modifiedChunks = new Set();
|
|
127
|
+
|
|
128
|
+
let changed = false;
|
|
129
|
+
// eslint-disable-next-line no-constant-condition
|
|
130
|
+
loop: while (true) {
|
|
131
|
+
const combination = combinations.popFirst();
|
|
132
|
+
if (combination === undefined) break;
|
|
133
|
+
|
|
134
|
+
combination.deleted = true;
|
|
135
|
+
const { a, b, integratedSize } = combination;
|
|
136
|
+
|
|
137
|
+
// skip over pair when
|
|
138
|
+
// one of the already merged chunks is a parent of one of the chunks
|
|
139
|
+
if (modifiedChunks.size > 0) {
|
|
140
|
+
const queue = new Set(a.groupsIterable);
|
|
141
|
+
for (const group of b.groupsIterable) {
|
|
142
|
+
queue.add(group);
|
|
143
|
+
}
|
|
144
|
+
for (const group of queue) {
|
|
145
|
+
for (const mChunk of modifiedChunks) {
|
|
146
|
+
if (mChunk !== a && mChunk !== b && mChunk.isInGroup(group)) {
|
|
147
|
+
// This is a potential pair which needs recalculation
|
|
148
|
+
// We can't do that now, but it merge before following pairs
|
|
149
|
+
// so we leave space for it, and consider chunks as modified
|
|
150
|
+
// just for the worse case
|
|
151
|
+
remainingChunksToMerge--;
|
|
152
|
+
if (remainingChunksToMerge <= 0) break loop;
|
|
153
|
+
modifiedChunks.add(a);
|
|
154
|
+
modifiedChunks.add(b);
|
|
155
|
+
continue loop;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
for (const parent of group.parentsIterable) {
|
|
159
|
+
queue.add(parent);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// merge the chunks
|
|
165
|
+
if (a.integrate(b, "limit")) {
|
|
166
|
+
chunks.splice(chunks.indexOf(b), 1);
|
|
167
|
+
|
|
168
|
+
// flag chunk a as modified as further optimization are possible for all children here
|
|
169
|
+
modifiedChunks.add(a);
|
|
170
|
+
|
|
171
|
+
changed = true;
|
|
172
|
+
remainingChunksToMerge--;
|
|
173
|
+
if (remainingChunksToMerge <= 0) break;
|
|
174
|
+
|
|
175
|
+
// Update all affected combinations
|
|
176
|
+
// delete all combination with the removed chunk
|
|
177
|
+
// we will use combinations with the kept chunk instead
|
|
178
|
+
for (const combination of combinationsByChunk.get(b)) {
|
|
179
|
+
if (combination.deleted) continue;
|
|
180
|
+
combination.deleted = true;
|
|
181
|
+
combinations.delete(combination);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Update combinations with the kept chunk with new sizes
|
|
185
|
+
for (const combination of combinationsByChunk.get(a)) {
|
|
186
|
+
if (combination.deleted) continue;
|
|
187
|
+
if (combination.a === a) {
|
|
188
|
+
// Update size
|
|
189
|
+
const newIntegratedSize = a.integratedSize(
|
|
190
|
+
combination.b,
|
|
191
|
+
options
|
|
192
|
+
);
|
|
193
|
+
if (newIntegratedSize === false) {
|
|
194
|
+
combination.deleted = true;
|
|
195
|
+
combinations.delete(combination);
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const finishUpdate = combinations.startUpdate(combination);
|
|
199
|
+
combination.integratedSize = newIntegratedSize;
|
|
200
|
+
combination.aSize = integratedSize;
|
|
201
|
+
combination.sizeDiff =
|
|
202
|
+
combination.bSize + integratedSize - newIntegratedSize;
|
|
203
|
+
finishUpdate();
|
|
204
|
+
} else if (combination.b === a) {
|
|
205
|
+
// Update size
|
|
206
|
+
const newIntegratedSize = combination.a.integratedSize(
|
|
207
|
+
a,
|
|
208
|
+
options
|
|
209
|
+
);
|
|
210
|
+
if (newIntegratedSize === false) {
|
|
211
|
+
combination.deleted = true;
|
|
212
|
+
combinations.delete(combination);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const finishUpdate = combinations.startUpdate(combination);
|
|
216
|
+
combination.integratedSize = newIntegratedSize;
|
|
217
|
+
combination.bSize = integratedSize;
|
|
218
|
+
combination.sizeDiff =
|
|
219
|
+
integratedSize + combination.aSize - newIntegratedSize;
|
|
220
|
+
finishUpdate();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (changed) return true;
|
|
226
|
+
}
|
|
227
|
+
);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
module.exports = LimitChunkCountPlugin;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Tobias Koppers @sokra
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
class MergeDuplicateChunksPlugin {
|
|
8
|
+
apply(compiler) {
|
|
9
|
+
compiler.hooks.compilation.tap(
|
|
10
|
+
"MergeDuplicateChunksPlugin",
|
|
11
|
+
compilation => {
|
|
12
|
+
compilation.hooks.optimizeChunksBasic.tap(
|
|
13
|
+
"MergeDuplicateChunksPlugin",
|
|
14
|
+
chunks => {
|
|
15
|
+
// remember already tested chunks for performance
|
|
16
|
+
const notDuplicates = new Set();
|
|
17
|
+
|
|
18
|
+
// for each chunk
|
|
19
|
+
for (const chunk of chunks) {
|
|
20
|
+
// track a Set of all chunk that could be duplicates
|
|
21
|
+
let possibleDuplicates;
|
|
22
|
+
for (const module of chunk.modulesIterable) {
|
|
23
|
+
if (possibleDuplicates === undefined) {
|
|
24
|
+
// when possibleDuplicates is not yet set,
|
|
25
|
+
// create a new Set from chunks of the current module
|
|
26
|
+
// including only chunks with the same number of modules
|
|
27
|
+
for (const dup of module.chunksIterable) {
|
|
28
|
+
if (
|
|
29
|
+
dup !== chunk &&
|
|
30
|
+
chunk.getNumberOfModules() === dup.getNumberOfModules() &&
|
|
31
|
+
!notDuplicates.has(dup)
|
|
32
|
+
) {
|
|
33
|
+
// delay allocating the new Set until here, reduce memory pressure
|
|
34
|
+
if (possibleDuplicates === undefined) {
|
|
35
|
+
possibleDuplicates = new Set();
|
|
36
|
+
}
|
|
37
|
+
possibleDuplicates.add(dup);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// when no chunk is possible we can break here
|
|
41
|
+
if (possibleDuplicates === undefined) break;
|
|
42
|
+
} else {
|
|
43
|
+
// validate existing possible duplicates
|
|
44
|
+
for (const dup of possibleDuplicates) {
|
|
45
|
+
// remove possible duplicate when module is not contained
|
|
46
|
+
if (!dup.containsModule(module)) {
|
|
47
|
+
possibleDuplicates.delete(dup);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// when all chunks has been removed we can break here
|
|
51
|
+
if (possibleDuplicates.size === 0) break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// when we found duplicates
|
|
56
|
+
if (
|
|
57
|
+
possibleDuplicates !== undefined &&
|
|
58
|
+
possibleDuplicates.size > 0
|
|
59
|
+
) {
|
|
60
|
+
for (const otherChunk of possibleDuplicates) {
|
|
61
|
+
if (otherChunk.hasRuntime() !== chunk.hasRuntime()) continue;
|
|
62
|
+
// merge them
|
|
63
|
+
if (chunk.integrate(otherChunk, "duplicate")) {
|
|
64
|
+
chunks.splice(chunks.indexOf(otherChunk), 1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// don't check already processed chunks twice
|
|
70
|
+
notDuplicates.add(chunk);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
module.exports = MergeDuplicateChunksPlugin;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Tobias Koppers @sokra
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
const validateOptions = require("schema-utils");
|
|
8
|
+
const schema = require("../../schemas/plugins/optimize/MinChunkSizePlugin.json");
|
|
9
|
+
|
|
10
|
+
/** @typedef {import("../../declarations/plugins/optimize/MinChunkSizePlugin").MinChunkSizePluginOptions} MinChunkSizePluginOptions */
|
|
11
|
+
|
|
12
|
+
class MinChunkSizePlugin {
|
|
13
|
+
/**
|
|
14
|
+
* @param {MinChunkSizePluginOptions} options options object
|
|
15
|
+
*/
|
|
16
|
+
constructor(options) {
|
|
17
|
+
validateOptions(schema, options, "Min Chunk Size Plugin");
|
|
18
|
+
this.options = options;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
apply(compiler) {
|
|
22
|
+
const options = this.options;
|
|
23
|
+
const minChunkSize = options.minChunkSize;
|
|
24
|
+
compiler.hooks.compilation.tap("MinChunkSizePlugin", compilation => {
|
|
25
|
+
compilation.hooks.optimizeChunksAdvanced.tap(
|
|
26
|
+
"MinChunkSizePlugin",
|
|
27
|
+
chunks => {
|
|
28
|
+
const equalOptions = {
|
|
29
|
+
chunkOverhead: 1,
|
|
30
|
+
entryChunkMultiplicator: 1
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const sortedSizeFilteredExtendedPairCombinations = chunks
|
|
34
|
+
.reduce((combinations, a, idx) => {
|
|
35
|
+
// create combination pairs
|
|
36
|
+
for (let i = 0; i < idx; i++) {
|
|
37
|
+
const b = chunks[i];
|
|
38
|
+
combinations.push([b, a]);
|
|
39
|
+
}
|
|
40
|
+
return combinations;
|
|
41
|
+
}, [])
|
|
42
|
+
.filter(pair => {
|
|
43
|
+
// check if one of the chunks sizes is smaller than the minChunkSize
|
|
44
|
+
const p0SmallerThanMinChunkSize =
|
|
45
|
+
pair[0].size(equalOptions) < minChunkSize;
|
|
46
|
+
const p1SmallerThanMinChunkSize =
|
|
47
|
+
pair[1].size(equalOptions) < minChunkSize;
|
|
48
|
+
return p0SmallerThanMinChunkSize || p1SmallerThanMinChunkSize;
|
|
49
|
+
})
|
|
50
|
+
.map(pair => {
|
|
51
|
+
// extend combination pairs with size and integrated size
|
|
52
|
+
const a = pair[0].size(options);
|
|
53
|
+
const b = pair[1].size(options);
|
|
54
|
+
const ab = pair[0].integratedSize(pair[1], options);
|
|
55
|
+
return [a + b - ab, ab, pair[0], pair[1]];
|
|
56
|
+
})
|
|
57
|
+
.filter(pair => {
|
|
58
|
+
// filter pairs that do not have an integratedSize
|
|
59
|
+
// meaning they can NOT be integrated!
|
|
60
|
+
return pair[1] !== false;
|
|
61
|
+
})
|
|
62
|
+
.sort((a, b) => {
|
|
63
|
+
// sadly javascript does an inplace sort here
|
|
64
|
+
// sort by size
|
|
65
|
+
const diff = b[0] - a[0];
|
|
66
|
+
if (diff !== 0) return diff;
|
|
67
|
+
return a[1] - b[1];
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
if (sortedSizeFilteredExtendedPairCombinations.length === 0) return;
|
|
71
|
+
|
|
72
|
+
const pair = sortedSizeFilteredExtendedPairCombinations[0];
|
|
73
|
+
|
|
74
|
+
pair[2].integrate(pair[3], "min-size");
|
|
75
|
+
chunks.splice(chunks.indexOf(pair[3]), 1);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
module.exports = MinChunkSizePlugin;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
3
|
+
Author Tobias Koppers @sokra
|
|
4
|
+
*/
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
const WebpackError = require("../WebpackError");
|
|
8
|
+
const SizeFormatHelpers = require("../SizeFormatHelpers");
|
|
9
|
+
|
|
10
|
+
class MinMaxSizeWarning extends WebpackError {
|
|
11
|
+
constructor(keys, minSize, maxSize) {
|
|
12
|
+
let keysMessage = "Fallback cache group";
|
|
13
|
+
if (keys) {
|
|
14
|
+
keysMessage =
|
|
15
|
+
keys.length > 1
|
|
16
|
+
? `Cache groups ${keys.sort().join(", ")}`
|
|
17
|
+
: `Cache group ${keys[0]}`;
|
|
18
|
+
}
|
|
19
|
+
super(
|
|
20
|
+
`SplitChunksPlugin\n` +
|
|
21
|
+
`${keysMessage}\n` +
|
|
22
|
+
`Configured minSize (${SizeFormatHelpers.formatSize(minSize)}) is ` +
|
|
23
|
+
`bigger than maxSize (${SizeFormatHelpers.formatSize(maxSize)}).\n` +
|
|
24
|
+
"This seem to be a invalid optimiziation.splitChunks configuration."
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = MinMaxSizeWarning;
|