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 613a67ec27ed..677110091cef 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 d100c66e2307..9f5d51fb755a 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 4de2e65a0a28..3820801f3e78 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();