Skip to content

Commit

Permalink
initialize skippedItems lazy and store modules instead of queue items
Browse files Browse the repository at this point in the history
  • Loading branch information
sokra committed Jan 29, 2020
1 parent e66b51b commit 9a5e3c4
Showing 1 changed file with 43 additions and 40 deletions.
83 changes: 43 additions & 40 deletions lib/buildChunkGraph.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ const { connectChunkGroupParentAndChild } = require("./GraphHelpers");
* @property {Set<Module>} minAvailableModules current minimal set of modules available at this point
* @property {boolean} minAvailableModulesOwned true, if minAvailableModules is owned and can be modified
* @property {Set<Module>[]} availableModulesToBeMerged enqueued updates to the minimal set of available modules
* @property {QueueItem[]} skippedItems queue items that were skipped because module is already available in parent chunks (need to reconsider when minAvailableModules is shrinking)
* @property {Set<Module>=} skippedItems modules that were skipped because module is already available in parent chunks (need to reconsider when minAvailableModules is shrinking)
* @property {Set<Module>} resultingAvailableModules set of modules available including modules from this chunk group
* @property {Set<ChunkGroupInfo>} children set of children chunk groups, that will be revisited when availableModules shrink
* @property {number} preOrderIndex next pre order index
Expand Down Expand Up @@ -173,7 +173,7 @@ const visitModules = (
minAvailableModules: new Set(),
minAvailableModulesOwned: true,
availableModulesToBeMerged: [],
skippedItems: [],
skippedItems: undefined,
resultingAvailableModules: undefined,
children: undefined,
preOrderIndex: 0,
Expand Down Expand Up @@ -212,6 +212,11 @@ const visitModules = (

logger.timeEnd("visitModules: prepare");

/** @type {Module[]} */
const skipBuffer = [];
/** @type {QueueItem[]} */
const queueBuffer = [];

/** @type {Module} */
let module;
/** @type {Chunk} */
Expand All @@ -222,10 +227,6 @@ const visitModules = (
let block;
/** @type {ChunkGroupInfo} */
let chunkGroupInfo;
/** @type {Set<Module>} */
let minAvailableModules;
/** @type {QueueItem[]} */
let skippedItems;

// For each async Block in graph
/**
Expand Down Expand Up @@ -254,7 +255,7 @@ const visitModules = (
minAvailableModules: undefined,
minAvailableModulesOwned: undefined,
availableModulesToBeMerged: [],
skippedItems: [],
skippedItems: undefined,
resultingAvailableModules: undefined,
children: undefined,
preOrderIndex: 0,
Expand Down Expand Up @@ -318,22 +319,20 @@ const visitModules = (
block = queueItem.block;
chunk = queueItem.chunk;
chunkGroup = queueItem.chunkGroup;
if (chunkGroupInfo !== queueItem.chunkGroupInfo) {
chunkGroupInfo = queueItem.chunkGroupInfo;
minAvailableModules = chunkGroupInfo.minAvailableModules;
skippedItems = chunkGroupInfo.skippedItems;
}
chunkGroupInfo = queueItem.chunkGroupInfo;

switch (queueItem.action) {
case ADD_AND_ENTER_MODULE: {
if (chunkGraph.isModuleInChunk(module, chunk)) {
// already connected, skip it
break;
}
if (minAvailableModules.has(module)) {
if (chunkGroupInfo.minAvailableModules.has(module)) {
// already in parent chunks
// skip it for now, but enqueue for rechecking when minAvailableModules shrinks
skippedItems.push(queueItem);
if (chunkGroupInfo.skippedItems === undefined)
chunkGroupInfo.skippedItems = new Set();
chunkGroupInfo.skippedItems.add(module);
break;
}
// We connect Module and Chunk
Expand Down Expand Up @@ -368,11 +367,8 @@ const visitModules = (
const blockModules = blockModulesMap.get(block);

if (blockModules !== undefined) {
const { minAvailableModules } = chunkGroupInfo;
// Buffer items because order need to be reversed to get indices correct
/** @type {QueueItem[]} */
const skipBuffer = [];
/** @type {QueueItem[]} */
const queueBuffer = [];
// Traverse all referenced modules
for (const refModule of blockModules) {
if (chunkGraph.isModuleInChunk(refModule, chunk)) {
Expand All @@ -381,14 +377,7 @@ const visitModules = (
}
if (minAvailableModules.has(refModule)) {
// already in parent chunks, skip it for now
skipBuffer.push({
action: ADD_AND_ENTER_MODULE,
block: refModule,
module: refModule,
chunk,
chunkGroup,
chunkGroupInfo
});
skipBuffer.push(refModule);
continue;
}
// enqueue, then add and enter to be in the correct order
Expand All @@ -403,11 +392,21 @@ const visitModules = (
});
}
// Add buffered items in reverse order
for (let i = skipBuffer.length - 1; i >= 0; i--) {
skippedItems.push(skipBuffer[i]);
if (skipBuffer.length > 0) {
let { skippedItems } = chunkGroupInfo;
if (skippedItems === undefined) {
chunkGroupInfo.skippedItems = skippedItems = new Set();
}
for (let i = skipBuffer.length - 1; i >= 0; i--) {
skippedItems.add(skipBuffer[i]);
}
skipBuffer.length = 0;
}
for (let i = queueBuffer.length - 1; i >= 0; i--) {
queue.push(queueBuffer[i]);
if (queueBuffer.length > 0) {
for (let i = queueBuffer.length - 1; i >= 0; i--) {
queue.push(queueBuffer[i]);
}
queueBuffer.length = 0;
}
}

Expand Down Expand Up @@ -532,13 +531,6 @@ const visitModules = (
cachedMinAvailableModules = newSet;
info.minAvailableModulesOwned = true;
info.minAvailableModules = newSet;

// Update the cache from the first queue
// if the chunkGroup is currently cached
if (chunkGroup === info.chunkGroup) {
minAvailableModules = cachedMinAvailableModules;
}

changed = true;
break;
}
Expand All @@ -550,10 +542,21 @@ const visitModules = (
if (!changed) continue;

// 2. Reconsider skipped items
for (const queueItem of info.skippedItems) {
queue.push(queueItem);
if (info.skippedItems !== undefined) {
for (const module of info.skippedItems) {
if (!cachedMinAvailableModules.has(module)) {
queue.push({
action: ADD_AND_ENTER_MODULE,
block: module,
module,
chunk: info.chunkGroup.chunks[0],
chunkGroup: info.chunkGroup,
chunkGroupInfo: info
});
info.skippedItems.delete(module);
}
}
}
info.skippedItems.length = 0;

// 3. Reconsider children chunk groups
if (info.children !== undefined) {
Expand Down

0 comments on commit 9a5e3c4

Please sign in to comment.