Skip to content

Commit 04b43f5

Browse files
committed
refactor: split out some unique configuration into environments plugin
1 parent f83bb7c commit 04b43f5

File tree

3 files changed

+102
-48
lines changed

3 files changed

+102
-48
lines changed

packages/vite/src/client.ts

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
import { dirname, isAbsolute, join, relative, resolve } from 'pathe'
1+
import { resolve } from 'pathe'
22
import * as vite from 'vite'
33
import vuePlugin from '@vitejs/plugin-vue'
44
import viteJsxPlugin from '@vitejs/plugin-vue-jsx'
5-
import type { BuildOptions } from 'vite'
6-
import { logger, useNitro } from '@nuxt/kit'
7-
import { joinURL, withoutLeadingSlash } from 'ufo'
8-
import { defu } from 'defu'
5+
import { logger } from '@nuxt/kit'
6+
import { joinURL } from 'ufo'
97
import { defineEnv } from 'unenv'
10-
import { resolveModulePath } from 'exsolve'
118
import type { Nuxt, ViteConfig } from '@nuxt/schema'
129

1310
import type { ViteBuildContext } from './vite'
@@ -101,19 +98,6 @@ export async function buildClient (nuxt: Nuxt, ctx: ViteBuildContext) {
10198
'#app-manifest',
10299
],
103100
},
104-
resolve: {
105-
alias: {
106-
// user aliases
107-
...nodeCompat.alias,
108-
...ctx.config.resolve?.alias,
109-
'nitro/runtime': join(nuxt.options.buildDir, 'nitro.client.mjs'),
110-
// TODO: remove in v5
111-
'#internal/nitro': join(ctx.nuxt.options.buildDir, 'nitro.client.mjs'),
112-
'nitropack/runtime': join(ctx.nuxt.options.buildDir, 'nitro.client.mjs'),
113-
// work around vite optimizer bug
114-
'#app-manifest': resolveModulePath('mocked-exports/empty', { from: import.meta.url }),
115-
},
116-
},
117101
cacheDir: resolve(nuxt.options.rootDir, ctx.config.cacheDir ?? 'node_modules/.cache/vite', 'client'),
118102
build: {
119103
sourcemap: nuxt.options.sourcemap.client ? ctx.config.build?.sourcemap ?? nuxt.options.sourcemap.client : false,
@@ -150,25 +134,6 @@ export async function buildClient (nuxt: Nuxt, ctx: ViteBuildContext) {
150134

151135
clientConfig.customLogger = createViteLogger(clientConfig)
152136

153-
// We want to respect users' own rollup output options
154-
const fileNames = withoutLeadingSlash(join(nuxt.options.app.buildAssetsDir, '[hash].js'))
155-
const clientOutputDir = join(useNitro().options.output.publicDir, nuxt.options.app.buildAssetsDir)
156-
clientConfig.build!.rollupOptions = defu(clientConfig.build!.rollupOptions!, {
157-
output: {
158-
chunkFileNames: nuxt.options.dev ? undefined : fileNames,
159-
entryFileNames: nuxt.options.dev ? 'entry.js' : fileNames,
160-
sourcemapPathTransform (relativeSourcePath, sourcemapPath) {
161-
// client build is running in a temporary build directory, like `.nuxt/dist/client`
162-
// so we need to transform the sourcemap path to be relative to the final build directory
163-
if (!isAbsolute(relativeSourcePath)) {
164-
const absoluteSourcePath = resolve(dirname(sourcemapPath), relativeSourcePath)
165-
return relative(clientOutputDir, absoluteSourcePath)
166-
}
167-
return relativeSourcePath
168-
},
169-
} satisfies NonNullable<BuildOptions['rollupOptions']>['output'],
170-
}) as any
171-
172137
await nuxt.callHook('vite:extendConfig', clientConfig, { isClient: true, isServer: false })
173138

174139
clientConfig.plugins!.unshift(
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import type { Plugin } from 'vite'
2+
import type { Nuxt } from '@nuxt/schema'
3+
import { withoutLeadingSlash } from 'ufo'
4+
import * as vite from 'vite'
5+
import { dirname, isAbsolute, join, relative, resolve } from 'pathe'
6+
import { useNitro } from '@nuxt/kit'
7+
import { resolveModulePath } from 'exsolve'
8+
import { defineEnv } from 'unenv'
9+
10+
export function EnvironmentsPlugin (nuxt: Nuxt): Plugin {
11+
const fileNames = withoutLeadingSlash(join(nuxt.options.app.buildAssetsDir, '[hash].js'))
12+
const clientOutputDir = join(useNitro().options.output.publicDir, nuxt.options.app.buildAssetsDir)
13+
14+
const clientAliases: Record<string, string> = {
15+
'nitro/runtime': join(nuxt.options.buildDir, 'nitro.client.mjs'),
16+
// TODO: remove in v5
17+
'#internal/nitro': join(nuxt.options.buildDir, 'nitro.client.mjs'),
18+
'nitropack/runtime': join(nuxt.options.buildDir, 'nitro.client.mjs'),
19+
// work around vite optimizer bug
20+
'#app-manifest': resolveModulePath('mocked-exports/empty', { from: import.meta.url }),
21+
}
22+
23+
return {
24+
name: 'nuxt:environments',
25+
config () {
26+
if (!nuxt.options.dev) {
27+
return {
28+
base: './',
29+
}
30+
}
31+
},
32+
configEnvironment (name, config) {
33+
if (name === 'client') {
34+
const outputConfig = config.build?.rollupOptions?.output as vite.Rollup.OutputOptions
35+
return {
36+
build: {
37+
rollupOptions: {
38+
output: {
39+
chunkFileNames: outputConfig?.chunkFileNames ?? (nuxt.options.dev ? undefined : fileNames),
40+
entryFileNames: outputConfig?.entryFileNames ?? (nuxt.options.dev ? 'entry.js' : fileNames),
41+
sourcemapPathTransform: outputConfig?.sourcemapPathTransform ?? ((relativeSourcePath, sourcemapPath) => {
42+
// client build is running in a temporary build directory, like `.nuxt/dist/client`
43+
// so we need to transform the sourcemap path to be relative to the final build directory
44+
if (!isAbsolute(relativeSourcePath)) {
45+
const absoluteSourcePath = resolve(dirname(sourcemapPath), relativeSourcePath)
46+
return relative(clientOutputDir, absoluteSourcePath)
47+
}
48+
return relativeSourcePath
49+
}),
50+
},
51+
},
52+
},
53+
}
54+
}
55+
56+
if (name === 'ssr') {
57+
if (config.build?.rollupOptions?.output && !Array.isArray(config.build.rollupOptions.output)) {
58+
config.build.rollupOptions.output.manualChunks = undefined
59+
60+
// @ts-expect-error non-public property
61+
if (vite.rolldownVersion) {
62+
// @ts-expect-error rolldown-specific
63+
config.build.rollupOptions.output.advancedChunks = undefined
64+
}
65+
}
66+
}
67+
},
68+
applyToEnvironment (environment) {
69+
if (environment.name === 'client') {
70+
return [
71+
...nuxt.options.experimental.clientNodeCompat ? [NodeCompatAliasPlugin()] : [],
72+
{
73+
name: 'nuxt:client:aliases',
74+
enforce: 'post',
75+
resolveId: source => clientAliases[source],
76+
},
77+
]
78+
} else if (environment.name === 'ssr') {
79+
//
80+
}
81+
return false
82+
},
83+
}
84+
}
85+
86+
function NodeCompatAliasPlugin (): Plugin {
87+
const nodeCompatAlias = defineEnv({ nodeCompat: true, resolve: true }).env.alias
88+
return {
89+
name: 'nuxt:client:node-compat-aliases',
90+
resolveId: {
91+
order: 'pre',
92+
handler (source) {
93+
if (source in nodeCompatAlias) {
94+
return nodeCompatAlias[source]
95+
}
96+
},
97+
},
98+
}
99+
}

packages/vite/src/server.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -129,16 +129,6 @@ export async function buildServer (nuxt: Nuxt, ctx: ViteBuildContext) {
129129
},
130130
} satisfies vite.InlineConfig, nuxt.options.vite.$server || {}))
131131

132-
if (serverConfig.build?.rollupOptions?.output && !Array.isArray(serverConfig.build.rollupOptions.output)) {
133-
serverConfig.build.rollupOptions.output.manualChunks = undefined
134-
135-
// @ts-expect-error non-public property
136-
if (vite.rolldownVersion) {
137-
// @ts-expect-error rolldown-specific
138-
serverConfig.build.rollupOptions.output.advancedChunks = undefined
139-
}
140-
}
141-
142132
serverConfig.customLogger = createViteLogger(serverConfig, { hideOutput: !nuxt.options.dev })
143133

144134
await nuxt.callHook('vite:extendConfig', serverConfig, { isClient: false, isServer: true })

0 commit comments

Comments
 (0)