webpack/lib/optimize/EnsureChunkConditionsPlugin.js

73 lines
2.0 KiB
JavaScript
Raw Normal View History

/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
2018-07-27 04:43:20 +08:00
const {
connectChunkAndModule,
disconnectChunkAndModule
} = require("../GraphHelpers");
class EnsureChunkConditionsPlugin {
apply(compiler) {
2018-02-25 09:00:20 +08:00
compiler.hooks.compilation.tap(
"EnsureChunkConditionsPlugin",
compilation => {
const handler = chunks => {
let changed = false;
// These sets are hoisted here to save memory
// They are cleared at the end of every loop
const sourceChunks = new Set();
const chunkGroups = new Set();
2018-02-25 09:00:20 +08:00
for (const module of compilation.modules) {
for (const chunk of module.chunksIterable) {
if (!module.chunkCondition(chunk)) {
sourceChunks.add(chunk);
for (const group of chunk.groupsIterable) {
chunkGroups.add(group);
}
}
}
2018-02-25 09:00:20 +08:00
if (sourceChunks.size === 0) continue;
const targetChunks = new Set();
chunkGroupLoop: for (const chunkGroup of chunkGroups) {
// Can module be placed in a chunk of this group?
for (const chunk of chunkGroup.chunks) {
if (module.chunkCondition(chunk)) {
targetChunks.add(chunk);
continue chunkGroupLoop;
}
}
// We reached the entrypoint: fail
if (chunkGroup.isInitial()) {
throw new Error(
2018-02-26 10:30:14 +08:00
"Cannot fullfil chunk condition of " + module.identifier()
2018-02-25 09:00:20 +08:00
);
}
// Try placing in all parents
for (const group of chunkGroup.parentsIterable) {
chunkGroups.add(group);
}
}
2018-02-25 09:00:20 +08:00
for (const sourceChunk of sourceChunks) {
2018-07-27 04:43:20 +08:00
disconnectChunkAndModule(sourceChunk, module);
}
2018-02-25 09:00:20 +08:00
for (const targetChunk of targetChunks) {
2018-07-27 04:43:20 +08:00
connectChunkAndModule(targetChunk, module);
}
sourceChunks.clear();
chunkGroups.clear();
}
2018-02-25 09:00:20 +08:00
if (changed) return true;
};
compilation.hooks.optimizeChunksBasic.tap(
"EnsureChunkConditionsPlugin",
handler
);
}
);
}
}
module.exports = EnsureChunkConditionsPlugin;