Files
Jim Geurts 23dd15f763 fix(prod-server): stop double-evaluating the server bundle when chunks import the entry back (#1924)
* fix(prod-server): stop double-evaluating the server bundle when chunks import the entry back

The production server imported the built server entry with a ?t=<mtime>
query string. Node keys its ESM cache on the full URL including the query,
so any code-split chunk that resolves the same entry file by its plain URL
evaluated the entire server bundle a second time. Default Vite builds on
both supported majors (Rollup on Vite 7, Rolldown on Vite 8) hoist modules
shared between the entry's static graph and lazy route chunks into the
entry chunk, and the chunks import them back as ../../index.js; realpath-
canonicalized chunk ids also reach the entry via its real path when the
server was started through a symlinked path. Module-level singletons then
diverged between the two copies: boot-time initialization ran on the
instance the server imported while route handlers read the never-
initialized duplicate.

Import the entry by its bare canonical (realpathed) file:// URL on first
use so all importers converge on one module instance, and only append the
?t= cache-buster when the same path is imported again with a different
mtime — the same-process rebuild scenario the query existed for.

* docs(prod-server): clarify rebuild-branch tradeoff and probe constraints (#1924)

- note in resolveServerEntryImportUrl's JSDoc that the ?t= rebuild branch
  trades back the single-instance guarantee (bare chunk back-imports keep
  resolving to the first build); freshness + single instance only hold
  together on the first import of a path
- clarify the realpath try/catch only covers realpathSync.native failures,
  not missing entry paths (those still throw at statSync, as before)
- document that the prod-singleton-state fixture probe is only valid on a
  freshly built output path
2026-06-11 22:59:32 +01:00
..