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

perf(optimizer): start optimizer early #12593

Merged
merged 6 commits into from Mar 26, 2023
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
2 changes: 2 additions & 0 deletions packages/vite/src/node/optimizer/index.ts
Expand Up @@ -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 {
Expand Down Expand Up @@ -71,6 +72,7 @@ export interface DepsOptimizer {
close: () => Promise<void>

options: DepOptimizationOptions
server?: ViteDevServer
}

export interface DepOptimizationConfig {
Expand Down
9 changes: 5 additions & 4 deletions 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,
Expand Down Expand Up @@ -122,6 +122,7 @@ async function createDepsOptimizer(
ensureFirstRun,
close,
options: getDepOptimizationConfig(config, ssr),
server,
}

depsOptimizerMap.set(config, depsOptimizer)
Expand Down Expand Up @@ -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: '*',
})
Expand Down
37 changes: 17 additions & 20 deletions packages/vite/src/node/server/index.ts
Expand Up @@ -340,6 +340,13 @@ export async function createServer(
inlineConfig: InlineConfig = {},
): Promise<ViteDevServer> {
const config = await resolveConfig(inlineConfig, 'serve')

// start optimizer in the background
let depsOptimizerReady: Promise<void> | undefined
if (isDepsOptimizerEnabled(config, false)) {
depsOptimizerReady = initDepsOptimizer(config)
}

const { root, server: serverConfig } = config
const httpsOptions = await resolveHttpsConfig(config.server.https)
const { middlewareMode } = serverConfig
Expand Down Expand Up @@ -656,41 +663,31 @@ export async function createServer(
// error handler
middlewares.use(errorMiddleware(server, middlewareMode))

let initingServer: Promise<void> | 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) {
// overwrite listen to init optimizer before server start
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
}
return listen(port, ...args)
}) as any
} else {
await initServer()
await container.buildStart({})
}

return server
Expand Down
3 changes: 3 additions & 0 deletions packages/vite/src/node/ssr/__tests__/ssrLoadModule.spec.ts
Expand Up @@ -11,6 +11,9 @@ async function createDevServer() {
configFile: false,
root,
logLevel: 'silent',
optimizeDeps: {
disabled: true,
},
Comment on lines +14 to +16
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was this needed for the PR?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really. A lot of changes actually wasn't needed until node14 start messing up everything 😄 Only the first commit was the real changes.

But I think the changes are fine still including this one, since for this case the unit test won't spin up an unused deps optimizer instance (for this PR onwards). I'm happy to revert it too though and we can check separately.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nah, let's keep it :)

})
server.pluginContainer.buildStart({})
return server
Expand Down
3 changes: 3 additions & 0 deletions packages/vite/src/node/ssr/__tests__/ssrStacktrace.spec.ts
Expand Up @@ -9,6 +9,9 @@ async function createDevServer() {
configFile: false,
root,
logLevel: 'silent',
optimizeDeps: {
disabled: true,
},
})
server.pluginContainer.buildStart({})
return server
Expand Down
2 changes: 2 additions & 0 deletions vitest.config.ts
Expand Up @@ -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',
Expand Down