summaryrefslogtreecommitdiff
path: root/node_modules/webpack/lib/optimize/AggressiveMergingPlugin.js
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-11-05 17:16:09 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-11-05 17:16:09 +0800
commitd1d9f00b1bd660842addf5e6b1d1b64c852a9eea (patch)
tree60fb37ae73a1109d95301de5ec9b61b5726a4b61 /node_modules/webpack/lib/optimize/AggressiveMergingPlugin.js
parent7c85166c4cbdd862fc4252007d2df5befcbc2a58 (diff)
added hover prefixer
Diffstat (limited to 'node_modules/webpack/lib/optimize/AggressiveMergingPlugin.js')
-rw-r--r--node_modules/webpack/lib/optimize/AggressiveMergingPlugin.js100
1 files changed, 100 insertions, 0 deletions
diff --git a/node_modules/webpack/lib/optimize/AggressiveMergingPlugin.js b/node_modules/webpack/lib/optimize/AggressiveMergingPlugin.js
new file mode 100644
index 00000000..e6f24919
--- /dev/null
+++ b/node_modules/webpack/lib/optimize/AggressiveMergingPlugin.js
@@ -0,0 +1,100 @@
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+ Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { STAGE_ADVANCED } = require("../OptimizationStages");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+
+/**
+ * @typedef {Object} AggressiveMergingPluginOptions
+ * @property {number=} minSizeReduce minimal size reduction to trigger merging
+ */
+
+class AggressiveMergingPlugin {
+ /**
+ * @param {AggressiveMergingPluginOptions=} [options] options object
+ */
+ constructor(options) {
+ if (
+ (options !== undefined && typeof options !== "object") ||
+ Array.isArray(options)
+ ) {
+ throw new Error(
+ "Argument should be an options object. To use defaults, pass in nothing.\nFor more info on options, see https://webpack.js.org/plugins/"
+ );
+ }
+ this.options = options || {};
+ }
+
+ /**
+ * Apply the plugin
+ * @param {Compiler} compiler the compiler instance
+ * @returns {void}
+ */
+ apply(compiler) {
+ const options = this.options;
+ const minSizeReduce = options.minSizeReduce || 1.5;
+
+ compiler.hooks.thisCompilation.tap(
+ "AggressiveMergingPlugin",
+ compilation => {
+ compilation.hooks.optimizeChunks.tap(
+ {
+ name: "AggressiveMergingPlugin",
+ stage: STAGE_ADVANCED
+ },
+ chunks => {
+ const chunkGraph = compilation.chunkGraph;
+ /** @type {{a: Chunk, b: Chunk, improvement: number}[]} */
+ let combinations = [];
+ for (const a of chunks) {
+ if (a.canBeInitial()) continue;
+ for (const b of chunks) {
+ if (b.canBeInitial()) continue;
+ if (b === a) break;
+ if (!chunkGraph.canChunksBeIntegrated(a, b)) {
+ continue;
+ }
+ const aSize = chunkGraph.getChunkSize(b, {
+ chunkOverhead: 0
+ });
+ const bSize = chunkGraph.getChunkSize(a, {
+ chunkOverhead: 0
+ });
+ const abSize = chunkGraph.getIntegratedChunksSize(b, a, {
+ chunkOverhead: 0
+ });
+ const improvement = (aSize + bSize) / abSize;
+ combinations.push({
+ a,
+ b,
+ improvement
+ });
+ }
+ }
+
+ combinations.sort((a, b) => {
+ return b.improvement - a.improvement;
+ });
+
+ const pair = combinations[0];
+
+ if (!pair) return;
+ if (pair.improvement < minSizeReduce) return;
+
+ chunkGraph.integrateChunks(pair.b, pair.a);
+ compilation.chunks.delete(pair.a);
+ return true;
+ }
+ );
+ }
+ );
+ }
+}
+
+module.exports = AggressiveMergingPlugin;