Skip to content

Commit 2a0c16e

Browse files
fix: do not crash when a referenced chunk is not a runtime chunk (#20461)
1 parent 2ccdc02 commit 2a0c16e

File tree

7 files changed

+85
-6
lines changed

7 files changed

+85
-6
lines changed

.changeset/gold-pans-cross.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"webpack": patch
3+
---
4+
5+
Do not crash when a referenced chunk is not a runtime chunk.

lib/Compilation.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4531,12 +4531,14 @@ Or do you want to use the entrypoints '${name}' and '${runtime}' independently o
45314531
(e) => e.chunks[e.chunks.length - 1]
45324532
)
45334533
)) {
4534-
const otherInfo =
4535-
/** @type {RuntimeChunkInfo} */
4536-
(runtimeChunksMap.get(other));
4537-
otherInfo.referencedBy.push(info);
4538-
info.remaining++;
4539-
remaining++;
4534+
const otherInfo = runtimeChunksMap.get(other);
4535+
// other may be a non-runtime chunk (e.g. worker chunk)
4536+
// when you have a worker chunk in your app.js (new Worker(...)) and as a separate entry point
4537+
if (otherInfo) {
4538+
otherInfo.referencedBy.push(info);
4539+
info.remaining++;
4540+
remaining++;
4541+
}
45404542
}
45414543
}
45424544
/** @type {Chunk[]} */
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { Worker } from "worker_threads";
2+
3+
it("should build and run when worker is an entry and using via `new Worker(...)`", async () => {
4+
const worker = new Worker(
5+
/* webpackChunkName: "my-worker" */ new URL("./worker.js", import.meta.url)
6+
);
7+
worker.postMessage({ data: "ping" });
8+
const result = await new Promise(resolve => {
9+
worker.on("message", event => {
10+
resolve(event.data);
11+
});
12+
});
13+
expect(result).toBe("pong");
14+
await worker.terminate();
15+
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"use strict";
2+
3+
module.exports = {
4+
findBundle(i, options) {
5+
return ["app.js"];
6+
}
7+
};
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"use strict";
2+
3+
const supportsWorker = require("../../../helpers/supportsWorker");
4+
5+
module.exports = () => supportsWorker();
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"use strict";
2+
3+
/** @typedef {import("../../../../").Module} Module */
4+
5+
/** @type {import("../../../../").Configuration} */
6+
module.exports = {
7+
target: "node",
8+
entry: {
9+
app: "./app.js",
10+
"my-worker": "./worker.js"
11+
},
12+
output: {
13+
filename: "[name].js",
14+
environment: {
15+
nodePrefixForCoreModules: false
16+
}
17+
},
18+
optimization: {
19+
runtimeChunk: { name: "runtime" },
20+
splitChunks: {
21+
cacheGroups: {
22+
vendor: {
23+
/**
24+
* @param {Module} mod module
25+
* @returns {string | boolean | null} result
26+
*/
27+
test(mod) {
28+
return mod.context && mod.context.includes("node_modules");
29+
},
30+
chunks: "all",
31+
name: "vendor",
32+
priority: 10,
33+
enforce: true
34+
}
35+
}
36+
}
37+
}
38+
};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { parentPort } from "worker_threads";
2+
3+
if (parentPort) {
4+
parentPort.on("message", event => {
5+
parentPort.postMessage(event.data === "ping" ? { data: "pong" } : { data: "unexpected" });
6+
});
7+
}

0 commit comments

Comments
 (0)