diff --git a/.changeset/red-rivers-approve.md b/.changeset/red-rivers-approve.md new file mode 100644 index 000000000000..7b95003c288f --- /dev/null +++ b/.changeset/red-rivers-approve.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Prevent rerender when route state did not change diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index bd07f012ba6f..b49bc947824a 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -117,6 +117,9 @@ export function create_client({ target, session, base, trailing_slash }) { if (!ready) return; session_id += 1; + const current_load_uses_session = current.branch.some((node) => node?.uses.session); + if (!current_load_uses_session) return; + update(new URL(location.href), [], true); }); ready = true; diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused.svelte new file mode 100644 index 000000000000..1189bedaff07 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused.svelte @@ -0,0 +1,23 @@ + + + + +

{count}

+ diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used.svelte new file mode 100644 index 000000000000..a473de611056 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used.svelte @@ -0,0 +1,24 @@ + + + + +

{count}

+ diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index b64954822ca2..101ef73ed690 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -358,6 +358,18 @@ test.describe('Load', () => { expect(await page.textContent('h2')).toBe('x: b: 2'); }); + test('load function is only called on session change when used in load', async ({ page }) => { + await page.goto('/load/change-detection/session/used'); + expect(await page.textContent('h2')).toBe('1'); + await page.click('button'); + expect(await page.textContent('h2')).toBe('2'); + + await page.goto('/load/change-detection/session/unused'); + expect(await page.textContent('h2')).toBe('1'); + await page.click('button'); + expect(await page.textContent('h2')).toBe('1'); + }); + test('accessing url.hash from load errors and suggests using page store', async ({ page }) => { await page.goto('/load/url-hash#please-dont-send-me-to-load'); expect(await page.textContent('#message')).toBe( diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index a2fbed968578..cc11de1e810f 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -1079,11 +1079,11 @@ test.describe('$app/stores', () => { await page.goto('/store'); expect(await page.textContent('h1')).toBe('Test'); - expect(await page.textContent('h2')).toBe(javaScriptEnabled ? 'Calls: 2' : 'Calls: 1'); + expect(await page.textContent('h2')).toBe('Calls: 1'); await clicknav('a[href="/store/result"]'); expect(await page.textContent('h1')).toBe('Result'); - expect(await page.textContent('h2')).toBe(javaScriptEnabled ? 'Calls: 2' : 'Calls: 0'); + expect(await page.textContent('h2')).toBe(javaScriptEnabled ? 'Calls: 1' : 'Calls: 0'); const oops = await page.evaluate(() => window.oops); expect(oops).toBeUndefined();