😕 Как localStorage может сломать ваш сайт или приложение
Многие не знают, но обращение к
Ошибки могут возникать по двум основным причинам: при записи или при доступе к хранилищу.
──
📦 Ошибка при записи —
Самая распространённая проблема. Происходит, когда вы пытаетесь записать слишком много данных.
▪️ Что происходит:
▪️ Почему:
Браузер выделяет под данные сайта ограниченное место — обычно около 5–10 МБ. Если попытаться записать больше, то браузер заблокирует операцию.
▪️ Пример:
──
🛡 Ошибка при доступе —
Более коварная ошибка. Может возникнуть даже при чтении
▪️ Что происходит:
Даже попытка выполнить
▪️ Почему:
Браузер полностью заблокировал доступ к хранилищу из соображений приватности.
▪️ Основные причины:
— Пользователь отключил cookies и данные сайтов в настройках.
— Используется режим инкогнито (в некоторых браузерах он блокирует
— Скрипт выполняется внутри sandboxed iframe без
▪️ Пример:
──
🤔 Как защититься?
В одной из моих библиотек я реализовал класс
Такой подход гарантирует, что приложение не упадёт при любых ошибках доступа к storage.
👉 Посмотреть реализацию можно здесь:
https://github.com/webeach/react-hooks/blob/main/src/classes/SafeStorage/SafeStorage.ts
──
💡 Совет
Если вы используете
Также вы можете воспользоваться готовыми безопасными хуками из моей библиотеки
▪️ Документация хуков:
— useLocalStorage
— useSessionStorage
#javascript #frontend #react
Многие не знают, но обращение к
localStorage или sessionStorage может вызвать ошибку — и ваш сайт внезапно упадёт.Ошибки могут возникать по двум основным причинам: при записи или при доступе к хранилищу.
──
📦 Ошибка при записи —
QuotaExceededErrorСамая распространённая проблема. Происходит, когда вы пытаетесь записать слишком много данных.
▪️ Что происходит:
localStorage.setItem() падает с ошибкой QuotaExceededError (или DOMException с этим именем), если лимит хранилища превышен.▪️ Почему:
Браузер выделяет под данные сайта ограниченное место — обычно около 5–10 МБ. Если попытаться записать больше, то браузер заблокирует операцию.
▪️ Пример:
try {
localStorage.setItem('my_data', '...очень много данных...');
} catch (error) {
const isQuotaError =
error &&
(
error.name === 'QuotaExceededError' || // стандарт
error.name === 'NS_ERROR_DOM_QUOTA_REACHED' || // Firefox
error.code === 22 || // старый WebKit
error.code === 1014 // Firefox старый
);
if (isQuotaError) {
console.log('Переполнено localStorage');
} else {
console.log('Другая ошибка:', error);
}
}──
🛡 Ошибка при доступе —
SecurityErrorБолее коварная ошибка. Может возникнуть даже при чтении
window.localStorage.▪️ Что происходит:
Даже попытка выполнить
const storage = window.localStorage; может выбросить SecurityError.▪️ Почему:
Браузер полностью заблокировал доступ к хранилищу из соображений приватности.
▪️ Основные причины:
— Пользователь отключил cookies и данные сайтов в настройках.
— Используется режим инкогнито (в некоторых браузерах он блокирует
localStorage).— Скрипт выполняется внутри sandboxed iframe без
allow-storage.▪️ Пример:
let storage;
try {
storage = window.localStorage;
storage.setItem('__test__', '1');
storage.removeItem('__test__');
} catch (e) {
console.error('Ошибка: хранилище недоступно!', e.name);
// используем in-memory fallback
}
──
🤔 Как защититься?
В одной из моих библиотек я реализовал класс
SafeStorage, который оборачивает все операции с хранилищем в try/catch. Такой подход гарантирует, что приложение не упадёт при любых ошибках доступа к storage.
👉 Посмотреть реализацию можно здесь:
https://github.com/webeach/react-hooks/blob/main/src/classes/SafeStorage/SafeStorage.ts
──
💡 Совет
Если вы используете
localStorage или sessionStorage в React‑приложении, лучше вынести всю работу с ними в отдельный хук. Там можно централизованно обработать ошибки, создать fallback‑хранилище и гарантировать, что приложение не упадёт даже в самых неожиданных сценариях.Также вы можете воспользоваться готовыми безопасными хуками из моей библиотеки
@webeach/react-hooks:import { useLocalStorage } from '@webeach/react-hooks/useLocalStorage';
import { useSessionStorage } from '@webeach/react-hooks/useSessionStorage';
export function MyComponent() {
const [count, setCount] = useLocalStorage<number>('app:count', 0);
const [step, setStep] = useSessionStorage<number>('wizard:step', 1);
// ...
}▪️ Документация хуков:
— useLocalStorage
— useSessionStorage
#javascript #frontend #react
👍2
🔥 Представляю всем мою новую библиотеку небольшого расширения React
Вдохновился
──
🤔 Зачем это нужно?
Если ты устал от:
▫️
▫️ сложных
▫️ трудной работы с css-переменными при разработке UI-компонентов
…то react-x закрывает эти боли прямо на уровне JSX.
──
✨ Возможности
▪️ Удобная работа с классами
▪️ Работа с inline-стилями теперь проще и читабельнее:
▪️ CSS-переменные больше не "боль"
в стилях:
──
📦 Установка
──
📚 Документация
Полная документация и примеры доступны на английском и на русском языках:
👉 https://github.com/webeach/react-x
#frontend #javascript #react
react-x — небольшая либа, которая прокачивает JSX для работы с CSS-классами, стилями и CSS-переменными без лишнего шума, хаков и кастомных хелперов.Вдохновился
svelte 🙃──
🤔 Зачем это нужно?
Если ты устал от:
▫️
clsx(className, condition && styles.container)▫️ сложных
style объектов▫️ трудной работы с css-переменными при разработке UI-компонентов
…то react-x закрывает эти боли прямо на уровне JSX.
──
✨ Возможности
▪️ Удобная работа с классами
<x.div
class:container
class:disabled={isDisabled}
/>
// или
<x.div
classList={['container', isDisabled && 'disabled']}
/>
▪️ Работа с inline-стилями теперь проще и читабельнее:
<x.div
style:backgroundColor="blue"
style:width={100}
style:height={100}
/>
▪️ CSS-переменные больше не "боль"
<x.div
class:container
var:bg="blue"
var:size="100px"
/>
в стилях:
.container {
background-color: var(--bg);
width: var(--size);
height: var(--size);
}──
📦 Установка
npm install @webeach/react-x
──
📚 Документация
Полная документация и примеры доступны на английском и на русском языках:
👉 https://github.com/webeach/react-x
#frontend #javascript #react
1🔥4