Skip to content

Commit e0c86d4

Browse files
authored
feat: allow providing parent httpServer on middleware mode (#14632)
1 parent 58ff849 commit e0c86d4

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

docs/guide/api-javascript.md

+35
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,41 @@ const __dirname = fileURLToPath(new URL('.', import.meta.url))
3838
When using `createServer` and `build` in the same Node.js process, both functions rely on `process.env.NODE_ENV` to work properly, which also depends on the `mode` config option. To prevent conflicting behavior, set `process.env.NODE_ENV` or the `mode` of the two APIs to `development`. Otherwise, you can spawn a child process to run the APIs separately.
3939
:::
4040

41+
::: tip NOTE
42+
When using [middleware mode](/config/server-options.html#server-middlewaremode) combined with [proxy config for WebSocket](/config/server-options.html#server-proxy), the parent http server should be provided in `middlewareMode` to bind the proxy correctly.
43+
44+
<details>
45+
<summary>Example</summary>
46+
47+
```ts
48+
import http from 'http'
49+
import { createServer } from 'vite'
50+
51+
const parentServer = http.createServer() // or express, koa, etc.
52+
53+
const vite = await createServer({
54+
server: {
55+
// Enable middleware mode
56+
middlewareMode: {
57+
// Provide the parent http server for proxy WebSocket
58+
server: parentServer,
59+
},
60+
},
61+
proxy: {
62+
'/ws': {
63+
target: 'ws://localhost:3000',
64+
// Proxying WebSocket
65+
ws: true,
66+
},
67+
},
68+
})
69+
70+
server.use(vite.middlewares)
71+
```
72+
73+
</details>
74+
:::
75+
4176
## `InlineConfig`
4277

4378
The `InlineConfig` interface extends `UserConfig` with additional properties:

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

+16-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { isDepsOptimizerEnabled, resolveConfig } from '../config'
2828
import {
2929
diffDnsOrderChange,
3030
isInNodeModules,
31+
isObject,
3132
isParentDirectory,
3233
mergeConfig,
3334
normalizePath,
@@ -112,7 +113,16 @@ export interface ServerOptions extends CommonServerOptions {
112113
* Create Vite dev server to be used as a middleware in an existing server
113114
* @default false
114115
*/
115-
middlewareMode?: boolean
116+
middlewareMode?:
117+
| boolean
118+
| {
119+
/**
120+
* Parent server instance to attach to
121+
*
122+
* This is needed to proxy WebSocket connections to the parent server.
123+
*/
124+
server: http.Server
125+
}
116126
/**
117127
* Options for files served via '/\@fs/'.
118128
*/
@@ -694,7 +704,11 @@ export async function _createServer(
694704
// proxy
695705
const { proxy } = serverConfig
696706
if (proxy) {
697-
middlewares.use(proxyMiddleware(httpServer, proxy, config))
707+
const middlewareServer =
708+
(isObject(serverConfig.middlewareMode)
709+
? serverConfig.middlewareMode.server
710+
: null) || httpServer
711+
middlewares.use(proxyMiddleware(middlewareServer, proxy, config))
698712
}
699713

700714
// base

0 commit comments

Comments
 (0)