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 undefined
Metadata
Metadata
Assignees
Labels
No labels