Skip to content

Commit e60368f

Browse files
authored
fix(ssr): allow virtual paths on node modules (#9405)
1 parent 156a3a4 commit e60368f

File tree

8 files changed

+67
-16
lines changed

8 files changed

+67
-16
lines changed

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

+19-14
Original file line numberDiff line numberDiff line change
@@ -129,20 +129,25 @@ export function createIsConfiguredAsSsrExternal(
129129
if (!bareImportRE.test(id) || id.includes('\0')) {
130130
return false
131131
}
132-
return !!tryNodeResolve(
133-
id,
134-
undefined,
135-
resolveOptions,
136-
ssr?.target === 'webworker',
137-
undefined,
138-
true,
139-
// try to externalize, will return undefined or an object without
140-
// a external flag if it isn't externalizable
141-
true,
142-
// Allow linked packages to be externalized if they are explicitly
143-
// configured as external
144-
!!configuredAsExternal
145-
)?.external
132+
try {
133+
return !!tryNodeResolve(
134+
id,
135+
undefined,
136+
resolveOptions,
137+
ssr?.target === 'webworker',
138+
undefined,
139+
true,
140+
// try to externalize, will return undefined or an object without
141+
// a external flag if it isn't externalizable
142+
true,
143+
// Allow linked packages to be externalized if they are explicitly
144+
// configured as external
145+
!!configuredAsExternal
146+
)?.external
147+
} catch (e) {
148+
// may be an invalid import that's resolved by a plugin
149+
return false
150+
}
146151
}
147152

148153
// Returns true if it is configured as external, false if it is filtered

playground/ssr-deps/__tests__/ssr-deps.spec.ts

+5
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,8 @@ test('msg from linked no external', async () => {
103103
await page.goto(url)
104104
expect(await page.textContent('.linked-no-external')).toMatch('Hello World!')
105105
})
106+
107+
test('msg from linked no external', async () => {
108+
await page.goto(url)
109+
expect(await page.textContent('.dep-virtual')).toMatch('[success]')
110+
})

playground/ssr-deps/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
"optimized-cjs-with-nested-external": "file:./optimized-with-nested-external",
2828
"external-using-external-entry": "file:./external-using-external-entry",
2929
"external-entry": "file:./external-entry",
30-
"linked-no-external": "link:./linked-no-external"
30+
"linked-no-external": "link:./linked-no-external",
31+
"pkg-exports": "file:./pkg-exports"
3132
},
3233
"devDependencies": {
3334
"cross-env": "^7.0.3",
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default undefined
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "pkg-exports",
3+
"private": true,
4+
"version": "0.0.0",
5+
"exports": {
6+
".": "./index.js"
7+
},
8+
"type": "module"
9+
}

playground/ssr-deps/server.js

+17-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,23 @@ export async function createServer(root = process.cwd(), hmrPort) {
4545
optimizeDeps: {
4646
disabled: 'build'
4747
}
48-
}
48+
},
49+
plugins: [
50+
{
51+
name: 'dep-virtual',
52+
enforce: 'pre',
53+
resolveId(id) {
54+
if (id === 'pkg-exports/virtual') {
55+
return 'pkg-exports/virtual'
56+
}
57+
},
58+
load(id) {
59+
if (id === 'pkg-exports/virtual') {
60+
return 'export default "[success]"'
61+
}
62+
}
63+
}
64+
]
4965
})
5066
// use vite's connect instance as middleware
5167
app.use(vite.middlewares)

playground/ssr-deps/src/app.js

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import requireAbsolute from 'require-absolute'
1212
import noExternalCjs from 'no-external-cjs'
1313
import importBuiltinCjs from 'import-builtin-cjs'
1414
import { hello as linkedNoExternal } from 'linked-no-external'
15+
import virtualMessage from 'pkg-exports/virtual'
1516

1617
// This import will set a 'Hello World!" message in the nested-external non-entry dependency
1718
import 'non-optimized-with-nested-external'
@@ -79,5 +80,7 @@ export async function render(url, rootDir) {
7980
const linkedNoExternalMessage = linkedNoExternal()
8081
html += `\n<p class="linked-no-external">message from linked-no-external: ${linkedNoExternalMessage}</p>`
8182

83+
html += `\n<p class="dep-virtual">message from dep-virtual: ${virtualMessage}</p>`
84+
8285
return html + '\n'
8386
}

pnpm-lock.yaml

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)