{"record":{"id":"1c01e8505bed1a17","repo":"remix-run/react-router","slug":"prerender-no-resolved-url-is-available-from-the-v","errorCode":null,"errorMessage":"Prerender: No resolved URL is available from the Vite preview server","messagePattern":"Prerender: No resolved URL is available from the Vite preview server","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/react-router-dev/vite/plugins/prerender.ts","lineNumber":571,"sourceCode":"      configFile: viteConfig.configFile,\n      logLevel: \"silent\",\n      preview: {\n        port: 0,\n        open: false,\n      },\n    });\n  } catch (error) {\n    throw new Error(\"Prerender: Failed to start Vite preview server\", {\n      cause: error,\n    });\n  }\n}\n\nfunction getResolvedUrl(previewServer: Vite.PreviewServer): URL {\n  const baseUrl = previewServer.resolvedUrls?.local[0];\n\n  if (!baseUrl) {\n    throw new Error(\n      \"Prerender: No resolved URL is available from the Vite preview server\",\n    );\n  }\n\n  return new URL(baseUrl);\n}\n","sourceCodeStart":553,"sourceCodeEnd":578,"githubUrl":"https://github.com/remix-run/react-router/blob/6beaca39526d5716c3c112ebb0782765baa5a9ce/packages/react-router-dev/vite/plugins/prerender.ts#L553-L578","documentation":"After the preview server starts, the plugin reads `previewServer.resolvedUrls?.local[0]` to learn the base URL for prerender requests. If Vite reports no local resolved URL (empty array or undefined), there is no address to request and the plugin aborts. This is an exotic failure: the server started but did not report where it is listening.","triggerScenarios":"A Vite version or custom middleware stripping `resolvedUrls`; `preview.host`/`server.host` combos (e.g. only `remote` URLs resolved, empty `local`) so `local[0]` is undefined; a wrapped/patched preview server returned instead of a real `PreviewServer`.","commonSituations":"Pinning unusual Vite versions or forks; plugins that intercept preview server creation; exotic networking configs in containers where local URL resolution fails.","solutions":["Check `preview.host` / `server.host` in vite.config.ts and let Vite resolve a local URL (default host)","Align your Vite version with the one `@react-router/dev` declares as its peer","Remove plugins that wrap or replace the preview server lifecycle"],"exampleFix":"// before (vite.config.ts)\npreview: { host: 'example.test' }, // no local URL resolved\n\n// after\npreview: {}, // default localhost resolution","handlingStrategy":"validation","validationCode":"// After starting preview, verify a local URL is resolvable\nconst server = await vite.preview({ logLevel: 'silent' });\nif (!server.resolvedUrls?.local?.[0]) {\n  throw new Error('No local URL resolved — check preview.host config');\n}","typeGuard":"const hasLocalUrl = (s: { resolvedUrls?: { local?: string[] } } | null): s is { resolvedUrls: { local: [string, ...string[]] } } =>\n  !!s?.resolvedUrls?.local?.[0];","tryCatchPattern":"try {\n  await prerender({});\n} catch (e) {\n  if (e instanceof Error && e.message.includes('No resolved URL')) {\n    // remove custom preview.host/server.host overrides and retry\n  }\n}","preventionTips":["Leave preview host defaults untouched so Vite resolves a local URL","Don't wrap or replace the Vite preview server with custom middleware","Pin a standard Vite release rather than forks"],"tags":["prerender","ssg","vite","preview-server"],"backgroundTag":"vite-server-start-failed","analyzedSha":"6beaca39526d5716c3c112ebb0782765baa5a9ce","analyzedAt":"2026-08-18T18:04:14.938Z","contentChangedAt":"2026-08-18T18:04:14.938Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}