From 4f9b8b4bc853450182ddfb49d5a4d80241053b86 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Mon, 27 Mar 2023 02:58:39 +0800 Subject: [PATCH] perf(optimizer): start optimizer early (#12593) --- packages/vite/src/node/optimizer/index.ts | 2 + packages/vite/src/node/optimizer/optimizer.ts | 9 +++-- packages/vite/src/node/server/index.ts | 37 +++++++++---------- .../node/ssr/__tests__/ssrLoadModule.spec.ts | 3 ++ .../node/ssr/__tests__/ssrStacktrace.spec.ts | 3 ++ vitest.config.ts | 2 + 6 files changed, 32 insertions(+), 24 deletions(-) diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index b7612f57696014..ab5462191e9911 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -26,6 +26,7 @@ import { import { transformWithEsbuild } from '../plugins/esbuild' import { ESBUILD_MODULES_TARGET } from '../constants' import { resolvePackageData } from '../packages' +import type { ViteDevServer } from '../server' import { esbuildCjsExternalPlugin, esbuildDepPlugin } from './esbuildDepPlugin' import { scanImports } from './scan' export { @@ -71,6 +72,7 @@ export interface DepsOptimizer { close: () => Promise options: DepOptimizationOptions + server?: ViteDevServer } export interface DepOptimizationConfig { diff --git a/packages/vite/src/node/optimizer/optimizer.ts b/packages/vite/src/node/optimizer/optimizer.ts index d083de8521bf12..0f76e12b49c412 100644 --- a/packages/vite/src/node/optimizer/optimizer.ts +++ b/packages/vite/src/node/optimizer/optimizer.ts @@ -1,7 +1,7 @@ import colors from 'picocolors' import _debug from 'debug' import { getHash } from '../utils' -import { getDepOptimizationConfig } from '..' +import { getDepOptimizationConfig } from '../config' import type { ResolvedConfig, ViteDevServer } from '..' import { addManuallyIncludedOptimizeDeps, @@ -122,6 +122,7 @@ async function createDepsOptimizer( ensureFirstRun, close, options: getDepOptimizationConfig(config, ssr), + server, } depsOptimizerMap.set(config, depsOptimizer) @@ -475,13 +476,13 @@ async function createDepsOptimizer( } function fullReload() { - if (server) { + if (depsOptimizer.server) { // Cached transform results have stale imports (resolved to // old locations) so they need to be invalidated before the page is // reloaded. - server.moduleGraph.invalidateAll() + depsOptimizer.server.moduleGraph.invalidateAll() - server.ws.send({ + depsOptimizer.server.ws.send({ type: 'full-reload', path: '*', }) diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index 186317948a17ee..acef17fdc7b29d 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -340,6 +340,13 @@ export async function createServer( inlineConfig: InlineConfig = {}, ): Promise { const config = await resolveConfig(inlineConfig, 'serve') + + // start optimizer in the background + let depsOptimizerReady: Promise | undefined + if (isDepsOptimizerEnabled(config, false)) { + depsOptimizerReady = initDepsOptimizer(config) + } + const { root, server: serverConfig } = config const httpsOptions = await resolveHttpsConfig(config.server.https) const { middlewareMode } = serverConfig @@ -656,25 +663,15 @@ export async function createServer( // error handler middlewares.use(errorMiddleware(server, middlewareMode)) - let initingServer: Promise | undefined - let serverInited = false - const initServer = async () => { - if (serverInited) { - return - } - if (initingServer) { - return initingServer - } - initingServer = (async function () { - await container.buildStart({}) - if (isDepsOptimizerEnabled(config, false)) { - // non-ssr - await initDepsOptimizer(config, server) + // when the optimizer is ready, hook server so that it can reload the page + // or invalidate the module graph when needed + if (depsOptimizerReady) { + depsOptimizerReady.then(() => { + const depsOptimizer = getDepsOptimizer(config) + if (depsOptimizer) { + depsOptimizer.server = server } - initingServer = undefined - serverInited = true - })() - return initingServer + }) } if (!middlewareMode && httpServer) { @@ -682,7 +679,7 @@ export async function createServer( const listen = httpServer.listen.bind(httpServer) httpServer.listen = (async (port: number, ...args: any[]) => { try { - await initServer() + await container.buildStart({}) } catch (e) { httpServer.emit('error', e) return @@ -690,7 +687,7 @@ export async function createServer( return listen(port, ...args) }) as any } else { - await initServer() + await container.buildStart({}) } return server diff --git a/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts index ad06cafc117839..da7b79edfb4047 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts @@ -11,6 +11,9 @@ async function createDevServer() { configFile: false, root, logLevel: 'silent', + optimizeDeps: { + disabled: true, + }, }) server.pluginContainer.buildStart({}) return server diff --git a/packages/vite/src/node/ssr/__tests__/ssrStacktrace.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrStacktrace.spec.ts index eb49dbe47311a8..384fbd6a428992 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrStacktrace.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrStacktrace.spec.ts @@ -9,6 +9,9 @@ async function createDevServer() { configFile: false, root, logLevel: 'silent', + optimizeDeps: { + disabled: true, + }, }) server.pluginContainer.buildStart({}) return server diff --git a/vitest.config.ts b/vitest.config.ts index f86aad8dd8b15b..5249f8894dc190 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -9,6 +9,8 @@ export default defineConfig({ './playground-temp/**/*.*', ], testTimeout: 20000, + // node14 segfaults often with threads + threads: !process.versions.node.startsWith('14'), }, esbuild: { target: 'node14',