diff --git a/docs/guide/api-javascript.md b/docs/guide/api-javascript.md index 1ff419058f2706..54b1dd0fa2be43 100644 --- a/docs/guide/api-javascript.md +++ b/docs/guide/api-javascript.md @@ -38,6 +38,41 @@ const __dirname = fileURLToPath(new URL('.', import.meta.url)) 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. ::: +::: tip NOTE +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. + +
+Example + +```ts +import http from 'http' +import { createServer } from 'vite' + +const parentServer = http.createServer() // or express, koa, etc. + +const vite = await createServer({ + server: { + // Enable middleware mode + middlewareMode: { + // Provide the parent http server for proxy WebSocket + server: parentServer, + }, + }, + proxy: { + '/ws': { + target: 'ws://localhost:3000', + // Proxying WebSocket + ws: true, + }, + }, +}) + +server.use(vite.middlewares) +``` + +
+::: + ## `InlineConfig` The `InlineConfig` interface extends `UserConfig` with additional properties: diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index 8620826f7674fc..8e4483659ff3e0 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -27,6 +27,7 @@ import { isDepsOptimizerEnabled, resolveConfig } from '../config' import { diffDnsOrderChange, isInNodeModules, + isObject, isParentDirectory, mergeConfig, normalizePath, @@ -111,7 +112,16 @@ export interface ServerOptions extends CommonServerOptions { * Create Vite dev server to be used as a middleware in an existing server * @default false */ - middlewareMode?: boolean + middlewareMode?: + | boolean + | { + /** + * Parent server instance to attach to + * + * This is needed to proxy WebSocket connections to the parent server. + */ + server: http.Server + } /** * Options for files served via '/\@fs/'. */ @@ -691,7 +701,11 @@ export async function _createServer( // proxy const { proxy } = serverConfig if (proxy) { - middlewares.use(proxyMiddleware(httpServer, proxy, config)) + const middlewareServer = + (isObject(serverConfig.middlewareMode) + ? serverConfig.middlewareMode.server + : null) || httpServer + middlewares.use(proxyMiddleware(middlewareServer, proxy, config)) } // base