-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Open
Description
For the workaround, see #399 (comment).
Consider the following code:
// entry1.js
import "./init-dep-1.js";
import "./run-dep.js";
// entry2.js
import "./init-dep-2.js";
import "./run-dep.js";
// init-dep-1.js
global.foo = {
log: () => console.log("foo.log() (from entry 1) called"),
};
// init-dep-2.js
global.foo = {
log: () => console.log("foo.log() (from entry 2) called"),
};
// run-dep.js
global.foo.log();When you bundle this code with esbuild --bundle --outdir=build --format=esm --splitting --platform=node --out-extension:.js=.mjs ./entry1.js ./entry2.js, ESBuild discovers that run-dep.js is a module shared between both entry points. Because code splitting is enabled, ESBuild moves it into a separate chunk:
// build/entry1.js
import "./chunk.P2RPFHF3.js";
global.foo = {
log: () => console.log("foo.log() (from entry 1) called")
};However, by doing so, ESBuild puts run-dep.js above the init-dep-1.js or init-dep-2.js code. This changes the import order – and breaks the code:
$ esbuild --bundle --outdir=build --format=esm --splitting --platform=node --out-extension:.js=.mjs ./entry1.js ./entry2.js
$ node build/entry1.mjs
global.foo.log();
^
TypeError: Cannot read property 'log' of undefinednvh, forberg, somebee, 2beers, blixt and 52 more
Metadata
Metadata
Assignees
Labels
No labels