Environment
- Nuxt: 4.5.1
- @nuxt/image: 2.0.0 ✅ / 2.1.0 ❌
- nitropack: 2.13.4 (identical in both cases)
- Node: 24.18.1
- Package manager: pnpm
- OS: macOS (darwin arm64)
Prepared with Claude Code
Reproduction
Large statically-generated site (thousands of prerendered routes, several hundred
<NuxtImg>//_ipx/... routes), built with nitro.static: true (also reproduces
with an explicit prerender route list, not just crawlLinks).
With @nuxt/image@2.1.0, the prerender log stops mid-run with no error, and the
process exits 0:
[nitro] ├─ /_ipx/_/some-image.png (7ms)
<no further output — exit code 0>
Prerendered N routes in Xs is never printed
.output/server/ is never created (build() never runs)
- Deterministic: stops after the same number of routes on every run
Configuration that works
→ prerender completes, .output/server/ is built normally:
[nitro] ℹ Prerendered N routes in Xs
[nitro] ✔ Nuxt Nitro server built
Configuration that does NOT work
→ prerender silently stalls partway through, .output/server/ is missing. Every
other dependency and all config was kept byte-identical between the two runs.
Expected behavior
The build should either complete, or fail loudly (non-zero exit code / error).
Actual behavior
The build hangs and exits 0 as if it succeeded, producing an incomplete
.output/ with no server — CI reports green on a broken build.
Additional notes (suspected cause)
Diffing 2.0.0...2.1.0, the only prerender/IPX-relevant change is src/runtime/server/routes/_ipx.ts switching from ipx@^3.1.1's native H3 handler (createIPXH3Handler) to ipx@4.0.0-beta.1's createIPXNodeHandler, bridged through h3's fromNodeMiddleware. ipx v4's rewrite also dropped the try/catch that used to guarantee every request settled in v3. Nitro's prerender queue has no per-route timeout, so a request that never settles hangs the whole crawl silently — which matches what we see exactly.
ipx@4.0.0-beta.1 is still the latest ipx release (main is only 2 README commits ahead of that tag), so this isn't already fixed upstream.
Workaround: pin @nuxt/image to 2.0.0.
Environment
Prepared with Claude Code
Reproduction
Large statically-generated site (thousands of prerendered routes, several hundred
<NuxtImg>//_ipx/...routes), built withnitro.static: true(also reproduceswith an explicit prerender route list, not just
crawlLinks).With
@nuxt/image@2.1.0, the prerender log stops mid-run with no error, and theprocess exits 0:
Prerendered N routes in Xsis never printed.output/server/is never created (build()never runs)Configuration that works
→ prerender completes,
.output/server/is built normally:Configuration that does NOT work
→ prerender silently stalls partway through,
.output/server/is missing. Everyother dependency and all config was kept byte-identical between the two runs.
Expected behavior
The build should either complete, or fail loudly (non-zero exit code / error).
Actual behavior
The build hangs and exits
0as if it succeeded, producing an incomplete.output/with no server — CI reports green on a broken build.Additional notes (suspected cause)
Diffing 2.0.0...2.1.0, the only prerender/IPX-relevant change is
src/runtime/server/routes/_ipx.tsswitching fromipx@^3.1.1's native H3 handler (createIPXH3Handler) toipx@4.0.0-beta.1'screateIPXNodeHandler, bridged through h3'sfromNodeMiddleware.ipxv4's rewrite also dropped thetry/catchthat used to guarantee every request settled in v3. Nitro's prerender queue has no per-route timeout, so a request that never settles hangs the whole crawl silently — which matches what we see exactly.ipx@4.0.0-beta.1is still the latestipxrelease (mainis only 2 README commits ahead of that tag), so this isn't already fixed upstream.Workaround: pin
@nuxt/imageto2.0.0.