Skip to content

Commit

Permalink
feat(ssr): respect resolve.dedupe in production
Browse files Browse the repository at this point in the history
  • Loading branch information
aleclarson committed Jun 25, 2021
1 parent 7a58dea commit 17eb919
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 0 deletions.
2 changes: 2 additions & 0 deletions packages/vite/src/node/plugins/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { dynamicImportPolyfillPlugin } from './dynamicImportPolyfill'
import { webWorkerPlugin } from './worker'
import { preAliasPlugin } from './preAlias'
import { definePlugin } from './define'
import { ssrRequireHookPlugin } from './ssrRequireHook'

export async function resolvePlugins(
config: ResolvedConfig,
Expand All @@ -40,6 +41,7 @@ export async function resolvePlugins(
ssrTarget: config.ssr?.target,
asSrc: true
}),
config.ssr ? ssrRequireHookPlugin(config) : null,
htmlInlineScriptProxyPlugin(),
cssPlugin(config),
config.esbuild !== false ? esbuildPlugin(config.esbuild) : null,
Expand Down
45 changes: 45 additions & 0 deletions packages/vite/src/node/plugins/ssrRequireHook.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import MagicString from 'magic-string'
import { ResolvedConfig } from '..'
import { Plugin } from '../plugin'

const impl = `;(function() {
const Module = require("module")
const resolveFilename = Module._resolveFilename
const dedupe = DEDUPE_IDS
Module._resolveFilename = function (request, parent, isMain, options) {
if (request[0] !== "." && request[0] !== "/") {
const parts = request.split("/")
const pkgName = parts[0][0] === "@" ? parts[0] + "/" + parts[1] : parts[0]
if (dedupe.includes(pkgName)) {
// Use this module as the parent.
parent = module
}
}
return resolveFilename(request, parent, isMain, options)
}
})();
`

export function ssrRequireHookPlugin(config: ResolvedConfig): Plugin | null {
if (config.command !== 'build' || !config.resolve.dedupe?.length) {
return null
}
return {
name: 'vite:ssr-require-hook',
transform(code, id) {
const moduleInfo = this.getModuleInfo(id)
if (moduleInfo?.isEntry) {
const s = new MagicString(code)
s.prepend(
impl.replace('DEDUPE_IDS', JSON.stringify(config.resolve.dedupe))
)
return {
code: s.toString(),
map: s.generateMap({
source: id
})
}
}
}
}
}

0 comments on commit 17eb919

Please sign in to comment.