From 62af5bc32665a712e72d3a35b347f84d89119e1b Mon Sep 17 00:00:00 2001 From: sapphi-red Date: Sun, 2 Apr 2023 20:20:35 +0900 Subject: [PATCH 1/5] feat: skip pinging the server when the tab is not shown --- packages/vite/src/client/client.ts | 43 +++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/packages/vite/src/client/client.ts b/packages/vite/src/client/client.ts index ee8cd5c855d544..5f298aeb03a68a 100644 --- a/packages/vite/src/client/client.ts +++ b/packages/vite/src/client/client.ts @@ -315,23 +315,48 @@ async function waitForSuccessfulPing( ) { const pingHostProtocol = socketProtocol === 'wss' ? 'https' : 'http' - // eslint-disable-next-line no-constant-condition - while (true) { + const ping = async () => { + // A fetch on a websocket URL will return a successful promise with status 400, + // but will reject a networking error. + // When running on middleware mode, it returns status 426, and an cors error happens if mode is not no-cors try { - // A fetch on a websocket URL will return a successful promise with status 400, - // but will reject a networking error. - // When running on middleware mode, it returns status 426, and an cors error happens if mode is not no-cors await fetch(`${pingHostProtocol}://${hostAndPath}`, { mode: 'no-cors', }) - break - } catch (e) { - // wait ms before attempting to ping again - await new Promise((resolve) => setTimeout(resolve, ms)) + return true + } catch {} + return false + } + + // eslint-disable-next-line no-constant-condition + while (true) { + if (document.visibilityState === 'visible') { + if (await ping()) { + break + } + await wait(ms) + } else { + await Promise.race([wait(ms), waitForWindowShow()]) } } } +function wait(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)) +} + +function waitForWindowShow() { + return new Promise((resolve) => { + const onChange = async () => { + if (document.visibilityState === 'visible') { + resolve() + document.removeEventListener('visibilitychange', onChange) + } + } + document.addEventListener('visibilitychange', onChange) + }) +} + const sheetsMap = new Map() // all css imports should be inserted at the same position // because after build it will be a single css file From 462597b43c219f29d28ed8e91f5168289574fdd1 Mon Sep 17 00:00:00 2001 From: sapphi-red Date: Mon, 3 Apr 2023 16:59:13 +0900 Subject: [PATCH 2/5] fix: avoid creating multiple promises --- packages/vite/src/client/client.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/client/client.ts b/packages/vite/src/client/client.ts index 5f298aeb03a68a..7ce07befc13241 100644 --- a/packages/vite/src/client/client.ts +++ b/packages/vite/src/client/client.ts @@ -328,6 +328,8 @@ async function waitForSuccessfulPing( return false } + let waitForWindowShowPromise: Promise | undefined + // eslint-disable-next-line no-constant-condition while (true) { if (document.visibilityState === 'visible') { @@ -336,7 +338,12 @@ async function waitForSuccessfulPing( } await wait(ms) } else { - await Promise.race([wait(ms), waitForWindowShow()]) + if (!waitForWindowShowPromise) { + waitForWindowShowPromise = waitForWindowShow().then(() => { + waitForWindowShowPromise = undefined + }) + } + await Promise.race([wait(ms), waitForWindowShowPromise]) } } } From bbf3ae5750a95ae4e03adcad3714cf5905527784 Mon Sep 17 00:00:00 2001 From: sapphi-red Date: Mon, 3 Apr 2023 17:06:29 +0900 Subject: [PATCH 3/5] feat: try ping once always --- packages/vite/src/client/client.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/vite/src/client/client.ts b/packages/vite/src/client/client.ts index 7ce07befc13241..210ab58ca53048 100644 --- a/packages/vite/src/client/client.ts +++ b/packages/vite/src/client/client.ts @@ -328,6 +328,10 @@ async function waitForSuccessfulPing( return false } + if (await ping()) { + return + } + let waitForWindowShowPromise: Promise | undefined // eslint-disable-next-line no-constant-condition From 31f65ac181591ae30efcf0af857a9165b660b8a6 Mon Sep 17 00:00:00 2001 From: sapphi-red Date: Mon, 3 Apr 2023 17:10:57 +0900 Subject: [PATCH 4/5] refactor: just use `waitForWindowShow` --- packages/vite/src/client/client.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/vite/src/client/client.ts b/packages/vite/src/client/client.ts index 210ab58ca53048..cbbbc8b4b46745 100644 --- a/packages/vite/src/client/client.ts +++ b/packages/vite/src/client/client.ts @@ -332,8 +332,6 @@ async function waitForSuccessfulPing( return } - let waitForWindowShowPromise: Promise | undefined - // eslint-disable-next-line no-constant-condition while (true) { if (document.visibilityState === 'visible') { @@ -342,12 +340,7 @@ async function waitForSuccessfulPing( } await wait(ms) } else { - if (!waitForWindowShowPromise) { - waitForWindowShowPromise = waitForWindowShow().then(() => { - waitForWindowShowPromise = undefined - }) - } - await Promise.race([wait(ms), waitForWindowShowPromise]) + await waitForWindowShow() } } } From 343911bdec4043088c404814a477c0f6d786c8ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Mon, 3 Apr 2023 17:46:47 +0900 Subject: [PATCH 5/5] fix: wait after first ping --- packages/vite/src/client/client.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vite/src/client/client.ts b/packages/vite/src/client/client.ts index cbbbc8b4b46745..1818dda65eef98 100644 --- a/packages/vite/src/client/client.ts +++ b/packages/vite/src/client/client.ts @@ -331,6 +331,7 @@ async function waitForSuccessfulPing( if (await ping()) { return } + await wait(ms) // eslint-disable-next-line no-constant-condition while (true) {