Skip to content

Commit d7cba46

Browse files
brilloutbenmccann
andauthored
feat: spa option, preview and dev for MPA and SSR apps (#8217)
Co-authored-by: Ben McCann <[email protected]>
1 parent 015ebed commit d7cba46

File tree

5 files changed

+35
-4
lines changed

5 files changed

+35
-4
lines changed

docs/config/index.md

+7
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,13 @@ export default defineConfig(({ command, mode }) => {
462462
`envPrefix` should not be set as `''`, which will expose all your env variables and cause unexpected leaking of of sensitive information. Vite will throw error when detecting `''`.
463463
:::
464464

465+
### spa
466+
467+
- **Type:** `boolean`
468+
- **Default:** `true`
469+
470+
Whether your application is a Single Page Application (SPA). Set to `false` for other kinds of apps like MPAs. Learn more in Vite's [SSR guide](/guide/ssr#vite-cli).
471+
465472
## Server Options
466473

467474
### server.host

docs/guide/ssr.md

+11
Original file line numberDiff line numberDiff line change
@@ -264,3 +264,14 @@ In some cases like `webworker` runtimes, you might want to bundle your SSR build
264264
265265
- Treat all dependencies as `noExternal`
266266
- Throw an error if any Node.js built-ins are imported
267+
268+
## Vite CLI
269+
270+
The CLI commands `$ vite dev` and `$ vite preview` can also be used for SSR apps:
271+
272+
1. Add your SSR middleware to the development server with [`configureServer`](/guide/api-plugin#configureserver) and to the preview server with [`configurePreviewServer`](/guide/api-plugin#configurepreviewserver).
273+
:::tip Note
274+
Use a post hook so that your SSR middleware runs _after_ Vite's middlewares.
275+
:::
276+
277+
2. Set `config.spa` to `false`. This switches the development and preview server from SPA mode to SSR/MPA mode.

packages/vite/src/node/config.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,12 @@ export interface UserConfig {
208208
'plugins' | 'input' | 'onwarn' | 'preserveEntrySignatures'
209209
>
210210
}
211+
/**
212+
* Whether your application is a Single Page Application (SPA). Set to `false`
213+
* for other kinds of apps like MPAs.
214+
* @default true
215+
*/
216+
spa?: boolean
211217
}
212218

213219
export interface ExperimentalOptions {
@@ -274,6 +280,7 @@ export type ResolvedConfig = Readonly<
274280
/** @internal */
275281
packageCache: PackageCache
276282
worker: ResolveWorkerOptions
283+
spa: boolean
277284
}
278285
>
279286

@@ -514,7 +521,8 @@ export async function resolveConfig(
514521
...optimizeDeps.esbuildOptions
515522
}
516523
},
517-
worker: resolvedWorkerOptions
524+
worker: resolvedWorkerOptions,
525+
spa: config.spa ?? true
518526
}
519527

520528
// flat config.worker.plugin

packages/vite/src/node/preview.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ export async function preview(
104104
sirv(distDir, {
105105
etag: true,
106106
dev: true,
107-
single: true
107+
single: config.spa
108108
})
109109
)
110110

packages/vite/src/node/server/index.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -508,8 +508,10 @@ export async function createServer(
508508
middlewares.use(serveRawFsMiddleware(server))
509509
middlewares.use(serveStaticMiddleware(root, server))
510510

511+
const isMiddlewareMode = middlewareMode && middlewareMode !== 'html'
512+
511513
// spa fallback
512-
if (!middlewareMode || middlewareMode === 'html') {
514+
if (config.spa && !isMiddlewareMode) {
513515
middlewares.use(spaFallbackMiddleware(root))
514516
}
515517

@@ -518,9 +520,12 @@ export async function createServer(
518520
// serve custom content instead of index.html.
519521
postHooks.forEach((fn) => fn && fn())
520522

521-
if (!middlewareMode || middlewareMode === 'html') {
523+
if (config.spa && !isMiddlewareMode) {
522524
// transform index.html
523525
middlewares.use(indexHtmlMiddleware(server))
526+
}
527+
528+
if (!isMiddlewareMode) {
524529
// handle 404s
525530
// Keep the named function. The name is visible in debug logs via `DEBUG=connect:dispatcher ...`
526531
middlewares.use(function vite404Middleware(_, res) {

0 commit comments

Comments
 (0)