Skip to content

Commit 8e54af6

Browse files
authored
fix(ssr): apply alias to resolvable dependencies during dev (#15602)
1 parent e030f4b commit 8e54af6

File tree

11 files changed

+93
-1
lines changed

11 files changed

+93
-1
lines changed

Diff for: packages/vite/src/node/plugins/importAnalysis.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ import { isCSSRequest, isDirectCSSRequest } from './css'
6868
import { browserExternalId } from './resolve'
6969
import { serializeDefine } from './define'
7070
import { WORKER_FILE_ID } from './worker'
71+
import { getAliasPatternMatcher } from './preAlias'
7172

7273
const debug = createDebugger('vite:import-analysis')
7374

@@ -172,6 +173,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin {
172173
const fsUtils = getFsUtils(config)
173174
const clientPublicPath = path.posix.join(base, CLIENT_PUBLIC_PATH)
174175
const enablePartialAccept = config.experimental?.hmrPartialAccept
176+
const matchAlias = getAliasPatternMatcher(config.resolve.alias)
175177
let server: ViteDevServer
176178

177179
let _env: string | undefined
@@ -487,7 +489,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin {
487489
return
488490
}
489491
// skip ssr external
490-
if (ssr) {
492+
if (ssr && !matchAlias(specifier)) {
491493
if (shouldExternalizeForSSR(specifier, importer, config)) {
492494
return
493495
}

Diff for: packages/vite/src/node/plugins/preAlias.ts

+8
Original file line numberDiff line numberDiff line change
@@ -128,3 +128,11 @@ function getAliasPatterns(
128128
}
129129
return Object.entries(entries).map(([find]) => find)
130130
}
131+
132+
export function getAliasPatternMatcher(
133+
entries: (AliasOptions | undefined) & Alias[],
134+
): (importee: string) => boolean {
135+
const patterns = getAliasPatterns(entries)
136+
return (importee: string) =>
137+
patterns.some((pattern) => matches(pattern, importee))
138+
}

Diff for: playground/ssr-alias/__tests__/ssr-alias.spec.ts

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { expect, test } from 'vitest'
2+
import { isServe, testDir, viteServer } from '~utils'
3+
4+
test.runIf(isServe)('dev', async () => {
5+
const mod = await viteServer.ssrLoadModule('/src/main.js')
6+
expect(mod.default).toEqual({
7+
dep: 'ok',
8+
nonDep: 'ok',
9+
builtin: 'ok',
10+
})
11+
})
12+
13+
test.runIf(!isServe)('build', async () => {
14+
const mod = await import(`${testDir}/dist/main.js`)
15+
expect(mod.default).toEqual({
16+
dep: 'ok',
17+
nonDep: 'ok',
18+
builtin: 'ok',
19+
})
20+
})

Diff for: playground/ssr-alias/alias-original/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default 'original'

Diff for: playground/ssr-alias/alias-original/package.json

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "@vitejs/test-alias-original",
3+
"version": "0.0.0",
4+
"private": true,
5+
"type": "module",
6+
"exports": {
7+
".": "./index.js"
8+
}
9+
}

Diff for: playground/ssr-alias/package.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"name": "@vitejs/test-ssr-html",
3+
"private": true,
4+
"version": "0.0.0",
5+
"type": "module",
6+
"scripts": {
7+
"build": "vite build"
8+
},
9+
"dependencies": {
10+
"@vitejs/test-alias-original": "file:./alias-original"
11+
}
12+
}

Diff for: playground/ssr-alias/src/alias-process.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default {
2+
env: { __TEST_ALIAS__: 'ok' },
3+
}

Diff for: playground/ssr-alias/src/alias-replaced.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default 'ok'

Diff for: playground/ssr-alias/src/main.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import process from 'node:process'
2+
import dep from '@vitejs/test-alias-original'
3+
import nonDep from '@vitejs/test-alias-non-dep'
4+
5+
export default {
6+
dep,
7+
nonDep,
8+
builtin: process.env['__TEST_ALIAS__'],
9+
}

Diff for: playground/ssr-alias/vite.config.js

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { defineConfig } from 'vite'
2+
3+
export default defineConfig({
4+
build: {
5+
ssr: './src/main.js',
6+
},
7+
resolve: {
8+
alias: {
9+
'@vitejs/test-alias-original': '/src/alias-replaced.js',
10+
'@vitejs/test-alias-non-dep': '/src/alias-replaced.js',
11+
'node:process': '/src/alias-process.js',
12+
},
13+
},
14+
})

Diff for: pnpm-lock.yaml

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

0 commit comments

Comments
 (0)