From 6e27b810d9a82c5895125b80b86fc12f05301a3f Mon Sep 17 00:00:00 2001 From: bluwy Date: Sat, 22 Oct 2022 21:02:24 +0800 Subject: [PATCH 1/3] fix(ssr): skip optional peer dep resolve --- packages/vite/src/node/plugins/resolve.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 1d7c86a301d2b1..98ed0b21e7b524 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -681,6 +681,7 @@ export function tryNodeResolve( // if import can't be found, check if it's an optional peer dep. // if so, we can resolve to a special id that errors only when imported. if ( + depsOptimizer && // only required for optimizer so esbuild bundles correctly basedir !== root && // root has no peer dep !isBuiltin(id) && !id.includes('\0') && From 3c6547ec96c034f974e6c93a4bbc3e2a6acb3631 Mon Sep 17 00:00:00 2001 From: bluwy Date: Mon, 14 Nov 2022 15:31:14 +0800 Subject: [PATCH 2/3] chore: use nestedPath --- packages/vite/src/node/plugins/resolve.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 2fe37a5b855b2f..011ae80ad726ad 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -687,11 +687,10 @@ export function tryNodeResolve( // if import can't be found, check if it's an optional peer dep. // if so, we can resolve to a special id that errors only when imported. if ( - depsOptimizer && // only required for optimizer so esbuild bundles correctly basedir !== root && // root has no peer dep - !isBuiltin(id) && - !id.includes('\0') && - bareImportRE.test(id) + !isBuiltin(nestedPath) && + !nestedPath.includes('\0') && + bareImportRE.test(nestedPath) ) { // find package.json with `name` as main const mainPackageJson = lookupFile(basedir, ['package.json'], { @@ -700,11 +699,11 @@ export function tryNodeResolve( if (mainPackageJson) { const mainPkg = JSON.parse(mainPackageJson) if ( - mainPkg.peerDependencies?.[id] && - mainPkg.peerDependenciesMeta?.[id]?.optional + mainPkg.peerDependencies?.[nestedPath] && + mainPkg.peerDependenciesMeta?.[nestedPath]?.optional ) { return { - id: `${optionalPeerDepId}:${id}:${mainPkg.name}` + id: `${optionalPeerDepId}:${nestedPath}:${mainPkg.name}` } } } From b8ddf4e008de651ce40f33bf214707a84075cd0e Mon Sep 17 00:00:00 2001 From: bluwy Date: Mon, 14 Nov 2022 15:59:41 +0800 Subject: [PATCH 3/3] fix: naive fix --- packages/vite/src/node/plugins/resolve.ts | 3 +++ packages/vite/src/node/ssr/ssrModuleLoader.ts | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 011ae80ad726ad..893ff74bcc69c8 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -105,6 +105,8 @@ export interface InternalResolveOptions extends Required { // Resolve using esbuild deps optimization getDepsOptimizer?: (ssr: boolean) => DepsOptimizer | undefined shouldExternalize?: (id: string) => boolean | undefined + // Check this resolve is called from `hookNodeResolve` in SSR + isHookNodeResolve?: boolean } export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { @@ -687,6 +689,7 @@ export function tryNodeResolve( // if import can't be found, check if it's an optional peer dep. // if so, we can resolve to a special id that errors only when imported. if ( + !options.isHookNodeResolve && basedir !== root && // root has no peer dep !isBuiltin(nestedPath) && !nestedPath.includes('\0') && diff --git a/packages/vite/src/node/ssr/ssrModuleLoader.ts b/packages/vite/src/node/ssr/ssrModuleLoader.ts index 0e4e163570a575..eaae5e73015b46 100644 --- a/packages/vite/src/node/ssr/ssrModuleLoader.ts +++ b/packages/vite/src/node/ssr/ssrModuleLoader.ts @@ -127,7 +127,8 @@ async function instantiateModule( isBuild: true, isProduction, isRequire: true, - root + root, + isHookNodeResolve: true } // Since dynamic imports can happen in parallel, we need to