SvelteKit предоставляет мощный и гибкий подход к работе с данными в браузере, включая работу с localStorage. LocalStorage — это механизм веб-хранилища, который позволяет сохранять данные в виде ключ-значение на стороне клиента и обеспечивает их доступ между перезагрузками страницы. В отличие от sessionStorage, данные в localStorage сохраняются постоянно, пока не будут удалены вручную или через код.
LocalStorage доступен только в клиентском окружении,
что важно учитывать при работе с SvelteKit, так как серверный рендеринг
(SSR) не имеет доступа к объекту window.
Простейший пример записи и чтения данных:
// Запись данных
localStorage.setItem('username', 'Ivan');
// Чтение данных
const username = localStorage.getItem('username');
console.log(username); // "Ivan"
// Удаление данных
localStorage.removeItem('username');
// Полная очистка localStorage
localStorage.clear();
В SvelteKit удобно использовать реактивные переменные и stores для синхронизации состояния с localStorage. Основной подход — создать store, который автоматически читает и записывает данные в localStorage.
import { writable } from 'svelte/store';
function localStorageStore(key, initialValue) {
const storedValue = typeof window !== 'undefined'
? localStorage.getItem(key)
: null;
const store = writable(storedValue ? JSON.parse(storedValue) : initialValue);
store.subscribe((value) => {
if (typeof window !== 'undefined') {
localStorage.setItem(key, JSON.stringify(value));
}
});
return store;
}
// Использование
export const username = localStorageStore('username', 'Гость');
Преимущества такого подхода:
Работа с localStorage может вызвать ошибки в некоторых ситуациях:
Рекомендуется оборачивать доступ в блок try/catch:
function safeSetItem(key, value) {
try {
localStorage.setItem(key, JSON.stringify(value));
} catch (e) {
console.warn(`Не удалось записать в localStorage: ${e}`);
}
}
function safeGetItem(key, defaultValue = null) {
try {
const item = localStorage.getItem(key);
return item ? JSON.parse(item) : defaultValue;
} catch (e) {
console.warn(`Не удалось прочитать localStorage: ${e}`);
return defaultValue;
}
}
LocalStorage поддерживает событие storage, которое
срабатывает в других вкладках браузера при изменении данных. Это
позволяет синхронизировать состояние между открытыми окнами:
window.addEventListener('storage', (event) => {
if (event.key === 'username') {
console.log('Новое значение username:', event.newValue);
}
});
В связке с SvelteKit store можно обновлять локальное состояние:
window.addEventListener('storage', (event) => {
if (event.key === 'username') {
username.set(event.newValue ? JSON.parse(event.newValue) : 'Гость');
}
});
Stores на базе localStorage удобно использовать для реализации:
Пример привязки к переключателю темы:
<script>
import { writable } from 'svelte/store';
const theme = localStorageStore('theme', 'light');
function toggleTheme() {
theme.update(value => value === 'light' ? 'dark' : 'light');
}
</script>
<button on:click={toggleTheme}>
Переключить тему
</button>
<style>
:global(body.light) { background: #fff; color: #000; }
:global(body.dark) { background: #121212; color: #fff; }
</style>
<script>
$: document.body.className = $theme;
</script>
window перед доступом к
localStorage, чтобы избежать ошибок на сервере.Можно комбинировать localStorage с SvelteKit endpoints, чтобы данные синхронизировались с сервером при необходимости:
Такая схема позволяет создавать offline-friendly приложения, где пользовательский интерфейс остаётся интерактивным даже без подключения к интернету, а данные сохраняются между сессиями.