Skip to content

Commit

Permalink
feat: new hook configurePreviewServer
Browse files Browse the repository at this point in the history
  • Loading branch information
brillout committed Apr 9, 2022
1 parent 09c4fc0 commit 64e560e
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 0 deletions.
22 changes: 22 additions & 0 deletions docs/guide/api-plugin.md
Expand Up @@ -305,6 +305,28 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo

Note `configureServer` is not called when running the production build so your other hooks need to guard against its absence.

### `configurePreviewServer`

- **Type:** `(server: { middlewares: Connect.Server, httpServer: http.Server }) => (() => void) | void | Promise<(() => void) | void>`
- **Kind:** `async`, `sequential`

Same than [`configureServer`](/guide/api-plugin.html#configureserver) but for the preview server. It provides the [connect](https://github.com/senchalabs/connect) server and its underlying [http server](https://nodejs.org/api/http.html). Similarly to `configureServer`, the `configurePreviewServer` hook is called before other middlewares are installed. If you want to inject a middleware **after** other middlewares, you can return a function from `configurePreviewServer`, which will be called after internal middlewares are installed:

```js
const myPlugin = () => ({
name: 'configure-preview-server',
configurePreviewServer(server) {
// return a post hook that is called after other middlewares are
// installed
return () => {
server.middlewares.use((req, res, next) => {
// custom handle request...
})
}
}
})
```

### `transformIndexHtml`

- **Type:** `IndexHtmlTransformHook | { enforce?: 'pre' | 'post', transform: IndexHtmlTransformHook }`
Expand Down
1 change: 1 addition & 0 deletions packages/vite/src/node/index.ts
Expand Up @@ -33,6 +33,7 @@ export type {
export type {
PreviewOptions,
PreviewServer,
PreviewServerHook,
ResolvedPreviewOptions
} from './preview'
export type {
Expand Down
10 changes: 10 additions & 0 deletions packages/vite/src/node/plugin.ts
Expand Up @@ -13,6 +13,7 @@ import type { IndexHtmlTransform } from './plugins/html'
import type { ModuleNode } from './server/moduleGraph'
import type { ConfigEnv, ResolvedConfig } from './'
import type { HmrContext } from './server/hmr'
import type { PreviewServerHook } from './preview'

/**
* Vite plugins extends the Rollup plugin interface with a few extra
Expand Down Expand Up @@ -79,6 +80,15 @@ export interface Plugin extends RollupPlugin {
* are applied. Hook can be async functions and will be called in series.
*/
configureServer?: ServerHook
/**
* Configure the preview server. The hook receives the connect server and
* its underlying http server.
*
* The hooks are called before other middlewares are applied. A hook can
* return a post hook that will be called after other middlewares are
* applied. Hooks can be async functions and will be called in series.
*/
configurePreviewServer?: PreviewServerHook
/**
* Transform index.html.
* The hook receives the following arguments:
Expand Down
19 changes: 19 additions & 0 deletions packages/vite/src/node/preview.ts
Expand Up @@ -14,6 +14,7 @@ import corsMiddleware from 'cors'
import { proxyMiddleware } from './server/middlewares/proxy'
import { resolveHostname } from './utils'
import { printCommonServerUrls } from './logger'
import type * as http from 'http'

export interface PreviewOptions extends CommonServerOptions {}

Expand Down Expand Up @@ -53,6 +54,11 @@ export interface PreviewServer {
printUrls: () => void
}

export type PreviewServerHook = (server: {
middlewares: Connect.Server
httpServer: http.Server
}) => (() => void) | void | Promise<(() => void) | void>

/**
* Starts the Vite server in preview mode, to simulate a production deployment
* @param config - the resolved Vite config
Expand All @@ -71,6 +77,16 @@ export async function preview(
await resolveHttpsConfig(config.preview?.https, config.cacheDir)
)

// apply server hooks from plugins
const postHooks: ((() => void) | void)[] = []
for (const plugin of config.plugins) {
if (plugin.configurePreviewServer) {
postHooks.push(
await plugin.configurePreviewServer({ middlewares: app, httpServer })
)
}
}

// cors
const { cors } = config.preview
if (cors !== false) {
Expand All @@ -95,6 +111,9 @@ export async function preview(
})
)

// apply post server hooks from plugins
postHooks.forEach((fn) => fn && fn())

const options = config.preview
const hostname = resolveHostname(options.host)
const port = options.port ?? 4173
Expand Down

0 comments on commit 64e560e

Please sign in to comment.