В SvelteKit важную роль играет эффективное управление кэшем, особенно при работе с динамическими данными и интеграцией с API. Кэширование позволяет сократить количество запросов к серверу, ускорить загрузку страниц и уменьшить нагрузку на backend.
Кэш может быть реализован на нескольких уровнях:
Cache-Control, ETag и
Last-Modified.IndexedDB/localStorage.SvelteKit предоставляет гибкие возможности для контроля кэширования
через функции load, endpoints и адаптеры, позволяя
комбинировать подходы на стороне клиента и сервера.
stale-while-revalidate (SWR) — стратегия кэширования, при которой клиент получает старые данные из кэша немедленно, а одновременно инициируется обновление данных в фоне. После завершения обновления кэш заменяется свежими данными, и компонент повторно рендерится с актуальной информацией.
Преимущества SWR:
load с кэшированиемВ SvelteKit load функции можно возвращать объект с
данными и заголовками кэширования. Например:
export async function load({ fetch, setHeaders }) {
const res = await fetch('/api/posts');
const posts = await res.json();
// Настройка кэширования: 60 секунд свежих данных, 120 секунд stale
setHeaders({
'Cache-Control': 'max-age=60, stale-while-revalidate=120'
});
return { posts };
}
Разбор параметров:
max-age=60 — время жизни кэша в секундах (данные
считаются свежими).stale-while-revalidate=120 — период, когда устаревшие
данные остаются допустимыми, пока происходит обновление.Можно создать store на основе writable с автоматическим
обновлением:
import { writable } from 'svelte/store';
function createSWR(url) {
const { subscribe, set } = writable(null);
async function fetchData() {
const res = await fetch(url);
const data = await res.json();
set(data);
}
fetchData(); // начальный запрос
const interval = setInterval(fetchData, 30000); // обновление каждые 30 секунд
return {
subscribe,
refresh: fetchData,
stop: () => clearInterval(interval)
};
}
export const postsStore = createSWR('/api/posts');
Такой подход позволяет:
Компоненты могут подписываться на store и реагировать на изменения данных:
<script>
import { postsStore } from './stores/postsStore.js';
</script>
{#if $postsStore}
<ul>
{#each $postsStore as post}
<li>{post.title}</li>
{/each}
</ul>
{:else}
<p>Загрузка данных...</p>
{/if}
В данном случае UI мгновенно отображает последние кэшированные данные, а после завершения фонового обновления автоматически перерисовывается.
Endpoints SvelteKit позволяют задавать кэширование непосредственно на
уровне API. Пример с stale-while-revalidate:
export async function GET() {
const posts = await fetchPostsFromDatabase();
return new Response(JSON.stringify(posts), {
headers: {
'Cache-Control': 'public, max-age=60, stale-while-revalidate=120',
'Content-Type': 'application/json'
}
});
}
Это позволяет:
max-age и stale-while-revalidate в зависимости
от критичности данных.Эффективная реализация SWR в SvelteKit повышает отзывчивость интерфейса, снижает нагрузку на сервер и обеспечивает пользователю всегда актуальные данные без задержек.