123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- "use strict";
- const { STAGE_BASIC } = require("../OptimizationStages");
- const { runtimeEqual } = require("../util/runtime");
- class MergeDuplicateChunksPlugin {
-
- apply(compiler) {
- compiler.hooks.compilation.tap(
- "MergeDuplicateChunksPlugin",
- compilation => {
- compilation.hooks.optimizeChunks.tap(
- {
- name: "MergeDuplicateChunksPlugin",
- stage: STAGE_BASIC
- },
- chunks => {
- const { chunkGraph, moduleGraph } = compilation;
-
- const notDuplicates = new Set();
-
- for (const chunk of chunks) {
-
- let possibleDuplicates;
- for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
- if (possibleDuplicates === undefined) {
-
-
-
- for (const dup of chunkGraph.getModuleChunksIterable(
- module
- )) {
- if (
- dup !== chunk &&
- chunkGraph.getNumberOfChunkModules(chunk) ===
- chunkGraph.getNumberOfChunkModules(dup) &&
- !notDuplicates.has(dup)
- ) {
-
- if (possibleDuplicates === undefined) {
- possibleDuplicates = new Set();
- }
- possibleDuplicates.add(dup);
- }
- }
-
- if (possibleDuplicates === undefined) break;
- } else {
-
- for (const dup of possibleDuplicates) {
-
- if (!chunkGraph.isModuleInChunk(module, dup)) {
- possibleDuplicates.delete(dup);
- }
- }
-
- if (possibleDuplicates.size === 0) break;
- }
- }
-
- if (
- possibleDuplicates !== undefined &&
- possibleDuplicates.size > 0
- ) {
- outer: for (const otherChunk of possibleDuplicates) {
- if (otherChunk.hasRuntime() !== chunk.hasRuntime()) continue;
- if (chunkGraph.getNumberOfEntryModules(chunk) > 0) continue;
- if (chunkGraph.getNumberOfEntryModules(otherChunk) > 0)
- continue;
- if (!runtimeEqual(chunk.runtime, otherChunk.runtime)) {
- for (const module of chunkGraph.getChunkModulesIterable(
- chunk
- )) {
- const exportsInfo = moduleGraph.getExportsInfo(module);
- if (
- !exportsInfo.isEquallyUsed(
- chunk.runtime,
- otherChunk.runtime
- )
- ) {
- continue outer;
- }
- }
- }
-
- if (chunkGraph.canChunksBeIntegrated(chunk, otherChunk)) {
- chunkGraph.integrateChunks(chunk, otherChunk);
- compilation.chunks.delete(otherChunk);
- }
- }
- }
-
- notDuplicates.add(chunk);
- }
- }
- );
- }
- );
- }
- }
- module.exports = MergeDuplicateChunksPlugin;
|