diff --git a/packages/vite/src/client.ts b/packages/vite/src/client.ts index a0e32746ecd..84ec262faf9 100644 --- a/packages/vite/src/client.ts +++ b/packages/vite/src/client.ts @@ -4,8 +4,10 @@ import vuePlugin from '@vitejs/plugin-vue' import viteJsxPlugin from '@vitejs/plugin-vue-jsx' import type { Connect } from 'vite' import { logger } from '@nuxt/kit' +import { getPort } from 'get-port-please' import { joinURL, withLeadingSlash, withoutLeadingSlash, withTrailingSlash } from 'ufo' import escapeRE from 'escape-string-regexp' +import defu from 'defu' import { cacheDirPlugin } from './plugins/cache-dir' import { analyzePlugin } from './plugins/analyze' import { wpfs } from './utils/wpfs' @@ -64,6 +66,26 @@ export async function buildClient (ctx: ViteBuildContext) { } } as ViteOptions) + // In build mode we explicitly override any vite options that vite is relying on + // to detect whether to inject production or development code (such as HMR code) + if (!ctx.nuxt.options.dev) { + clientConfig.server.hmr = false + } + + if (clientConfig.server.hmr !== false) { + const hmrPortDefault = 24678 // Vite's default HMR port + const hmrPort = await getPort({ + port: hmrPortDefault, + ports: Array.from({ length: 20 }, (_, i) => hmrPortDefault + 1 + i) + }) + const userHMRConfig = clientConfig.server.hmr === true ? {} : clientConfig.server.hmr + clientConfig.server.hmr = defu(userHMRConfig, { + // https://github.com/nuxt/framework/issues/4191 + protocol: 'ws', + port: hmrPort + }) + } + // Add analyze plugin if needed if (ctx.nuxt.options.build.analyze) { clientConfig.plugins.push(...analyzePlugin(ctx)) diff --git a/packages/vite/src/server.ts b/packages/vite/src/server.ts index ff6add5d36b..aa6857f937c 100644 --- a/packages/vite/src/server.ts +++ b/packages/vite/src/server.ts @@ -95,7 +95,6 @@ export async function buildServer (ctx: ViteBuildContext) { } }, server: { - hmr: false, // https://github.com/vitest-dev/vitest/issues/229#issuecomment-1002685027 preTransformRequests: false }, diff --git a/packages/vite/src/vite.ts b/packages/vite/src/vite.ts index 7ac8649ad7b..28cc05527ed 100644 --- a/packages/vite/src/vite.ts +++ b/packages/vite/src/vite.ts @@ -6,7 +6,6 @@ import { logger, isIgnored } from '@nuxt/kit' import type { Options } from '@vitejs/plugin-vue' import replace from '@rollup/plugin-replace' import { sanitizeFilePath } from 'mlly' -import { getPort } from 'get-port-please' import { buildClient } from './client' import { buildServer } from './server' import virtual from './plugins/virtual' @@ -27,11 +26,6 @@ export interface ViteBuildContext { } export async function bundle (nuxt: Nuxt) { - const hmrPortDefault = 24678 // Vite's default HMR port - const hmrPort = await getPort({ - port: hmrPortDefault, - ports: Array.from({ length: 20 }, (_, i) => hmrPortDefault + 1 + i) - }) const ctx: ViteBuildContext = { nuxt, config: vite.mergeConfig( @@ -78,12 +72,6 @@ export async function bundle (nuxt: Nuxt) { reactivityTransform: nuxt.options.experimental.reactivityTransform }, server: { - hmr: { - // https://github.com/nuxt/framework/issues/4191 - protocol: 'ws', - clientPort: hmrPort, - port: hmrPort - }, watch: { ignored: isIgnored }, fs: { allow: [ @@ -100,7 +88,6 @@ export async function bundle (nuxt: Nuxt) { // to detect whether to inject production or development code (such as HMR code) if (!nuxt.options.dev) { ctx.config.server.watch = undefined - ctx.config.server.hmr = false ctx.config.build.watch = undefined }