Skip to content

Commit

Permalink
add splitChunks.minSizeReduction
Browse files Browse the repository at this point in the history
  • Loading branch information
sokra committed Oct 19, 2021
1 parent 8e28305 commit 2faa56b
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 2 deletions.
12 changes: 12 additions & 0 deletions declarations/WebpackOptions.d.ts
Expand Up @@ -1828,6 +1828,10 @@ export interface OptimizationSplitChunksOptions {
* Minimal size for the created chunk.
*/
minSize?: OptimizationSplitChunksSizes;
/**
* Minimum size reduction due to the created chunk.
*/
minSizeReduction?: OptimizationSplitChunksSizes;
};
/**
* Sets the template for the filename for created chunks.
Expand Down Expand Up @@ -1874,6 +1878,10 @@ export interface OptimizationSplitChunksOptions {
* Minimal size for the created chunks.
*/
minSize?: OptimizationSplitChunksSizes;
/**
* Minimum size reduction due to the created chunk.
*/
minSizeReduction?: OptimizationSplitChunksSizes;
/**
* Give chunks created a name (chunks with equal name are merged).
*/
Expand Down Expand Up @@ -1954,6 +1962,10 @@ export interface OptimizationSplitChunksCacheGroup {
* Minimal size for the created chunk.
*/
minSize?: OptimizationSplitChunksSizes;
/**
* Minimum size reduction due to the created chunk.
*/
minSizeReduction?: OptimizationSplitChunksSizes;
/**
* Give chunks for this cache group a name (chunks with equal name are merged).
*/
Expand Down
50 changes: 49 additions & 1 deletion lib/optimize/SplitChunksPlugin.js
Expand Up @@ -59,6 +59,7 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
* @property {ChunkFilterFunction=} chunksFilter
* @property {boolean=} enforce
* @property {SplitChunksSizes} minSize
* @property {SplitChunksSizes} minSizeReduction
* @property {SplitChunksSizes} minRemainingSize
* @property {SplitChunksSizes} enforceSizeThreshold
* @property {SplitChunksSizes} maxAsyncSize
Expand All @@ -80,6 +81,7 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
* @property {GetName=} getName
* @property {ChunkFilterFunction=} chunksFilter
* @property {SplitChunksSizes} minSize
* @property {SplitChunksSizes} minSizeReduction
* @property {SplitChunksSizes} minRemainingSize
* @property {SplitChunksSizes} enforceSizeThreshold
* @property {SplitChunksSizes} maxAsyncSize
Expand Down Expand Up @@ -132,6 +134,7 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
* @property {ChunkFilterFunction} chunksFilter
* @property {string[]} defaultSizeTypes
* @property {SplitChunksSizes} minSize
* @property {SplitChunksSizes} minSizeReduction
* @property {SplitChunksSizes} minRemainingSize
* @property {SplitChunksSizes} enforceSizeThreshold
* @property {SplitChunksSizes} maxInitialSize
Expand Down Expand Up @@ -336,6 +339,21 @@ const checkMinSize = (sizes, minSize) => {
return true;
};

/**
* @param {SplitChunksSizes} sizes the sizes
* @param {SplitChunksSizes} minSizeReduction the min sizes
* @param {number} chunkCount number of chunks
* @returns {boolean} true if there are sizes and all existing sizes are at least `minSizeReduction`
*/
const checkMinSizeReduction = (sizes, minSizeReduction, chunkCount) => {
for (const key of Object.keys(minSizeReduction)) {
const size = sizes[key];
if (size === undefined || size === 0) continue;
if (size * chunkCount < minSizeReduction[key]) return false;
}
return true;
};

/**
* @param {SplitChunksSizes} sizes the sizes
* @param {SplitChunksSizes} minSize the min sizes
Expand Down Expand Up @@ -548,6 +566,10 @@ const checkModuleLayer = (test, module) => {
*/
const createCacheGroupSource = (options, key, defaultSizeTypes) => {
const minSize = normalizeSizes(options.minSize, defaultSizeTypes);
const minSizeReduction = normalizeSizes(
options.minSizeReduction,
defaultSizeTypes
);
const maxSize = normalizeSizes(options.maxSize, defaultSizeTypes);
return {
key,
Expand All @@ -556,6 +578,7 @@ const createCacheGroupSource = (options, key, defaultSizeTypes) => {
chunksFilter: normalizeChunksFilter(options.chunks),
enforce: options.enforce,
minSize,
minSizeReduction,
minRemainingSize: mergeSizes(
normalizeSizes(options.minRemainingSize, defaultSizeTypes),
minSize
Expand Down Expand Up @@ -594,13 +617,18 @@ module.exports = class SplitChunksPlugin {
];
const fallbackCacheGroup = options.fallbackCacheGroup || {};
const minSize = normalizeSizes(options.minSize, defaultSizeTypes);
const minSizeReduction = normalizeSizes(
options.minSizeReduction,
defaultSizeTypes
);
const maxSize = normalizeSizes(options.maxSize, defaultSizeTypes);

/** @type {SplitChunksOptions} */
this.options = {
chunksFilter: normalizeChunksFilter(options.chunks || "all"),
defaultSizeTypes,
minSize,
minSizeReduction,
minRemainingSize: mergeSizes(
normalizeSizes(options.minRemainingSize, defaultSizeTypes),
minSize
Expand Down Expand Up @@ -668,6 +696,10 @@ module.exports = class SplitChunksPlugin {
cacheGroupSource.minSize,
cacheGroupSource.enforce ? undefined : this.options.minSize
);
const minSizeReduction = mergeSizes(
cacheGroupSource.minSizeReduction,
cacheGroupSource.enforce ? undefined : this.options.minSizeReduction
);
const minRemainingSize = mergeSizes(
cacheGroupSource.minRemainingSize,
cacheGroupSource.enforce ? undefined : this.options.minRemainingSize
Expand All @@ -681,6 +713,7 @@ module.exports = class SplitChunksPlugin {
priority: cacheGroupSource.priority || 0,
chunksFilter: cacheGroupSource.chunksFilter || this.options.chunksFilter,
minSize,
minSizeReduction,
minRemainingSize,
enforceSizeThreshold,
maxAsyncSize: mergeSizes(
Expand Down Expand Up @@ -1244,6 +1277,14 @@ module.exports = class SplitChunksPlugin {
for (const [key, info] of chunksInfoMap) {
if (removeMinSizeViolatingModules(info)) {
chunksInfoMap.delete(key);
} else if (
!checkMinSizeReduction(
info.sizes,
info.cacheGroup.minSizeReduction,
info.chunks.size
)
) {
chunksInfoMap.delete(key);
}
}

Expand Down Expand Up @@ -1531,7 +1572,14 @@ module.exports = class SplitChunksPlugin {
chunksInfoMap.delete(key);
continue;
}
if (removeMinSizeViolatingModules(info)) {
if (
removeMinSizeViolatingModules(info) ||
!checkMinSizeReduction(
info.sizes,
info.cacheGroup.minSizeReduction,
info.chunks.size
)
) {
chunksInfoMap.delete(key);
continue;
}
Expand Down
2 changes: 1 addition & 1 deletion schemas/WebpackOptions.check.js

Large diffs are not rendered by default.

24 changes: 24 additions & 0 deletions schemas/WebpackOptions.json
Expand Up @@ -2319,6 +2319,14 @@
}
]
},
"minSizeReduction": {
"description": "Minimum size reduction due to the created chunk.",
"oneOf": [
{
"$ref": "#/definitions/OptimizationSplitChunksSizes"
}
]
},
"name": {
"description": "Give chunks for this cache group a name (chunks with equal name are merged).",
"anyOf": [
Expand Down Expand Up @@ -2515,6 +2523,14 @@
"$ref": "#/definitions/OptimizationSplitChunksSizes"
}
]
},
"minSizeReduction": {
"description": "Minimum size reduction due to the created chunk.",
"oneOf": [
{
"$ref": "#/definitions/OptimizationSplitChunksSizes"
}
]
}
}
},
Expand Down Expand Up @@ -2591,6 +2607,14 @@
}
]
},
"minSizeReduction": {
"description": "Minimum size reduction due to the created chunk.",
"oneOf": [
{
"$ref": "#/definitions/OptimizationSplitChunksSizes"
}
]
},
"name": {
"description": "Give chunks created a name (chunks with equal name are merged).",
"anyOf": [
Expand Down
16 changes: 16 additions & 0 deletions types.d.ts
Expand Up @@ -631,6 +631,7 @@ declare interface CacheGroupSource {
chunksFilter?: (chunk: Chunk) => boolean;
enforce?: boolean;
minSize: SplitChunksSizes;
minSizeReduction: SplitChunksSizes;
minRemainingSize: SplitChunksSizes;
enforceSizeThreshold: SplitChunksSizes;
maxAsyncSize: SplitChunksSizes;
Expand Down Expand Up @@ -7808,6 +7809,11 @@ declare interface OptimizationSplitChunksCacheGroup {
*/
minSize?: number | { [index: string]: number };

/**
* Minimum size reduction due to the created chunk.
*/
minSizeReduction?: number | { [index: string]: number };

/**
* Give chunks for this cache group a name (chunks with equal name are merged).
*/
Expand Down Expand Up @@ -7899,6 +7905,10 @@ declare interface OptimizationSplitChunksOptions {
* Minimal size for the created chunk.
*/
minSize?: number | { [index: string]: number };
/**
* Minimum size reduction due to the created chunk.
*/
minSizeReduction?: number | { [index: string]: number };
};

/**
Expand Down Expand Up @@ -7951,6 +7961,11 @@ declare interface OptimizationSplitChunksOptions {
*/
minSize?: number | { [index: string]: number };

/**
* Minimum size reduction due to the created chunk.
*/
minSizeReduction?: number | { [index: string]: number };

/**
* Give chunks created a name (chunks with equal name are merged).
*/
Expand Down Expand Up @@ -10712,6 +10727,7 @@ declare interface SplitChunksOptions {
chunksFilter: (chunk: Chunk) => boolean;
defaultSizeTypes: string[];
minSize: SplitChunksSizes;
minSizeReduction: SplitChunksSizes;
minRemainingSize: SplitChunksSizes;
enforceSizeThreshold: SplitChunksSizes;
maxInitialSize: SplitChunksSizes;
Expand Down

0 comments on commit 2faa56b

Please sign in to comment.