Какой максимальный размер хранилища у sessionStorage?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Максимальный размер sessionStorage
SessionStorage — это часть Web Storage API, которая позволяет хранить данные на стороне клиента в течение сессии одной вкладки браузера. В отличие от localStorage, данные в sessionStorage очищаются при закрытии вкладки.
Технические ограничения по объёму
Спецификация W3C явно не определяет максимальный размер для sessionStorage и localStorage. Однако на практике стандартом де-факто стал лимит в 5 МБ (мегабайт) на один домен (origin — комбинация протокола, домена и порта). Этот лимит является суммарным для localStorage, sessionStorage и IndexedDB в некоторых браузерах, хотя чаще sessionStorage и localStorage разделяют этот лимит поровну или почти поровну.
Вариации между браузерами
Лимиты могут значительно отличаться в зависимости от браузера и условий:
- Chrome, Firefox, Edge (современные версии): Обычно 5-10 МБ на домен для
sessionStorage. В Chrome, например, лимит составляет 10 МБ, но может быть уменьшен в мобильных версиях или при работе в режиме инкогнито. - Safari (настольный и мобильный): В мобильном Safari (iOS) и настольном Safari лимит строже — около 5 МБ. При превышении лимита Safari может полностью очистить хранилище для домена.
- Internet Explorer (8+): Ограничение составляет 10 МБ, но с учётом того, что IE использовал собственную реализацию.
Как определить лимит на практике
Поскольку спецификация не гарантирует точный размер, а браузеры могут его менять, наиболее надёжный подход — предусмотреть обработку ошибок при записи. При превышении квоты браузер выбросит исключение QuotaExceededError. Вот пример безопасной записи:
function safeSessionStorageSet(key, value) {
try {
sessionStorage.setItem(key, value);
console.log('Данные успешно сохранены');
} catch (e) {
if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {
console.error('Достигнут лимит хранилища. Невозможно сохранить данные.');
// Здесь может быть логика очистки устаревших данных или уведомление пользователя
} else {
console.error('Неизвестная ошибка при записи в sessionStorage:', e);
}
}
}
// Пример использования
safeSessionStorageSet('largeData', JSON.stringify({ some: 'very large object' }));
Ключевые факторы, влияющие на доступный объём
- Политика браузера: Браузер может уменьшать лимиты в приватных режимах (инкогнито/приватный просмотр).
- Вмешательство пользователя: Пользователь может вручную очистить данные сайта или установить глобальные ограничения.
- Дисковое пространство: На устройствах с малым объёмом свободной памяти браузеры могут снижать лимиты.
- Совокупная квота домена: Как упоминалось, в некоторых реализациях
sessionStorageделит общий лимит сlocalStorageи другими клиентскими базами данных.
Рекомендации для разработчиков
- Не рассчитывайте на точный объём: Всегда пишите код, который обрабатывает ошибки переполнения.
- Используйте сжатие данных: Для хранения больших объёмов текстовых данных (например, JSON) можно применять сжатие, например, с помощью библиотек типа
pako(gzip) илиlz-string. - Альтернативы для больших данных: Если нужно хранить значительно больше 5-10 МБ, рассмотрите:
* **IndexedDB** — поддерживает значительно большие объёмы (обычно 50% от свободного места на диске) и асинхронную работу.
* **Кэш API (Cache Storage)** — для хранения ресурсов (изображений, скриптов) в рамках Progressive Web Apps.
* **Серверное хранение** с синхронизацией через API.
Пример проверки доступного объёма (оценочный)
Прямое измерение доступного объёма в спецификации не предусмотрено, но можно сделать приблизительную оценку:
function estimateSessionStorageCapacity() {
const testKey = 'testQuota';
let data = 'a';
// Создаём строку размером примерно 1 МБ
while (data.length < 1024 * 1024) {
data += data;
}
try {
for (let i = 0; i < 20; i++) { // Пробуем записать до ~20 МБ
sessionStorage.setItem(testKey + i, data.substring(0, 1024 * 1024));
}
} catch (e) {
const used = Object.keys(sessionStorage).reduce((total, key) => {
return total + (sessionStorage.getItem(key) || '').length;
}, 0);
console.log('Примерно использовано: ' + Math.round(used / (1024 * 1024)) + ' МБ');
// Очищаем тестовые данные
for (let i = 0; i < 20; i++) {
sessionStorage.removeItem(testKey + i);
}
}
}
// Внимание: этот код может привести к очистке существующих данных в sessionStorage
// Используйте с осторожностью, только для диагностики!
Важно: Такой тест может перезаписать существующие данные и должен использоваться исключительно в диагностических целях в контролируемых условиях.
Таким образом, хотя типичный практический лимит sessionStorage составляет 5-10 МБ на домен, единственно правильным подходом является написание кода, который не полагается на конкретный объём, а корректно обрабатывает ситуацию исчерпания квоты.