diff --git a/packages/nuxi/src/commands/dev-child.ts b/packages/nuxi/src/commands/dev-child.ts index 70d967815..ea333ae43 100644 --- a/packages/nuxi/src/commands/dev-child.ts +++ b/packages/nuxi/src/commands/dev-child.ts @@ -60,7 +60,7 @@ export default defineCommand({ hostname: devContext.hostname, public: devContext.public, https: devContext.proxy?.https, - })) + }, devContext.publicURLs)) // Init Nuxt dev const nuxtDev = await createNuxtDevServer({ diff --git a/packages/nuxi/src/commands/dev.ts b/packages/nuxi/src/commands/dev.ts index a66106b4c..8ef82f75c 100644 --- a/packages/nuxi/src/commands/dev.ts +++ b/packages/nuxi/src/commands/dev.ts @@ -193,6 +193,7 @@ async function _startSubprocess(devProxy: DevProxy, rawArgs: string[], listenArg __NUXT_DEV__: JSON.stringify({ hostname: listenArgs.hostname, public: listenArgs.public, + publicURLs: await devProxy.listener.getURLs().then(r => r.map(r => r.url)), proxy: { url: devProxy.listener.url, urls: await devProxy.listener.getURLs(), diff --git a/packages/nuxi/src/utils/dev.ts b/packages/nuxi/src/utils/dev.ts index 8f56faa88..581fc1ee8 100644 --- a/packages/nuxi/src/utils/dev.ts +++ b/packages/nuxi/src/utils/dev.ts @@ -9,6 +9,7 @@ import EventEmitter from 'node:events' import process from 'node:process' import chokidar from 'chokidar' +import defu from 'defu' import { toNodeListener } from 'h3' import { createJiti } from 'jiti' import { listen } from 'listhen' @@ -30,6 +31,7 @@ export type NuxtDevIPCMessage = export interface NuxtDevContext { public?: boolean hostname?: string + publicURLs?: string[] proxy?: { url?: string urls?: ListenURL[] @@ -177,6 +179,8 @@ class NuxtDevServer extends EventEmitter { } const kit = await loadKit(this.options.cwd) + + this.options.overrides = defu(this.options.overrides, _getDevServerOverrides({}, await this.listener.getURLs().then(r => r.map(r => r.url)))) this._currentNuxt = await kit.loadNuxt({ cwd: this.options.cwd, dev: true, @@ -184,15 +188,16 @@ class NuxtDevServer extends EventEmitter { envName: this.options.envName, overrides: { logLevel: this.options.logLevel as 'silent' | 'info' | 'verbose', - vite: { - clearScreen: this.options.clear, - }, nitro: { devErrorHandler: (error, event) => { this._renderError(event.node.res, error) }, }, ...this.options.overrides, + vite: { + clearScreen: this.options.clear, + ...this.options.overrides.vite, + }, }, }) @@ -341,14 +346,18 @@ function _getAddressURL(addr: AddressInfo, https: boolean) { return `${proto}://${host}:${port}/` } -export function _getDevServerOverrides(listenOptions: Partial>) { +export function _getDevServerOverrides(listenOptions: Partial>, urls: string[] = []) { const defaultOverrides: Partial = {} + if (urls) { + defaultOverrides.vite = { server: { allowedHosts: urls.map(u => new URL(u).hostname) } } + } + // defined hostname if (listenOptions.hostname) { const protocol = listenOptions.https ? 'https' : 'http' - defaultOverrides.devServer = { cors: { origin: [`${protocol}://${listenOptions.hostname}`] } } - defaultOverrides.vite = { server: { allowedHosts: [listenOptions.hostname] } } + defaultOverrides.devServer = { cors: { origin: [`${protocol}://${listenOptions.hostname}`, ...urls] } } + defaultOverrides.vite = defu(defaultOverrides.vite, { server: { allowedHosts: [listenOptions.hostname] } }) } if (listenOptions.public) {