Skip to content

Commit 89d6711

Browse files
authoredJun 1, 2022
fix: SSR deep imports externalization (fixes #8420) (#8421)
* fix: respect package.exports when resolving SSR deep imports * fix: don't externalize .css deep imports
1 parent ab23e6e commit 89d6711

File tree

2 files changed

+22
-24
lines changed

2 files changed

+22
-24
lines changed
 

‎packages/vite/src/node/plugins/resolve.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,6 @@ export function resolvePlugin(baseOptions: InternalResolveOptions): Plugin {
262262
// bare package imports, perform node resolve
263263
if (bareImportRE.test(id)) {
264264
const external = options.shouldExternalize?.(id)
265-
266265
if (
267266
!external &&
268267
asSrc &&
@@ -636,8 +635,17 @@ export function tryNodeResolve(
636635
return resolved
637636
}
638637
const resolvedExt = path.extname(resolved.id)
639-
const resolvedId =
640-
isDeepImport && path.extname(id) !== resolvedExt ? id + resolvedExt : id
638+
let resolvedId = id
639+
if (isDeepImport) {
640+
// check ext before externalizing - only externalize
641+
// extension-less imports and explicit .js imports
642+
if (resolvedExt && !resolved.id.match(/(.js|.mjs|.cjs)$/)) {
643+
return
644+
}
645+
if (!pkg?.data.exports && path.extname(id) !== resolvedExt) {
646+
resolvedId += resolvedExt
647+
}
648+
}
641649
return { ...resolved, id: resolvedId, external: true }
642650
}
643651

‎packages/vite/src/node/ssr/ssrExternal.ts

+11-21
Original file line numberDiff line numberDiff line change
@@ -139,29 +139,19 @@ function createIsSsrExternal(
139139
isBuild: true
140140
}
141141

142-
const isPackageEntry = (id: string) => {
142+
const isValidPackageEntry = (id: string) => {
143143
if (!bareImportRE.test(id) || id.includes('\0')) {
144144
return false
145145
}
146-
if (
147-
tryNodeResolve(
148-
id,
149-
undefined,
150-
resolveOptions,
151-
ssr?.target === 'webworker',
152-
undefined,
153-
true
154-
)
155-
) {
156-
return true
157-
}
158-
try {
159-
// no main entry, but deep imports may be allowed
160-
if (resolveFrom(`${id}/package.json`, root)) {
161-
return true
162-
}
163-
} catch {}
164-
return false
146+
return !!tryNodeResolve(
147+
id,
148+
undefined,
149+
resolveOptions,
150+
ssr?.target === 'webworker',
151+
undefined,
152+
true,
153+
true // try to externalize, will return undefined if not possible
154+
)
165155
}
166156

167157
return (id: string) => {
@@ -171,7 +161,7 @@ function createIsSsrExternal(
171161
const external =
172162
!id.startsWith('.') &&
173163
!path.isAbsolute(id) &&
174-
(isBuiltin(id) || (isConfiguredAsExternal(id) && isPackageEntry(id)))
164+
(isBuiltin(id) || (isConfiguredAsExternal(id) && isValidPackageEntry(id)))
175165
processedIds.set(id, external)
176166
return external
177167
}

0 commit comments

Comments
 (0)
Please sign in to comment.