From ba25885a13205ded8bddc1f85372eab84b876dee Mon Sep 17 00:00:00 2001 From: pengboUESTC Date: Thu, 22 Sep 2022 15:41:27 +0800 Subject: [PATCH 1/6] chore: http server type --- docs/guide/api-javascript.md | 2 +- docs/guide/api-plugin.md | 2 +- packages/vite/src/node/build.ts | 4 +--- packages/vite/src/node/config.ts | 6 +----- packages/vite/src/node/http.ts | 9 +++++---- packages/vite/src/node/preview.ts | 5 +++-- packages/vite/src/node/server/index.ts | 5 +++-- packages/vite/src/node/server/middlewares/proxy.ts | 3 ++- packages/vite/src/node/server/ws.ts | 3 ++- 9 files changed, 19 insertions(+), 20 deletions(-) diff --git a/docs/guide/api-javascript.md b/docs/guide/api-javascript.md index 55c1510898cbdb..9b5a4cdf0485cd 100644 --- a/docs/guide/api-javascript.md +++ b/docs/guide/api-javascript.md @@ -72,7 +72,7 @@ interface ViteDevServer { * Native Node http server instance. * Will be null in middleware mode. */ - httpServer: http.Server | null + httpServer: http.Server | Http2SecureServer | null /** * Chokidar watcher instance. * https://github.com/paulmillr/chokidar#api diff --git a/docs/guide/api-plugin.md b/docs/guide/api-plugin.md index c18c6daca3263f..7623437c4fa471 100644 --- a/docs/guide/api-plugin.md +++ b/docs/guide/api-plugin.md @@ -307,7 +307,7 @@ Vite plugins can also provide hooks that serve Vite-specific purposes. These hoo ### `configurePreviewServer` -- **Type:** `(server: { middlewares: Connect.Server, httpServer: http.Server }) => (() => void) | void | Promise<(() => void) | void>` +- **Type:** `(server: { middlewares: Connect.Server, httpServer: http.Server | Http2SecureServer }) => (() => 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: diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 2d279bce3d8795..329ccf632d6676 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -232,9 +232,7 @@ export type LibraryFormats = 'es' | 'cjs' | 'umd' | 'iife' export type ResolvedBuildOptions = Required export function resolveBuildOptions( - raw: BuildOptions | undefined, - isBuild: boolean, - logger: Logger + raw: BuildOptions | undefined ): ResolvedBuildOptions { const resolved: ResolvedBuildOptions = { target: 'modules', diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 829c47fee07abf..ba4e2a408b1ff9 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -510,11 +510,7 @@ export async function resolveConfig( : './' : resolveBaseUrl(config.base, isBuild, logger) ?? '/' - const resolvedBuildOptions = resolveBuildOptions( - config.build, - isBuild, - logger - ) + const resolvedBuildOptions = resolveBuildOptions(config.build) // resolve cache directory const pkgPath = lookupFile(resolvedRoot, [`package.json`], { pathOnly: true }) diff --git a/packages/vite/src/node/http.ts b/packages/vite/src/node/http.ts index af66a6356da05f..a58823be35e25b 100644 --- a/packages/vite/src/node/http.ts +++ b/packages/vite/src/node/http.ts @@ -5,6 +5,7 @@ import type { OutgoingHttpHeaders as HttpServerHeaders } from 'node:http' import type { ServerOptions as HttpsServerOptions } from 'node:https' +import type { Http2SecureServer } from 'node:http2' import type { Connect } from 'types/connect' import colors from 'picocolors' import { isObject } from './utils' @@ -94,7 +95,7 @@ export async function resolveHttpServer( { proxy }: CommonServerOptions, app: Connect.Server, httpsOptions?: HttpsServerOptions -): Promise { +): Promise { if (!httpsOptions) { const { createServer } = await import('node:http') return createServer(app) @@ -116,7 +117,7 @@ export async function resolveHttpServer( }, // @ts-expect-error TODO: is this correct? app - ) as unknown as HttpServer + ) } } @@ -149,7 +150,7 @@ function readFileIfExists(value?: string | Buffer | any[]) { } export async function httpServerStart( - httpServer: HttpServer, + httpServer: HttpServer | Http2SecureServer, serverOptions: { port: number strictPort: boolean | undefined @@ -185,7 +186,7 @@ export async function httpServerStart( } export function setClientErrorHandler( - server: HttpServer, + server: HttpServer | Http2SecureServer, logger: Logger ): void { server.on('clientError', (err, socket) => { diff --git a/packages/vite/src/node/preview.ts b/packages/vite/src/node/preview.ts index 577758357072d6..b6548c403ba23c 100644 --- a/packages/vite/src/node/preview.ts +++ b/packages/vite/src/node/preview.ts @@ -1,5 +1,6 @@ import path from 'node:path' import type * as http from 'node:http' +import type { Http2SecureServer } from 'node:http2' import sirv from 'sirv' import connect from 'connect' import type { Connect } from 'types/connect' @@ -51,7 +52,7 @@ export interface PreviewServer { /** * native Node http server instance */ - httpServer: http.Server + httpServer: http.Server | Http2SecureServer /** * The resolved urls Vite prints on the CLI */ @@ -66,7 +67,7 @@ export type PreviewServerHook = ( this: void, server: { middlewares: Connect.Server - httpServer: http.Server + httpServer: http.Server | Http2SecureServer } ) => (() => void) | void | Promise<(() => void) | void> diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index 12b93216d15168..f6d330a4f070d8 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -2,6 +2,7 @@ import fs from 'node:fs' import path from 'node:path' import type * as net from 'node:net' import type * as http from 'node:http' +import type { Http2SecureServer } from 'node:http2' import { performance } from 'node:perf_hooks' import connect from 'connect' import corsMiddleware from 'cors' @@ -173,7 +174,7 @@ export interface ViteDevServer { * native Node http server instance * will be null in middleware mode */ - httpServer: http.Server | null + httpServer: http.Server | Http2SecureServer | null /** * chokidar watcher instance * https://github.com/paulmillr/chokidar#api @@ -658,7 +659,7 @@ async function startServer( } } -function createServerCloseFn(server: http.Server | null) { +function createServerCloseFn(server: http.Server | Http2SecureServer | null) { if (!server) { return () => {} } diff --git a/packages/vite/src/node/server/middlewares/proxy.ts b/packages/vite/src/node/server/middlewares/proxy.ts index 6554358f091028..1a51b407eba4c5 100644 --- a/packages/vite/src/node/server/middlewares/proxy.ts +++ b/packages/vite/src/node/server/middlewares/proxy.ts @@ -1,4 +1,5 @@ import type * as http from 'node:http' +import type { Http2SecureServer } from 'node:http2' import type * as net from 'node:net' import httpProxy from 'http-proxy' import type { Connect } from 'types/connect' @@ -30,7 +31,7 @@ export interface ProxyOptions extends HttpProxy.ServerOptions { } export function proxyMiddleware( - httpServer: http.Server | null, + httpServer: http.Server | Http2SecureServer | null, options: NonNullable, config: ResolvedConfig ): Connect.NextHandleFunction { diff --git a/packages/vite/src/node/server/ws.ts b/packages/vite/src/node/server/ws.ts index 54eaa21e94de45..004e75419ec7d8 100644 --- a/packages/vite/src/node/server/ws.ts +++ b/packages/vite/src/node/server/ws.ts @@ -2,6 +2,7 @@ import type { Server } from 'node:http' import { STATUS_CODES } from 'node:http' import type { ServerOptions as HttpsServerOptions } from 'node:https' import { createServer as createHttpsServer } from 'node:https' +import type { Http2SecureServer } from 'node:http2' import type { Socket } from 'node:net' import colors from 'picocolors' import type { ServerOptions, WebSocket as WebSocketRaw } from 'ws' @@ -78,7 +79,7 @@ const wsServerEvents = [ ] export function createWebSocketServer( - server: Server | null, + server: Server | Http2SecureServer | null, config: ResolvedConfig, httpsOptions?: HttpsServerOptions ): WebSocketServer { From 5f7543fd0bff0ae8ce5de4e1fc347fb1efd59c23 Mon Sep 17 00:00:00 2001 From: pengboUESTC Date: Fri, 23 Sep 2022 13:37:14 +0800 Subject: [PATCH 2/6] fix: proxy bypass do nothing with object result --- packages/vite/src/node/plugins/asset.ts | 3 +-- packages/vite/src/node/server/middlewares/compression.ts | 3 +-- packages/vite/src/node/server/middlewares/proxy.ts | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index 94c34a40f8d22e..e5709e949d10a4 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -19,6 +19,7 @@ import { cleanUrl, getHash, normalizePath } from '../utils' import { FS_PREFIX } from '../constants' export const assetUrlRE = /__VITE_ASSET__([a-z\d]{8})__(?:\$_(.*?)__)?/g +export const publicAssetUrlRE = /__VITE_PUBLIC_ASSET__([a-z\d]{8})__/g const rawRE = /(\?|&)raw(?:&|$)/ const urlRE = /(\?|&)url(?:&|$)/ @@ -378,8 +379,6 @@ export const publicAssetUrlCache = new WeakMap< Map >() -export const publicAssetUrlRE = /__VITE_PUBLIC_ASSET__([a-z\d]{8})__/g - export function publicFileToBuiltUrl( url: string, config: ResolvedConfig diff --git a/packages/vite/src/node/server/middlewares/compression.ts b/packages/vite/src/node/server/middlewares/compression.ts index f0715133aea167..5905d031104c76 100644 --- a/packages/vite/src/node/server/middlewares/compression.ts +++ b/packages/vite/src/node/server/middlewares/compression.ts @@ -41,6 +41,7 @@ export default function compression() { let pendingListeners = [] let started = false let size = 0 + const { end, write, on, writeHead } = res function start() { started = true @@ -81,8 +82,6 @@ export default function compression() { writeHead.call(res, pendingStatus || res.statusCode) } - const { end, write, on, writeHead } = res - res.writeHead = function (status, reason, headers) { if (typeof reason !== 'string') [headers, reason] = [reason, headers] if (headers) for (let i in headers) res.setHeader(i, headers[i]) diff --git a/packages/vite/src/node/server/middlewares/proxy.ts b/packages/vite/src/node/server/middlewares/proxy.ts index 1a51b407eba4c5..515be5a275d110 100644 --- a/packages/vite/src/node/server/middlewares/proxy.ts +++ b/packages/vite/src/node/server/middlewares/proxy.ts @@ -27,7 +27,7 @@ export interface ProxyOptions extends HttpProxy.ServerOptions { req: http.IncomingMessage, res: http.ServerResponse, options: ProxyOptions - ) => void | null | undefined | false | string + ) => void | null | undefined | false | string | HttpProxy.ServerOptions } export function proxyMiddleware( @@ -123,7 +123,6 @@ export function proxyMiddleware( } else if (isObject(bypassResult)) { Object.assign(options, bypassResult) debug(`bypass: ${req.url} use modified options: %O`, options) - return next() } else if (bypassResult === false) { debug(`bypass: ${req.url} -> 404`) return res.end(404) From 20d3e3bc74cc8dcc8b97083559ee61b4a723c959 Mon Sep 17 00:00:00 2001 From: pengboUESTC Date: Sat, 8 Oct 2022 22:11:35 +0800 Subject: [PATCH 3/6] chore: rollback proxy --- packages/vite/src/node/server/middlewares/proxy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vite/src/node/server/middlewares/proxy.ts b/packages/vite/src/node/server/middlewares/proxy.ts index 0269072dda7725..826bc68c621750 100644 --- a/packages/vite/src/node/server/middlewares/proxy.ts +++ b/packages/vite/src/node/server/middlewares/proxy.ts @@ -123,6 +123,7 @@ export function proxyMiddleware( } else if (isObject(bypassResult)) { Object.assign(options, bypassResult) debug(`bypass: ${req.url} use modified options: %O`, options) + return next() } else if (bypassResult === false) { debug(`bypass: ${req.url} -> 404`) return res.end(404) From e6348742651d1f9f7a6d7e34a45d688262477f17 Mon Sep 17 00:00:00 2001 From: pengboUESTC Date: Sat, 8 Oct 2022 22:18:29 +0800 Subject: [PATCH 4/6] chore: rollback resolveBuildOptions function --- packages/vite/src/node/build.ts | 4 +++- packages/vite/src/node/config.ts | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 11024932f68c76..9ed62f8d72b940 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -269,7 +269,9 @@ export interface ResolvedBuildOptions } export function resolveBuildOptions( - raw: BuildOptions | undefined + raw: BuildOptions | undefined, + isBuild: boolean, + logger: Logger ): ResolvedBuildOptions { const deprecatedPolyfillModulePreload = raw?.polyfillModulePreload if (raw) { diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 94d44a2a79abdb..6faf7d2d863f03 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -522,7 +522,11 @@ export async function resolveConfig( : './' : resolveBaseUrl(config.base, isBuild, logger) ?? '/' - const resolvedBuildOptions = resolveBuildOptions(config.build) + const resolvedBuildOptions = resolveBuildOptions( + config.build, + isBuild, + logger + ) // resolve cache directory const pkgPath = lookupFile(resolvedRoot, [`package.json`], { pathOnly: true }) From 7103cf77d2c9f243c4b8b487a2b14f3f07c77c02 Mon Sep 17 00:00:00 2001 From: pengboUESTC Date: Fri, 14 Oct 2022 20:10:33 +0800 Subject: [PATCH 5/6] chore: revert useless code --- packages/vite/src/node/plugins/asset.ts | 3 ++- packages/vite/src/node/server/middlewares/compression.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index aa1577b2d5513f..a7a8f2554bf0a1 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -23,7 +23,6 @@ import { cleanUrl, getHash, normalizePath } from '../utils' import { FS_PREFIX } from '../constants' export const assetUrlRE = /__VITE_ASSET__([a-z\d]{8})__(?:\$_(.*?)__)?/g -export const publicAssetUrlRE = /__VITE_PUBLIC_ASSET__([a-z\d]{8})__/g export const duplicateAssets = new WeakMap< ResolvedConfig, @@ -389,6 +388,8 @@ export const publicAssetUrlCache = new WeakMap< Map >() +export const publicAssetUrlRE = /__VITE_PUBLIC_ASSET__([a-z\d]{8})__/g + export function publicFileToBuiltUrl( url: string, config: ResolvedConfig diff --git a/packages/vite/src/node/server/middlewares/compression.ts b/packages/vite/src/node/server/middlewares/compression.ts index 5905d031104c76..f0715133aea167 100644 --- a/packages/vite/src/node/server/middlewares/compression.ts +++ b/packages/vite/src/node/server/middlewares/compression.ts @@ -41,7 +41,6 @@ export default function compression() { let pendingListeners = [] let started = false let size = 0 - const { end, write, on, writeHead } = res function start() { started = true @@ -82,6 +81,8 @@ export default function compression() { writeHead.call(res, pendingStatus || res.statusCode) } + const { end, write, on, writeHead } = res + res.writeHead = function (status, reason, headers) { if (typeof reason !== 'string') [headers, reason] = [reason, headers] if (headers) for (let i in headers) res.setHeader(i, headers[i]) From d5a9ae40fe73a50819308835386f7c7798508752 Mon Sep 17 00:00:00 2001 From: pengboUESTC Date: Fri, 14 Oct 2022 20:12:23 +0800 Subject: [PATCH 6/6] chore: revert useless code --- packages/vite/src/node/server/middlewares/proxy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/server/middlewares/proxy.ts b/packages/vite/src/node/server/middlewares/proxy.ts index 826bc68c621750..0af07304e0e530 100644 --- a/packages/vite/src/node/server/middlewares/proxy.ts +++ b/packages/vite/src/node/server/middlewares/proxy.ts @@ -27,7 +27,7 @@ export interface ProxyOptions extends HttpProxy.ServerOptions { req: http.IncomingMessage, res: http.ServerResponse, options: ProxyOptions - ) => void | null | undefined | false | string | HttpProxy.ServerOptions + ) => void | null | undefined | false | string } export function proxyMiddleware(