123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
-
- class MergeDuplicateChunksPlugin {
- apply(compiler) {
- compiler.hooks.compilation.tap(
- "MergeDuplicateChunksPlugin",
- compilation => {
- compilation.hooks.optimizeChunksBasic.tap(
- "MergeDuplicateChunksPlugin",
- chunks => {
- // remember already tested chunks for performance
- const notDuplicates = new Set();
-
- // for each chunk
- for (const chunk of chunks) {
- // track a Set of all chunk that could be duplicates
- let possibleDuplicates;
- for (const module of chunk.modulesIterable) {
- if (possibleDuplicates === undefined) {
- // when possibleDuplicates is not yet set,
- // create a new Set from chunks of the current module
- // including only chunks with the same number of modules
- for (const dup of module.chunksIterable) {
- if (
- dup !== chunk &&
- chunk.getNumberOfModules() === dup.getNumberOfModules() &&
- !notDuplicates.has(dup)
- ) {
- // delay allocating the new Set until here, reduce memory pressure
- if (possibleDuplicates === undefined) {
- possibleDuplicates = new Set();
- }
- possibleDuplicates.add(dup);
- }
- }
- // when no chunk is possible we can break here
- if (possibleDuplicates === undefined) break;
- } else {
- // validate existing possible duplicates
- for (const dup of possibleDuplicates) {
- // remove possible duplicate when module is not contained
- if (!dup.containsModule(module)) {
- possibleDuplicates.delete(dup);
- }
- }
- // when all chunks has been removed we can break here
- if (possibleDuplicates.size === 0) break;
- }
- }
-
- // when we found duplicates
- if (
- possibleDuplicates !== undefined &&
- possibleDuplicates.size > 0
- ) {
- for (const otherChunk of possibleDuplicates) {
- if (otherChunk.hasRuntime() !== chunk.hasRuntime()) continue;
- // merge them
- if (chunk.integrate(otherChunk, "duplicate")) {
- chunks.splice(chunks.indexOf(otherChunk), 1);
- }
- }
- }
-
- // don't check already processed chunks twice
- notDuplicates.add(chunk);
- }
- }
- );
- }
- );
- }
- }
- module.exports = MergeDuplicateChunksPlugin;
|