From af01c6e46666ab10625f31d1f6b9ff2e4d046f1c Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Thu, 9 Oct 2025 15:41:11 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F(service-worker)=20improve=20?= =?UTF-8?q?SW=20registration=20and=20update=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is apparently a bad practice to add the version number to the service worker file name. This prevents the browser from properly updating the service worker when a new version is available. We improve the update handling by a more usual pattern. --- CHANGELOG.md | 1 + .../service-worker/__tests__/useSWRegister.test.tsx | 6 ++---- .../features/service-worker/hooks/useSWRegister.tsx | 10 ++++++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73b87c63b4..454569217a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ and this project adheres to - ♿ add h1 for SR on 40X pages and remove alt texts #1438 - ♿ update labels and shared document icon accessibility #1442 - 🍱(frontend) Fonts GDPR compliants #1453 +- ♻️(service-worker) improve SW registration and update handling #1473 ### Fixed diff --git a/src/frontend/apps/impress/src/features/service-worker/__tests__/useSWRegister.test.tsx b/src/frontend/apps/impress/src/features/service-worker/__tests__/useSWRegister.test.tsx index cb01219d8d..2e033be320 100644 --- a/src/frontend/apps/impress/src/features/service-worker/__tests__/useSWRegister.test.tsx +++ b/src/frontend/apps/impress/src/features/service-worker/__tests__/useSWRegister.test.tsx @@ -11,7 +11,6 @@ const TestComponent = () => { describe('useSWRegister', () => { it('checks service-worker is register', () => { - process.env.NEXT_PUBLIC_BUILD_ID = '123456'; vi.spyOn(console, 'error').mockImplementation(() => {}); const registerSpy = vi.fn(); @@ -35,7 +34,7 @@ describe('useSWRegister', () => { render(); - expect(registerSpy).toHaveBeenCalledWith('/service-worker.js?v=123456'); + expect(registerSpy).toHaveBeenCalledWith('/service-worker.js'); expect(addEventListenerSpy).toHaveBeenCalledWith( 'controllerchange', expect.any(Function), @@ -44,7 +43,6 @@ describe('useSWRegister', () => { it('checks service-worker is not register', () => { process.env.NEXT_PUBLIC_SW_DEACTIVATED = 'true'; - process.env.NEXT_PUBLIC_BUILD_ID = '123456'; const registerSpy = vi.fn(); registerSpy.mockImplementation( @@ -62,6 +60,6 @@ describe('useSWRegister', () => { render(); - expect(registerSpy).not.toHaveBeenCalledWith('/service-worker.js?v=123456'); + expect(registerSpy).not.toHaveBeenCalledWith('/service-worker.js'); }); }); diff --git a/src/frontend/apps/impress/src/features/service-worker/hooks/useSWRegister.tsx b/src/frontend/apps/impress/src/features/service-worker/hooks/useSWRegister.tsx index 5021862de1..998dab944c 100644 --- a/src/frontend/apps/impress/src/features/service-worker/hooks/useSWRegister.tsx +++ b/src/frontend/apps/impress/src/features/service-worker/hooks/useSWRegister.tsx @@ -7,7 +7,7 @@ export const useSWRegister = () => { process.env.NEXT_PUBLIC_SW_DEACTIVATED !== 'true' ) { navigator.serviceWorker - .register(`/service-worker.js?v=${process.env.NEXT_PUBLIC_BUILD_ID}`) + .register(`/service-worker.js`) .then((registration) => { registration.onupdatefound = () => { const newWorker = registration.installing; @@ -29,11 +29,13 @@ export const useSWRegister = () => { console.error('Service worker registration failed:', err); }); - const currentController = navigator.serviceWorker.controller; + let refreshing = false; const onControllerChange = () => { - if (currentController) { - window.location.reload(); + if (refreshing) { + return; } + refreshing = true; + window.location.reload(); }; navigator.serviceWorker.addEventListener( 'controllerchange',