From aac43687fd5759026dc5c731867e4df163c79502 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 26 Jul 2018 16:51:02 +0200 Subject: [PATCH] fix case where empty chunkgroups cause nested chunkgroups to vanish --- lib/Compilation.js | 8 ++++++++ test/cases/chunks/nested-in-empty/a.js | 0 test/cases/chunks/nested-in-empty/b.js | 1 + test/cases/chunks/nested-in-empty/index.js | 13 +++++++++++++ 4 files changed, 22 insertions(+) create mode 100644 test/cases/chunks/nested-in-empty/a.js create mode 100644 test/cases/chunks/nested-in-empty/b.js create mode 100644 test/cases/chunks/nested-in-empty/index.js diff --git a/lib/Compilation.js b/lib/Compilation.js index 4171e60a920..03f62b6e057 100644 --- a/lib/Compilation.js +++ b/lib/Compilation.js @@ -1572,6 +1572,9 @@ class Compilation extends Tapable { /** @type {Map} */ const blockChunkGroups = new Map(); + /** @type {Set} */ + const blocksWithNestedBlocks = new Set(); + const ADD_AND_ENTER_MODULE = 0; const ENTER_MODULE = 1; const PROCESS_BLOCK = 2; @@ -1731,6 +1734,10 @@ class Compilation extends Tapable { // Traverse all Blocks iterationOfArrayCallback(blockInfo.blocks, iteratorBlock); + + if (blockInfo.blocks.length > 0 && module !== block) { + blocksWithNestedBlocks.add(block); + } break; } case LEAVE_MODULE: { @@ -1792,6 +1799,7 @@ class Compilation extends Tapable { */ const filterFn = dep => { const depChunkGroup = dep.chunkGroup; + if (blocksWithNestedBlocks.has(dep.block)) return true; if (areModulesAvailable(depChunkGroup, newAvailableModules)) return false; // break all modules are already available return true; }; diff --git a/test/cases/chunks/nested-in-empty/a.js b/test/cases/chunks/nested-in-empty/a.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/cases/chunks/nested-in-empty/b.js b/test/cases/chunks/nested-in-empty/b.js new file mode 100644 index 00000000000..888cae37af9 --- /dev/null +++ b/test/cases/chunks/nested-in-empty/b.js @@ -0,0 +1 @@ +module.exports = 42; diff --git a/test/cases/chunks/nested-in-empty/index.js b/test/cases/chunks/nested-in-empty/index.js new file mode 100644 index 00000000000..968e02795ca --- /dev/null +++ b/test/cases/chunks/nested-in-empty/index.js @@ -0,0 +1,13 @@ +it("should include a chunk nested in an empty chunk", (done) => { + require.ensure(["./a"], () => { + require.ensure([], () => { + require.ensure(["./a"], () => { + require.ensure([], () => { + const b = require("./b"); + expect(b).toBe(42); + done(); + }); + }); + }); + }); +});