Skip to content

Commit 17eb919

Browse files
committed
feat(ssr): respect resolve.dedupe in production
1 parent 7a58dea commit 17eb919

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

packages/vite/src/node/plugins/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { dynamicImportPolyfillPlugin } from './dynamicImportPolyfill'
1414
import { webWorkerPlugin } from './worker'
1515
import { preAliasPlugin } from './preAlias'
1616
import { definePlugin } from './define'
17+
import { ssrRequireHookPlugin } from './ssrRequireHook'
1718

1819
export async function resolvePlugins(
1920
config: ResolvedConfig,
@@ -40,6 +41,7 @@ export async function resolvePlugins(
4041
ssrTarget: config.ssr?.target,
4142
asSrc: true
4243
}),
44+
config.ssr ? ssrRequireHookPlugin(config) : null,
4345
htmlInlineScriptProxyPlugin(),
4446
cssPlugin(config),
4547
config.esbuild !== false ? esbuildPlugin(config.esbuild) : null,
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import MagicString from 'magic-string'
2+
import { ResolvedConfig } from '..'
3+
import { Plugin } from '../plugin'
4+
5+
const impl = `;(function() {
6+
const Module = require("module")
7+
const resolveFilename = Module._resolveFilename
8+
const dedupe = DEDUPE_IDS
9+
Module._resolveFilename = function (request, parent, isMain, options) {
10+
if (request[0] !== "." && request[0] !== "/") {
11+
const parts = request.split("/")
12+
const pkgName = parts[0][0] === "@" ? parts[0] + "/" + parts[1] : parts[0]
13+
if (dedupe.includes(pkgName)) {
14+
// Use this module as the parent.
15+
parent = module
16+
}
17+
}
18+
return resolveFilename(request, parent, isMain, options)
19+
}
20+
})();
21+
`
22+
23+
export function ssrRequireHookPlugin(config: ResolvedConfig): Plugin | null {
24+
if (config.command !== 'build' || !config.resolve.dedupe?.length) {
25+
return null
26+
}
27+
return {
28+
name: 'vite:ssr-require-hook',
29+
transform(code, id) {
30+
const moduleInfo = this.getModuleInfo(id)
31+
if (moduleInfo?.isEntry) {
32+
const s = new MagicString(code)
33+
s.prepend(
34+
impl.replace('DEDUPE_IDS', JSON.stringify(config.resolve.dedupe))
35+
)
36+
return {
37+
code: s.toString(),
38+
map: s.generateMap({
39+
source: id
40+
})
41+
}
42+
}
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)