保誠-保戶業務員媒合平台
Tomas
2022-05-19 957a1f10a06fdbb76f1a0ba94fe44126c613fee3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
    MIT License http://www.opensource.org/licenses/mit-license.php
    Author Tobias Koppers @sokra
*/
"use strict";
 
class AggressiveMergingPlugin {
    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(compiler) {
        const options = this.options;
        const minSizeReduce = options.minSizeReduce || 1.5;
 
        compiler.hooks.thisCompilation.tap(
            "AggressiveMergingPlugin",
            compilation => {
                compilation.hooks.optimizeChunksAdvanced.tap(
                    "AggressiveMergingPlugin",
                    chunks => {
                        let combinations = [];
                        chunks.forEach((a, idx) => {
                            if (a.canBeInitial()) return;
                            for (let i = 0; i < idx; i++) {
                                const b = chunks[i];
                                if (b.canBeInitial()) continue;
                                combinations.push({
                                    a,
                                    b,
                                    improvement: undefined
                                });
                            }
                        });
 
                        for (const pair of combinations) {
                            const a = pair.b.size({
                                chunkOverhead: 0
                            });
                            const b = pair.a.size({
                                chunkOverhead: 0
                            });
                            const ab = pair.b.integratedSize(pair.a, {
                                chunkOverhead: 0
                            });
                            let newSize;
                            if (ab === false) {
                                pair.improvement = false;
                                return;
                            } else {
                                newSize = ab;
                            }
 
                            pair.improvement = (a + b) / newSize;
                        }
                        combinations = combinations.filter(pair => {
                            return pair.improvement !== false;
                        });
                        combinations.sort((a, b) => {
                            return b.improvement - a.improvement;
                        });
 
                        const pair = combinations[0];
 
                        if (!pair) return;
                        if (pair.improvement < minSizeReduce) return;
 
                        if (pair.b.integrate(pair.a, "aggressive-merge")) {
                            chunks.splice(chunks.indexOf(pair.a), 1);
                            return true;
                        }
                    }
                );
            }
        );
    }
}
 
module.exports = AggressiveMergingPlugin;