Что происходит при переполнении localStorage в браузере?
Быстрый ответ
Когда объём данных в localStorage
достигает своего лимита, любой последующий вызов метода setItem
приведёт к возникновению ошибки типа QuotaExceededError
. Для обработки подобной ситуации следует произвести оборачивание вызова функции setItem
в блок try-catch
. В случае, если произойдёт ошибка, управление перейдёт в блок catch
, где можно осуществить удаление ненужной информации или уведомить пользователя о возникновении проблемы.
try {
localStorage.setItem('key', 'value'); // Попытка добавить данные
} catch (e) {
if (e instanceof DOMException && e.code === 22) {
// Объем хранилища исчерпан, пора предпринимать действия
alert('В хранилище localStorage недостаточно места. Попробуйте освободить некоторое пространство.');
}
}
Различия в браузерах
Объем хранилища localStorage, которым распоряжаются браузеры, может отличаться. На десктопных системах это часто ограничивается 5Мб на один домен, причём у пользователя может отсутствовать возможность менять данный лимит. Если говорить конкретнее, в Opera можно увеличить размер хранилища, в то время как в Chrome он фиксирован и не может быть изменён.
Ошибки и их обработка
Ситуация с переполнением хранилища требует включения обработки исключений для случаев, когда размер хранилища превышен. Метод getItem(key)
позволит извлечь из хранилища данные, которые остались нетронутыми в процессе работы.
Моменты до нависшего кризиса
Задача разработчика заключается в предугадывании моментов переполнения localStorage и применении таких решений, как:
- Предложение пользователю удалить часть данных — это вариант с соблюдением этикета.
- Очистка старых или неважных данных — практичный подход.
- Перемещение данных на сервер или использование IndexedDB — перспективное решение.
Визуализация
Воображаем иллюстрацию для localStorage, где его переполнение сравнивается с автобусом, куда больше не влезает людей:
Общественный транспорт: 🚍[нет свободных мест]👨👨👦👦🧑🤝🧑👩👩👦👦
Попытка добавить новый элемент (setItem
):
localStorage.setItem('newData', 'value'); // 🧕
В результате происходит:
**ОШИБКА**: 🚨🚫 "QuotaExceededError"
Точно также, как в переполненный автобус не возьмут ещё пассажира, переполненное localStorage не примет новых данных.
Автоматического управления хранилищем не предусмотрено
В браузерах не предусмотрена функция автоматической очистки localStorage. Старые данные не будут автоматически удалены. Логика управления требует:
- Реализации стратегии удаления данных по определенному расписанию.
- Внедрение меток времени для идентификации и удаления устаревших данных.
- Использование событий для отслеживания состояния хранилища.
Лучшие практики работы с хранилищем
Чтобы ваше веб-приложение работало надёжно, стоит придерживаться следующих наилучших практик:
- Мониторить
остаточное пространство
— так же, как смотрим, какие суммы находятся в кошельке перед оформлением покупки. - Разрабатывать
обработчики ошибок
, аналогично наличию спасательного круга на корабле. - Информировать пользователей о
особенностях браузеров
— чтобы они полностью контролировали свои данные. - Проводить тестирование приложения для проверки
вместимости хранилища
, например, через Web Storage Support Test — чтобы убедиться в его надёжности.
Полезные материалы
- Window: localStorage property – Web APIs | MDN — детальная информация про механизмы работы и поведение
localStorage
. - javascript – What is the max size of localStorage values? – Stack Overflow — обсуждение максимального размера
localStorage
. - HTML Web Storage API — описание и руководство по использованию веб-хранилища HTML5.
- Local Storage – Dive Into HTML5 — глубокий анализ API local storage.
- "localStorage" | Can I use... Support tables for HTML5, CSS3, etc — таблицы поддержки localStorage в различных браузерах.
- saving data with localStorage – Mozilla Hacks – the Web developer blog — руководство по использованию
localStorage
на практике. - A Complete Guide to LocalStorage – CSS-Tricks — полезные рекомендации для эффективного использования
localStorage
.