Skip to content

Commit

Permalink
[fix] don't cache prefetch errors (#7610)
Browse files Browse the repository at this point in the history
Fixes #6709
  • Loading branch information
dummdidumm committed Nov 11, 2022
1 parent 8fb0140 commit 62fbbd7
Show file tree
Hide file tree
Showing 11 changed files with 46 additions and 65 deletions.
5 changes: 5 additions & 0 deletions .changeset/serious-buttons-push.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': patch
---

[fix] don't cache prefetch errors
11 changes: 10 additions & 1 deletion packages/kit/src/runtime/client/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,16 @@ export function create_client({ target, base, trailing_slash }) {
throw new Error(`Attempted to prefetch a URL that does not belong to this app: ${url}`);
}

load_cache = { id: intent.id, promise: load_route(intent) };
load_cache = {
id: intent.id,
promise: load_route(intent).then((result) => {
if (result.type === 'loaded' && result.state.error) {
// Don't cache errors, because they might be transient
load_cache = null;
}
return result;
})
};

return load_cache.promise;
}
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
let throw_error = false;

/** @type {import('@sveltejs/kit').Load} */
export async function load() {
throw_error = !throw_error;
if (throw_error) {
throw new Error('error');
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<p>hello</p>
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/** @type {import('@sveltejs/kit').Load} */
export async function load({ fetch }) {
const message = await fetch('/routing/prefetched.json').then((r) => r.json());
const message = await fetch('/routing/prefetching/prefetched.json').then((r) => r.json());
return { message };
}
32 changes: 20 additions & 12 deletions packages/kit/test/apps/basics/test/client.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -666,8 +666,8 @@ test.describe('Prefetching', () => {
// also wait for network processing to complete, see
// https://playwright.dev/docs/network#network-events
await Promise.all([
page.waitForResponse(`${baseURL}/routing/prefetched.json`),
app.prefetch('/routing/prefetched')
page.waitForResponse(`${baseURL}/routing/prefetching/prefetched.json`),
app.prefetch('/routing/prefetching/prefetched')
]);

// svelte request made is environment dependent
Expand All @@ -679,10 +679,10 @@ test.describe('Prefetching', () => {
expect(requests.filter((req) => req.endsWith('.js')).length).toBeGreaterThan(0);
}

expect(requests.includes(`${baseURL}/routing/prefetched.json`)).toBe(true);
expect(requests.includes(`${baseURL}/routing/prefetching/prefetched.json`)).toBe(true);

requests = [];
await app.goto('/routing/prefetched');
await app.goto('/routing/prefetching/prefetched');
expect(requests).toEqual([]);

try {
Expand All @@ -698,28 +698,36 @@ test.describe('Prefetching', () => {
page
}) => {
await page.goto('/routing/a');
await app.prefetch('/routing/prefetched/hash-route#please-dont-show-me');
await app.goto('/routing/prefetched/hash-route');
await app.prefetch('/routing/prefetching/hash-route#please-dont-show-me');
await app.goto('/routing/prefetching/hash-route');
await expect(page.locator('h1')).not.toHaveText('Oopsie');
});

test('does not rerun load on calls to duplicate preload hash route', async ({ app, page }) => {
await page.goto('/routing/a');

await app.prefetch('/routing/prefetched/hash-route#please-dont-show-me');
await app.prefetch('/routing/prefetched/hash-route#please-dont-show-me');
await app.goto('/routing/prefetched/hash-route#please-dont-show-me');
await app.prefetch('/routing/prefetching/hash-route#please-dont-show-me');
await app.prefetch('/routing/prefetching/hash-route#please-dont-show-me');
await app.goto('/routing/prefetching/hash-route#please-dont-show-me');
await expect(page.locator('p')).toHaveText('Loaded 1 times.');
});

test('does not rerun load on calls to different preload hash route', async ({ app, page }) => {
await page.goto('/routing/a');

await app.prefetch('/routing/prefetched/hash-route#please-dont-show-me');
await app.prefetch('/routing/prefetched/hash-route#please-dont-show-me-jr');
await app.goto('/routing/prefetched/hash-route#please-dont-show-me');
await app.prefetch('/routing/prefetching/hash-route#please-dont-show-me');
await app.prefetch('/routing/prefetching/hash-route#please-dont-show-me-jr');
await app.goto('/routing/prefetching/hash-route#please-dont-show-me');
await expect(page.locator('p')).toHaveText('Loaded 1 times.');
});

test('does rerun load when prefetch errored', async ({ app, page }) => {
await page.goto('/routing/a');

await app.prefetch('/routing/prefetching/prefetch-error');
await app.goto('/routing/prefetching/prefetch-error');
await expect(page.locator('p')).toHaveText('hello');
});
});

test.describe('Routing', () => {
Expand Down

0 comments on commit 62fbbd7

Please sign in to comment.