Skip to content

Nuxt Prerendering silently stalls on 2.1.0, build exits 0, no .output/server #2297

Description

@lucpotage

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

"@nuxt/image": "2.0.0"

→ prerender completes, .output/server/ is built normally:

[nitro] ℹ Prerendered N routes in Xs
[nitro] ✔ Nuxt Nitro server built

Configuration that does NOT work

"@nuxt/image": "2.1.0"

→ 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions