Skip to content
This repository was archived by the owner on Apr 6, 2023. It is now read-only.

Commit 78af77e

Browse files
committed
fix(vite-node): use externality to handle externals
1 parent 25ac652 commit 78af77e

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

packages/vite/src/vite-node.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import fse from 'fs-extra'
55
import { resolve } from 'pathe'
66
import { addServerMiddleware } from '@nuxt/kit'
77
import type { Plugin as VitePlugin, ViteDevServer } from 'vite'
8+
import { ExternalsOptions, isExternal, ExternalsDefaults } from 'externality'
9+
import { resolve as resolveModule } from 'mlly'
810
import { distDir } from './dirs'
911
import type { ViteBuildContext } from './vite'
1012
import { isCSS } from './utils'
@@ -56,7 +58,8 @@ function createViteNodeMiddleware (ctx: ViteBuildContext) {
5658
}))
5759

5860
app.use('/module', defineLazyEventHandler(() => {
59-
const node: ViteNodeServer = new ViteNodeServer(ctx.ssrServer, {
61+
const viteServer = ctx.ssrServer
62+
const node: ViteNodeServer = new ViteNodeServer(viteServer, {
6063
deps: {
6164
inline: [
6265
/\/(nuxt|nuxt3)\//,
@@ -69,6 +72,31 @@ function createViteNodeMiddleware (ctx: ViteBuildContext) {
6972
web: []
7073
}
7174
})
75+
const externalOpts: ExternalsOptions = {
76+
inline: [
77+
/virtual:/,
78+
/\.ts$/,
79+
...ExternalsDefaults.inline,
80+
...viteServer.config.ssr.noExternal as string[]
81+
],
82+
external: [
83+
...viteServer.config.ssr.external,
84+
/node_modules/
85+
],
86+
resolve: {
87+
type: 'module',
88+
extensions: ['.ts', '.js', '.json', '.vue', '.mjs', '.jsx', '.tsx', '.wasm']
89+
}
90+
}
91+
const rootDir = ctx.nuxt.options.rootDir
92+
node.shouldExternalize = async (id: string) => {
93+
const result = await isExternal(id, rootDir, externalOpts)
94+
if (result?.external) {
95+
return resolveModule(result.id, { url: rootDir })
96+
}
97+
return false
98+
}
99+
72100
return async (event) => {
73101
const moduleId = decodeURI(event.req.url).substring(1)
74102
if (moduleId === '/') {

0 commit comments

Comments
 (0)