From ac8c233bb7f56438f760d7105d554ec61aeb08da Mon Sep 17 00:00:00 2001 From: patak-dev Date: Tue, 31 May 2022 22:42:02 +0200 Subject: [PATCH 1/2] fix: respect package.exports when resolving SSR deep imports --- packages/vite/src/node/plugins/resolve.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 538389828ed2c2..6d32915d8dee43 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -636,8 +636,14 @@ export function tryNodeResolve( return resolved } const resolvedExt = path.extname(resolved.id) - const resolvedId = - isDeepImport && path.extname(id) !== resolvedExt ? id + resolvedExt : id + let resolvedId = id + if ( + isDeepImport && + !pkg?.data.exports && + path.extname(id) !== resolvedExt + ) { + resolvedId += resolvedExt + } return { ...resolved, id: resolvedId, external: true } } From 054dbe7782befdcd656a7024c75084eb38f630ec Mon Sep 17 00:00:00 2001 From: patak-dev Date: Wed, 1 Jun 2022 00:05:27 +0200 Subject: [PATCH 2/2] fix: don't externalize .css deep imports --- packages/vite/src/node/plugins/resolve.ts | 16 +++++++----- packages/vite/src/node/ssr/ssrExternal.ts | 32 ++++++++--------------- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 6d32915d8dee43..33a5ad31efe5b4 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -262,7 +262,6 @@ export function resolvePlugin(baseOptions: InternalResolveOptions): Plugin { // bare package imports, perform node resolve if (bareImportRE.test(id)) { const external = options.shouldExternalize?.(id) - if ( !external && asSrc && @@ -637,12 +636,15 @@ export function tryNodeResolve( } const resolvedExt = path.extname(resolved.id) let resolvedId = id - if ( - isDeepImport && - !pkg?.data.exports && - path.extname(id) !== resolvedExt - ) { - resolvedId += resolvedExt + if (isDeepImport) { + // check ext before externalizing - only externalize + // extension-less imports and explicit .js imports + if (resolvedExt && !resolved.id.match(/(.js|.mjs|.cjs)$/)) { + return + } + if (!pkg?.data.exports && path.extname(id) !== resolvedExt) { + resolvedId += resolvedExt + } } return { ...resolved, id: resolvedId, external: true } } diff --git a/packages/vite/src/node/ssr/ssrExternal.ts b/packages/vite/src/node/ssr/ssrExternal.ts index 512ec038a21244..fbba0e735f7df1 100644 --- a/packages/vite/src/node/ssr/ssrExternal.ts +++ b/packages/vite/src/node/ssr/ssrExternal.ts @@ -139,29 +139,19 @@ function createIsSsrExternal( isBuild: true } - const isPackageEntry = (id: string) => { + const isValidPackageEntry = (id: string) => { if (!bareImportRE.test(id) || id.includes('\0')) { return false } - if ( - tryNodeResolve( - id, - undefined, - resolveOptions, - ssr?.target === 'webworker', - undefined, - true - ) - ) { - return true - } - try { - // no main entry, but deep imports may be allowed - if (resolveFrom(`${id}/package.json`, root)) { - return true - } - } catch {} - return false + return !!tryNodeResolve( + id, + undefined, + resolveOptions, + ssr?.target === 'webworker', + undefined, + true, + true // try to externalize, will return undefined if not possible + ) } return (id: string) => { @@ -171,7 +161,7 @@ function createIsSsrExternal( const external = !id.startsWith('.') && !path.isAbsolute(id) && - (isBuiltin(id) || (isConfiguredAsExternal(id) && isPackageEntry(id))) + (isBuiltin(id) || (isConfiguredAsExternal(id) && isValidPackageEntry(id))) processedIds.set(id, external) return external }