webpack 4.15.0 → 4.16.2
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 -20
- package/README.md +761 -758
- package/SECURITY.md +9 -9
- package/buildin/amd-define.js +3 -3
- package/buildin/amd-options.js +2 -2
- package/buildin/global.js +20 -20
- package/buildin/harmony-module.js +24 -24
- package/buildin/module.js +22 -22
- package/buildin/system.js +7 -7
- package/hot/dev-server.js +61 -61
- package/hot/emitter.js +2 -2
- package/hot/log-apply-result.js +44 -44
- package/hot/log.js +45 -45
- package/hot/only-dev-server.js +105 -105
- package/hot/poll.js +40 -37
- package/hot/signal.js +62 -62
- package/lib/APIPlugin.js +84 -84
- package/lib/AmdMainTemplatePlugin.js +87 -87
- package/lib/AsyncDependencyToInitialChunkError.js +31 -31
- package/lib/AutomaticPrefetchPlugin.js +1 -1
- package/lib/BannerPlugin.js +117 -117
- package/lib/BasicEvaluatedExpression.js +211 -211
- package/lib/CachePlugin.js +102 -102
- package/lib/CaseSensitiveModulesWarning.js +67 -67
- package/lib/Chunk.js +833 -811
- package/lib/ChunkGroup.js +4 -4
- package/lib/ChunkRenderError.js +32 -32
- package/lib/CommentCompilationWarning.js +2 -2
- package/lib/CompatibilityPlugin.js +70 -70
- package/lib/Compilation.js +46 -15
- package/lib/ConcurrentCompilationError.js +19 -19
- package/lib/ConstPlugin.js +258 -258
- package/lib/ContextExclusionPlugin.js +28 -17
- package/lib/ContextModule.js +844 -739
- package/lib/ContextModuleFactory.js +262 -256
- package/lib/ContextReplacementPlugin.js +133 -133
- package/lib/DefinePlugin.js +49 -0
- package/lib/DelegatedModule.js +5 -0
- package/lib/DelegatedModuleFactoryPlugin.js +95 -89
- package/lib/DelegatedPlugin.js +39 -39
- package/lib/DependenciesBlock.js +1 -1
- package/lib/Dependency.js +10 -4
- package/lib/DllModule.js +60 -54
- package/lib/DllModuleFactory.js +29 -29
- package/lib/DllPlugin.js +44 -44
- package/lib/DllReferencePlugin.js +132 -84
- package/lib/EntryModuleNotFoundError.js +21 -21
- package/lib/Entrypoint.js +54 -54
- package/lib/EnvironmentPlugin.js +72 -65
- package/lib/ErrorHelpers.js +60 -60
- package/lib/EvalDevToolModulePlugin.js +27 -27
- package/lib/EvalSourceMapDevToolModuleTemplatePlugin.js +115 -115
- package/lib/EvalSourceMapDevToolPlugin.js +41 -41
- package/lib/ExportPropertyMainTemplatePlugin.js +53 -53
- package/lib/ExternalModule.js +165 -159
- package/lib/ExternalsPlugin.js +23 -23
- package/lib/FlagDependencyExportsPlugin.js +146 -146
- package/lib/FlagInitialModulesAsUsedPlugin.js +36 -36
- package/lib/FunctionModuleTemplatePlugin.js +100 -100
- package/lib/Generator.js +60 -52
- package/lib/HarmonyLinkingError.js +17 -17
- package/lib/HashedModuleIdsPlugin.js +53 -53
- package/lib/HotModuleReplacementPlugin.js +411 -413
- package/lib/IgnorePlugin.js +90 -90
- package/lib/JavascriptGenerator.js +229 -229
- package/lib/JavascriptModulesPlugin.js +179 -179
- package/lib/JsonGenerator.js +55 -55
- package/lib/JsonModulesPlugin.js +30 -30
- package/lib/JsonParser.js +27 -27
- package/lib/LibManifestPlugin.js +86 -86
- package/lib/LibraryTemplatePlugin.js +153 -153
- package/lib/LoaderOptionsPlugin.js +53 -53
- package/lib/LoaderTargetPlugin.js +24 -24
- package/lib/MemoryOutputFileSystem.js +5 -5
- package/lib/Module.js +431 -391
- package/lib/ModuleBuildError.js +52 -52
- package/lib/ModuleDependencyError.js +35 -35
- package/lib/ModuleDependencyWarning.js +25 -25
- package/lib/ModuleError.js +36 -36
- package/lib/ModuleFilenameHelpers.js +178 -178
- package/lib/ModuleNotFoundError.js +23 -23
- package/lib/ModuleParseError.js +57 -57
- package/lib/ModuleTemplate.js +93 -93
- package/lib/ModuleWarning.js +36 -36
- package/lib/MultiCompiler.js +283 -283
- package/lib/MultiModule.js +87 -81
- package/lib/MultiModuleFactory.js +23 -23
- package/lib/MultiStats.js +92 -92
- package/lib/MultiWatching.js +38 -38
- package/lib/NamedChunksPlugin.js +29 -29
- package/lib/NamedModulesPlugin.js +57 -57
- package/lib/NoEmitOnErrorsPlugin.js +20 -20
- package/lib/NoModeWarning.js +23 -23
- package/lib/NodeStuffPlugin.js +197 -179
- package/lib/NormalModule.js +542 -536
- package/lib/NormalModuleFactory.js +526 -526
- package/lib/NormalModuleReplacementPlugin.js +51 -51
- package/lib/NullFactory.js +12 -12
- package/lib/OptionsApply.js +10 -10
- package/lib/OptionsDefaulter.js +84 -84
- package/lib/Parser.js +2202 -2193
- package/lib/ParserHelpers.js +103 -103
- package/lib/PrefetchPlugin.js +37 -37
- package/lib/ProgressPlugin.js +246 -246
- package/lib/ProvidePlugin.js +86 -86
- package/lib/RawModule.js +56 -56
- package/lib/RecordIdsPlugin.js +230 -230
- package/lib/RemovedPluginError.js +11 -11
- package/lib/RequestShortener.js +83 -83
- package/lib/RequireJsStuffPlugin.js +69 -69
- package/lib/ResolverFactory.js +64 -64
- package/lib/RuntimeTemplate.js +12 -0
- package/lib/SetVarMainTemplatePlugin.js +69 -69
- package/lib/SingleEntryPlugin.js +6 -1
- package/lib/SizeFormatHelpers.js +24 -24
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -49
- package/lib/SourceMapDevToolPlugin.js +301 -301
- package/lib/Stats.js +28 -5
- package/lib/TemplatedPathPlugin.js +173 -173
- package/lib/UnsupportedFeatureWarning.js +22 -22
- package/lib/UseStrictPlugin.js +54 -54
- package/lib/WarnCaseSensitiveModulesPlugin.js +37 -37
- package/lib/WarnNoModeSetPlugin.js +17 -17
- package/lib/WatchIgnorePlugin.js +100 -100
- package/lib/Watching.js +194 -194
- package/lib/WebpackOptionsApply.js +92 -10
- package/lib/WebpackOptionsDefaulter.js +368 -354
- package/lib/debug/ProfilingPlugin.js +430 -430
- package/lib/dependencies/AMDPlugin.js +250 -250
- package/lib/dependencies/AMDRequireArrayDependency.js +49 -49
- package/lib/dependencies/AMDRequireContextDependency.js +20 -20
- package/lib/dependencies/AMDRequireDependency.js +135 -135
- package/lib/dependencies/AMDRequireItemDependency.js +22 -22
- package/lib/dependencies/CommonJsPlugin.js +161 -161
- package/lib/dependencies/CommonJsRequireContextDependency.js +23 -23
- package/lib/dependencies/CommonJsRequireDependency.js +22 -22
- package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +6 -0
- package/lib/dependencies/ConstDependency.js +33 -33
- package/lib/dependencies/ContextDependency.js +68 -68
- package/lib/dependencies/ContextDependencyHelpers.js +142 -142
- package/lib/dependencies/ContextDependencyTemplateAsId.js +42 -42
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +38 -38
- package/lib/dependencies/ContextElementDependency.js +21 -21
- package/lib/dependencies/CriticalDependencyWarning.js +20 -20
- package/lib/dependencies/DelegatedSourceDependency.js +18 -18
- package/lib/dependencies/DllEntryDependency.js +20 -20
- package/lib/dependencies/HarmonyAcceptDependency.js +45 -45
- package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -31
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +92 -92
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +139 -139
- package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -30
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +2 -1
- package/lib/dependencies/HarmonyImportDependency.js +109 -109
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +222 -222
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -31
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +167 -167
- package/lib/dependencies/HarmonyInitDependency.js +60 -60
- package/lib/dependencies/HarmonyModulesPlugin.js +146 -146
- package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +26 -26
- package/lib/dependencies/ImportContextDependency.js +23 -23
- package/lib/dependencies/ImportDependenciesBlock.js +18 -18
- package/lib/dependencies/ImportDependency.js +34 -34
- package/lib/dependencies/ImportEagerDependency.js +32 -32
- package/lib/dependencies/ImportParserPlugin.js +263 -263
- package/lib/dependencies/ImportPlugin.js +82 -82
- package/lib/dependencies/ImportWeakDependency.js +34 -34
- package/lib/dependencies/LoaderPlugin.js +18 -1
- package/lib/dependencies/LocalModule.js +23 -23
- package/lib/dependencies/LocalModulesHelpers.js +52 -52
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -17
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -17
- package/lib/dependencies/ModuleHotAcceptDependency.js +23 -23
- package/lib/dependencies/ModuleHotDeclineDependency.js +23 -23
- package/lib/dependencies/NullDependency.js +20 -20
- package/lib/dependencies/PrefetchDependency.js +18 -18
- package/lib/dependencies/RequireContextDependency.js +22 -22
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -56
- package/lib/dependencies/RequireContextPlugin.js +143 -143
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -33
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -116
- package/lib/dependencies/RequireEnsureDependency.js +58 -58
- package/lib/dependencies/RequireEnsureItemDependency.js +21 -21
- package/lib/dependencies/RequireEnsurePlugin.js +74 -74
- package/lib/dependencies/RequireHeaderDependency.js +26 -26
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -23
- package/lib/dependencies/RequireIncludePlugin.js +61 -61
- package/lib/dependencies/RequireResolveContextDependency.js +23 -23
- package/lib/dependencies/RequireResolveDependency.js +22 -22
- package/lib/dependencies/RequireResolveDependencyParserPlugin.js +85 -85
- package/lib/dependencies/RequireResolveHeaderDependency.js +26 -26
- package/lib/dependencies/SystemPlugin.js +125 -125
- package/lib/dependencies/UnsupportedDependency.js +27 -27
- package/lib/dependencies/WebAssemblyExportImportedDependency.js +29 -29
- package/lib/dependencies/WebAssemblyImportDependency.js +48 -48
- package/lib/dependencies/WebpackMissingModule.js +20 -20
- package/lib/formatLocation.js +75 -61
- package/lib/node/NodeChunkTemplatePlugin.js +31 -31
- package/lib/node/NodeEnvironmentPlugin.js +28 -28
- package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +36 -36
- package/lib/node/NodeMainTemplate.runtime.js +27 -27
- package/lib/node/NodeMainTemplatePlugin.js +323 -323
- package/lib/node/NodeOutputFileSystem.js +22 -22
- package/lib/node/NodeSourcePlugin.js +144 -144
- package/lib/node/NodeTargetPlugin.js +18 -18
- package/lib/node/NodeTemplatePlugin.js +31 -31
- package/lib/node/NodeWatchFileSystem.js +99 -99
- package/lib/node/ReadFileCompileWasmTemplatePlugin.js +61 -61
- package/lib/optimize/AggressiveMergingPlugin.js +87 -87
- package/lib/optimize/AggressiveSplittingPlugin.js +287 -287
- package/lib/optimize/ConcatenatedModule.js +5 -0
- package/lib/optimize/EnsureChunkConditionsPlugin.js +70 -70
- package/lib/optimize/FlagIncludedChunksPlugin.js +99 -99
- package/lib/optimize/LimitChunkCountPlugin.js +66 -66
- package/lib/optimize/MergeDuplicateChunksPlugin.js +78 -78
- package/lib/optimize/MinChunkSizePlugin.js +77 -77
- package/lib/optimize/NaturalChunkOrderPlugin.js +41 -0
- package/lib/optimize/OccurrenceChunkOrderPlugin.js +61 -0
- package/lib/optimize/OccurrenceModuleOrderPlugin.js +103 -0
- package/lib/optimize/OccurrenceOrderPlugin.js +135 -133
- package/lib/optimize/RemoveEmptyChunksPlugin.js +42 -42
- package/lib/optimize/RemoveParentModulesPlugin.js +127 -127
- package/lib/optimize/RuntimeChunkPlugin.js +41 -41
- package/lib/optimize/SideEffectsFlagPlugin.js +168 -168
- package/lib/optimize/SplitChunksPlugin.js +866 -850
- package/lib/performance/AssetsOverSizeLimitWarning.js +30 -30
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +30 -30
- package/lib/performance/NoAsyncChunksWarning.js +21 -21
- package/lib/performance/SizeLimitsPlugin.js +105 -105
- package/lib/util/SortableSet.js +1 -0
- package/lib/util/StackedSetMap.js +144 -135
- package/lib/util/TrackingSet.js +35 -35
- package/lib/util/cachedMerge.js +35 -35
- package/lib/util/deterministicGrouping.js +251 -251
- package/lib/util/identifier.js +103 -103
- package/lib/util/objectToMap.js +16 -16
- package/lib/validateSchema.js +67 -67
- package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +17 -17
- package/lib/wasm/WasmFinalizeExportsPlugin.js +1 -1
- package/lib/wasm/WebAssemblyGenerator.js +16 -2
- package/lib/wasm/WebAssemblyJavascriptGenerator.js +147 -133
- package/lib/wasm/WebAssemblyParser.js +174 -174
- package/lib/wasm/WebAssemblyUtils.js +59 -59
- package/lib/web/FetchCompileWasmTemplatePlugin.js +37 -37
- package/lib/web/JsonpExportMainTemplatePlugin.js +47 -47
- package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -39
- package/lib/web/JsonpMainTemplate.runtime.js +65 -65
- package/lib/web/JsonpMainTemplatePlugin.js +1 -1
- package/lib/web/JsonpTemplatePlugin.js +23 -23
- package/lib/web/WebEnvironmentPlugin.js +18 -18
- package/lib/webpack.js +5 -0
- package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -35
- package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -40
- package/lib/webworker/WebWorkerMainTemplate.runtime.js +65 -65
- package/lib/webworker/WebWorkerMainTemplatePlugin.js +196 -196
- package/lib/webworker/WebWorkerTemplatePlugin.js +25 -25
- package/package.json +22 -13
- package/schemas/WebpackOptions.json +2062 -2036
- package/schemas/ajv.absolutePath.js +55 -55
- package/schemas/plugins/BannerPlugin.json +96 -96
- package/schemas/plugins/DllPlugin.json +32 -32
- package/schemas/plugins/DllReferencePlugin.json +99 -99
- package/schemas/plugins/HashedModuleIdsPlugin.json +24 -24
- package/schemas/plugins/LoaderOptionsPlugin.json +26 -26
- package/schemas/plugins/SourceMapDevToolPlugin.json +187 -187
- package/schemas/plugins/WatchIgnorePlugin.json +16 -16
- package/schemas/plugins/debug/ProfilingPlugin.json +12 -12
- package/schemas/plugins/optimize/AggressiveSplittingPlugin.json +22 -22
- package/schemas/plugins/optimize/LimitChunkCountPlugin.json +15 -15
- package/schemas/plugins/optimize/MinChunkSizePlugin.json +13 -13
- package/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json +10 -0
- package/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json +10 -0
@@ -1,70 +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;
|
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;
|
@@ -1,99 +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;
|
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;
|
@@ -1,66 +1,66 @@
|
|
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
|
-
|
10
|
-
class LimitChunkCountPlugin {
|
11
|
-
constructor(options) {
|
12
|
-
validateOptions(schema, options || {}, "Limit Chunk Count Plugin");
|
13
|
-
this.options = options || {};
|
14
|
-
}
|
15
|
-
apply(compiler) {
|
16
|
-
const options = this.options;
|
17
|
-
compiler.hooks.compilation.tap("LimitChunkCountPlugin", compilation => {
|
18
|
-
compilation.hooks.optimizeChunksAdvanced.tap(
|
19
|
-
"LimitChunkCountPlugin",
|
20
|
-
chunks => {
|
21
|
-
const maxChunks = options.maxChunks;
|
22
|
-
if (!maxChunks) return;
|
23
|
-
if (maxChunks < 1) return;
|
24
|
-
if (chunks.length <= maxChunks) return;
|
25
|
-
|
26
|
-
const sortedExtendedPairCombinations = chunks
|
27
|
-
.reduce((combinations, a, idx) => {
|
28
|
-
// create combination pairs
|
29
|
-
for (let i = 0; i < idx; i++) {
|
30
|
-
const b = chunks[i];
|
31
|
-
combinations.push([b, a]);
|
32
|
-
}
|
33
|
-
return combinations;
|
34
|
-
}, [])
|
35
|
-
.map(pair => {
|
36
|
-
// extend combination pairs with size and integrated size
|
37
|
-
const a = pair[0].size(options);
|
38
|
-
const b = pair[1].size(options);
|
39
|
-
const ab = pair[0].integratedSize(pair[1], options);
|
40
|
-
return [a + b - ab, ab, pair[0], pair[1], a, b];
|
41
|
-
})
|
42
|
-
.filter(extendedPair => {
|
43
|
-
// filter pairs that do not have an integratedSize
|
44
|
-
// meaning they can NOT be integrated!
|
45
|
-
return extendedPair[1] !== false;
|
46
|
-
})
|
47
|
-
.sort((a, b) => {
|
48
|
-
// sadly javascript does an inplace sort here
|
49
|
-
// sort them by size
|
50
|
-
const diff = b[0] - a[0];
|
51
|
-
if (diff !== 0) return diff;
|
52
|
-
return a[1] - b[1];
|
53
|
-
});
|
54
|
-
|
55
|
-
const pair = sortedExtendedPairCombinations[0];
|
56
|
-
|
57
|
-
if (pair && pair[2].integrate(pair[3], "limit")) {
|
58
|
-
chunks.splice(chunks.indexOf(pair[3]), 1);
|
59
|
-
return true;
|
60
|
-
}
|
61
|
-
}
|
62
|
-
);
|
63
|
-
});
|
64
|
-
}
|
65
|
-
}
|
66
|
-
module.exports = LimitChunkCountPlugin;
|
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
|
+
|
10
|
+
class LimitChunkCountPlugin {
|
11
|
+
constructor(options) {
|
12
|
+
validateOptions(schema, options || {}, "Limit Chunk Count Plugin");
|
13
|
+
this.options = options || {};
|
14
|
+
}
|
15
|
+
apply(compiler) {
|
16
|
+
const options = this.options;
|
17
|
+
compiler.hooks.compilation.tap("LimitChunkCountPlugin", compilation => {
|
18
|
+
compilation.hooks.optimizeChunksAdvanced.tap(
|
19
|
+
"LimitChunkCountPlugin",
|
20
|
+
chunks => {
|
21
|
+
const maxChunks = options.maxChunks;
|
22
|
+
if (!maxChunks) return;
|
23
|
+
if (maxChunks < 1) return;
|
24
|
+
if (chunks.length <= maxChunks) return;
|
25
|
+
|
26
|
+
const sortedExtendedPairCombinations = chunks
|
27
|
+
.reduce((combinations, a, idx) => {
|
28
|
+
// create combination pairs
|
29
|
+
for (let i = 0; i < idx; i++) {
|
30
|
+
const b = chunks[i];
|
31
|
+
combinations.push([b, a]);
|
32
|
+
}
|
33
|
+
return combinations;
|
34
|
+
}, [])
|
35
|
+
.map(pair => {
|
36
|
+
// extend combination pairs with size and integrated size
|
37
|
+
const a = pair[0].size(options);
|
38
|
+
const b = pair[1].size(options);
|
39
|
+
const ab = pair[0].integratedSize(pair[1], options);
|
40
|
+
return [a + b - ab, ab, pair[0], pair[1], a, b];
|
41
|
+
})
|
42
|
+
.filter(extendedPair => {
|
43
|
+
// filter pairs that do not have an integratedSize
|
44
|
+
// meaning they can NOT be integrated!
|
45
|
+
return extendedPair[1] !== false;
|
46
|
+
})
|
47
|
+
.sort((a, b) => {
|
48
|
+
// sadly javascript does an inplace sort here
|
49
|
+
// sort them by size
|
50
|
+
const diff = b[0] - a[0];
|
51
|
+
if (diff !== 0) return diff;
|
52
|
+
return a[1] - b[1];
|
53
|
+
});
|
54
|
+
|
55
|
+
const pair = sortedExtendedPairCombinations[0];
|
56
|
+
|
57
|
+
if (pair && pair[2].integrate(pair[3], "limit")) {
|
58
|
+
chunks.splice(chunks.indexOf(pair[3]), 1);
|
59
|
+
return true;
|
60
|
+
}
|
61
|
+
}
|
62
|
+
);
|
63
|
+
});
|
64
|
+
}
|
65
|
+
}
|
66
|
+
module.exports = LimitChunkCountPlugin;
|
@@ -1,78 +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;
|
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;
|