next.js
e9b96b41 - Build with dev runtimes when `--debug-prerender` is set (#89834)

Commit
5 days ago
Build with dev runtimes when `--debug-prerender` is set (#89834) When running `next build --debug-prerender`, React owner stacks are now captured and displayed in prerender error output. This makes it much easier to diagnose which component triggered uncached I/O or accessed request data without Suspense. Previously, `--debug-prerender` only enabled source maps and disabled minification. Now it also auto-enables `allowDevelopmentBuild` and sets `NODE_ENV=development`, which loads React development builds where `captureOwnerStack()` is available. The main challenge is that with `NODE_ENV=development`, both server and client bundles include dev-only code paths (HMR, WebSocket connections, dev overlay, debug channel, etc.) that expect a running dev server. We don't want these when using `next start`. To solve this, we introduce `process.env.__NEXT_DEV_SERVER`, an internal env var that is truthy only during `next dev`. In client bundles, it's inlined at build time (`'1'` for `next dev`, `''` for `next build`). In production server runtime bundles, it's inlined as `''` for dead-code elimination. In development server runtime bundles, it's left as a runtime check because those bundles are shared between `next dev` (where it's set) and `next build --debug-prerender` (where it's not). Meanwhile, `NODE_ENV` continues to control React's dev/prod mode and error formatting, which is exactly what we want for `--debug-prerender`. This also replaces the previous `renderOpts.dev` / `workStore.dev` pattern, which was unreliable because `RouteModule.isDev` was derived from `NODE_ENV` at compile time. When `allowDevelopmentBuild` set `NODE_ENV=development`, `isDev` would be compiled as `true` and incorrectly activate all dev guards during `next start`. Key changes: - `config.ts` auto-enables `allowDevelopmentBuild` and sets `NODE_ENV=development` when `--debug-prerender` is active - `define-env.ts` inlines `__NEXT_DEV_SERVER` into all bundles (truthy for dev, falsy for build) so dev-server features are dead-code eliminated in production and `--debug-prerender` builds - `next-dev.ts` and `next.ts` set `__NEXT_DEV_SERVER` in the process environment for externalized server-side code - `renderOpts.dev` and `workStore.dev` are removed — all consumers now use `__NEXT_DEV_SERVER` (for dev-server features) or `NODE_ENV` (for error formatting that should work in both dev and `--debug-prerender` builds) - `patch-error-inspect.ts` devirtualizes React server URLs in source map URLs so they display as readable file paths
Author
Parents
Loading