From 0a9065981c3df85fb70be943daf434e6d737b716 Mon Sep 17 00:00:00 2001 From: Algoinde Date: Mon, 9 Jan 2023 02:58:43 +0500 Subject: [PATCH 1/3] Update client.js --- packages/kit/src/runtime/client/client.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 6ef4cc0edd72..0ed1ec472dab 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -708,8 +708,8 @@ export function create_client({ target, base }) { /** @type {import('types').ServerData | null} */ let server_data = null; - const url_changed = current.url ? id !== current.url.pathname + current.url.search : false; - const route_changed = current.route ? id !== current.route.id : false; + const url_changed = current.url ? url.pathname + url.search !== current.url.pathname + current.url.search : false; + const route_changed = current.route ? route.id !== current.route.id : false; const invalid_server_nodes = loaders.reduce((acc, loader, i) => { const previous = current.branch[i]; From 10c52b43e13f02832a2b86fcdba0fb6363c7309b Mon Sep 17 00:00:00 2001 From: Algoinde Date: Mon, 9 Jan 2023 03:58:23 +0500 Subject: [PATCH 2/3] Linter complained --- packages/kit/src/runtime/client/client.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 0ed1ec472dab..86f257b6b637 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -708,7 +708,9 @@ export function create_client({ target, base }) { /** @type {import('types').ServerData | null} */ let server_data = null; - const url_changed = current.url ? url.pathname + url.search !== current.url.pathname + current.url.search : false; + const url_changed = current.url + ? url.pathname + url.search !== current.url.pathname + current.url.search + : false; const route_changed = current.route ? route.id !== current.route.id : false; const invalid_server_nodes = loaders.reduce((acc, loader, i) => { From 98bd50d0b00dcfa45b2febf535ad147380ca8b68 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 9 Jan 2023 10:18:27 +0100 Subject: [PATCH 3/3] simplify, test, changeset --- .changeset/sweet-hairs-roll.md | 5 +++++ packages/kit/src/runtime/client/client.js | 4 +--- .../routes/load/invalidation/route/shared/+layout.js | 2 +- .../load/invalidation/route/shared/+layout.svelte | 4 ++++ .../load/invalidation/route/shared/[x]/+page.svelte | 1 + packages/kit/test/apps/basics/test/client.test.js | 10 ++++++++++ 6 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 .changeset/sweet-hairs-roll.md create mode 100644 packages/kit/test/apps/basics/src/routes/load/invalidation/route/shared/[x]/+page.svelte diff --git a/.changeset/sweet-hairs-roll.md b/.changeset/sweet-hairs-roll.md new file mode 100644 index 000000000000..fb969c331a14 --- /dev/null +++ b/.changeset/sweet-hairs-roll.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix route id comparison for load change detection diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 86f257b6b637..69fb5e4f1481 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -708,9 +708,7 @@ export function create_client({ target, base }) { /** @type {import('types').ServerData | null} */ let server_data = null; - const url_changed = current.url - ? url.pathname + url.search !== current.url.pathname + current.url.search - : false; + const url_changed = current.url ? id !== current.url.pathname + current.url.search : false; const route_changed = current.route ? route.id !== current.route.id : false; const invalid_server_nodes = loaders.reduce((acc, loader, i) => { diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/route/shared/+layout.js b/packages/kit/test/apps/basics/src/routes/load/invalidation/route/shared/+layout.js index b37c81283415..a144dc36277f 100644 --- a/packages/kit/test/apps/basics/src/routes/load/invalidation/route/shared/+layout.js +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/route/shared/+layout.js @@ -1,4 +1,4 @@ /** @type {import('./$types').LayoutLoad} */ export function load({ route }) { - return { route }; + return { route, random: Math.random() }; } diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/route/shared/+layout.svelte b/packages/kit/test/apps/basics/src/routes/load/invalidation/route/shared/+layout.svelte index 2f2c178acc27..3346ea43f1db 100644 --- a/packages/kit/test/apps/basics/src/routes/load/invalidation/route/shared/+layout.svelte +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/route/shared/+layout.svelte @@ -4,7 +4,11 @@

route.id: {data.route.id}

+

random id: {data.random}

/load/invalidation/route/shared/a /load/invalidation/route/shared/b + +/load/invalidation/route/shared/unchanged-x +/load/invalidation/route/shared/unchanged-y diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/route/shared/[x]/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/invalidation/route/shared/[x]/+page.svelte new file mode 100644 index 000000000000..ae59943f071d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/route/shared/[x]/+page.svelte @@ -0,0 +1 @@ +

[x]

diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index d6bf2f9b18e4..0a8cc4c66fed 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -1069,6 +1069,16 @@ test.describe('Invalidation', () => { expect(await page.textContent('h1')).toBe('route.id: /load/invalidation/route/shared/b'); }); + test('route.id does not rerun layout if unchanged', async ({ page, clicknav }) => { + await page.goto('/load/invalidation/route/shared/unchanged-x'); + expect(await page.textContent('h1')).toBe('route.id: /load/invalidation/route/shared/[x]'); + const id = await page.textContent('h2'); + + await clicknav('[href="/load/invalidation/route/shared/unchanged-y"]'); + expect(await page.textContent('h1')).toBe('route.id: /load/invalidation/route/shared/[x]'); + expect(await page.textContent('h2')).toBe(id); + }); + test('$page.url can safely be mutated', async ({ page }) => { await page.goto('/load/mutated-url?q=initial'); await expect(page.getByText('initial')).toBeVisible();