Skip to content

Commit da7c3ae

Browse files
authored
feat: show ws connection error (#9007)
1 parent 05b17df commit da7c3ae

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

packages/vite/src/client/client.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import '@vite/env'
77

88
// injected by the hmr plugin when served
99
declare const __BASE__: string
10+
declare const __SERVER_HOST__: string
1011
declare const __HMR_PROTOCOL__: string | null
1112
declare const __HMR_HOSTNAME__: string | null
1213
declare const __HMR_PORT__: number | null
@@ -20,6 +21,7 @@ console.debug('[vite] connecting...')
2021
const importMetaUrl = new URL(import.meta.url)
2122

2223
// use server configuration, then fallback to inference
24+
const serverHost = __SERVER_HOST__
2325
const socketProtocol =
2426
__HMR_PROTOCOL__ || (location.protocol === 'https:' ? 'wss' : 'ws')
2527
const hmrPort = __HMR_PORT__
@@ -38,7 +40,19 @@ try {
3840
fallback = () => {
3941
// fallback to connecting directly to the hmr server
4042
// for servers which does not support proxying websocket
41-
socket = setupWebSocket(socketProtocol, directSocketHost)
43+
socket = setupWebSocket(socketProtocol, directSocketHost, () => {
44+
const currentScriptHostURL = new URL(import.meta.url)
45+
const currentScriptHost =
46+
currentScriptHostURL.host +
47+
currentScriptHostURL.pathname.replace(/@vite\/client$/, '')
48+
console.error(
49+
'[vite] failed to connect to websocket.\n' +
50+
'your current setup:\n' +
51+
` (browser) ${currentScriptHost} <--[HTTP]--> ${serverHost} (server)\n` +
52+
` (browser) ${socketHost} <--[WebSocket (failing)]--> ${directSocketHost} (server)\n` +
53+
'Check out your Vite / network configuration and https://vitejs.dev/config/server-options.html#server-hmr .'
54+
)
55+
})
4256
socket.addEventListener(
4357
'open',
4458
() => {

packages/vite/src/node/plugins/clientInjections.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
1717
name: 'vite:client-inject',
1818
async transform(code, id, options) {
1919
if (id === normalizedClientEntry || id === normalizedEnvEntry) {
20+
const resolvedServerHostname = (
21+
await resolveHostname(config.server.host)
22+
).name
23+
const resolvedServerPort = config.server.port!
24+
const devBase = config.base
25+
26+
const serverHost = `${resolvedServerHostname}:${resolvedServerPort}${devBase}`
27+
2028
let hmrConfig = config.server.hmr
2129
hmrConfig = isObject(hmrConfig) ? hmrConfig : undefined
2230
const host = hmrConfig?.host || null
@@ -31,10 +39,8 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
3139
port ||= 24678
3240
}
3341

34-
const devBase = config.base
35-
let directTarget =
36-
hmrConfig?.host || (await resolveHostname(config.server.host)).name
37-
directTarget += `:${hmrConfig?.port || config.server.port!}`
42+
let directTarget = hmrConfig?.host || resolvedServerHostname
43+
directTarget += `:${hmrConfig?.port || resolvedServerPort}`
3844
directTarget += devBase
3945

4046
let hmrBase = devBase
@@ -46,6 +52,7 @@ export function clientInjectionsPlugin(config: ResolvedConfig): Plugin {
4652
.replace(`__MODE__`, JSON.stringify(config.mode))
4753
.replace(`__BASE__`, JSON.stringify(devBase))
4854
.replace(`__DEFINES__`, serializeDefine(config.define || {}))
55+
.replace(`__SERVER_HOST__`, JSON.stringify(serverHost))
4956
.replace(`__HMR_PROTOCOL__`, JSON.stringify(protocol))
5057
.replace(`__HMR_HOSTNAME__`, JSON.stringify(host))
5158
.replace(`__HMR_PORT__`, JSON.stringify(port))

0 commit comments

Comments
 (0)