Navigation Menu

Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: new hook configurePreviewServer #7658

Merged
merged 2 commits into from May 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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 as [`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
20 changes: 20 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
* @experimental
Expand All @@ -69,6 +75,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 @@ -83,6 +99,7 @@ export async function preview(

app.use(compression())

// static assets
const distDir = path.resolve(config.root, config.build.outDir)
app.use(
config.base,
Expand All @@ -93,6 +110,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