From ebe6c7122cb866b22af7682c0062085352952718 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Tue, 2 Jul 2024 19:26:58 +0100 Subject: [PATCH] perf(vite): avoid extra resolve call for `resolveId` in layers (#27971) --- packages/vite/src/vite.ts | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/vite/src/vite.ts b/packages/vite/src/vite.ts index b4c6d523c8..5f6ec5c254 100644 --- a/packages/vite/src/vite.ts +++ b/packages/vite/src/vite.ts @@ -123,6 +123,7 @@ export const bundle: NuxtBuilder['bundle'] = async (nuxt) => { ctx.config.build!.watch = undefined } + // TODO: this may no longer be needed with most recent vite version if (nuxt.options.dev) { // Identify which layers will need to have an extra resolve step. const layerDirs: string[] = [] @@ -133,17 +134,24 @@ export const bundle: NuxtBuilder['bundle'] = async (nuxt) => { } } if (layerDirs.length > 0) { - ctx.config.plugins!.push({ - name: 'nuxt:optimize-layer-deps', - enforce: 'pre', - async resolveId (source, _importer) { - if (!_importer) { return } - const importer = normalize(_importer) - if (layerDirs.some(dir => importer.startsWith(dir))) { + // Reverse so longest/most specific directories are searched first + layerDirs.sort().reverse() + ctx.nuxt.hook('vite:extendConfig', (config) => { + const dirs = [...layerDirs] + config.plugins!.push({ + name: 'nuxt:optimize-layer-deps', + enforce: 'pre', + async resolveId (source, _importer) { + if (!_importer || !dirs.length) { return } + const importer = normalize(_importer) + const layerIndex = dirs.findIndex(dir => importer.startsWith(dir)) // Trigger vite to optimize dependencies imported within a layer, just as if they were imported in final project - await this.resolve(source, join(nuxt.options.srcDir, 'index.html'), { skipSelf: true }).catch(() => null) - } - }, + if (layerIndex !== -1) { + dirs.splice(layerIndex, 1) + await this.resolve(source, join(nuxt.options.srcDir, 'index.html'), { skipSelf: true }).catch(() => null) + } + }, + }) }) } }