Какой максимальный размер LocalStorage?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Максимальный размер LocalStorage в браузерах
LocalStorage — это часть Web Storage API, позволяющая хранить данные в браузере пользователя в формате ключ-значение без установки сроков действия. Вопрос о его максимальном размере кажется простым, но ответ зависит от множества факторов: браузера, операционной системы, режима сохранения данных и даже политики производителя.
Теоретические и практические ограничения
Согласно спецификации W3C, браузеры должны предоставить как минимум 5 МБ данных для каждого источника (origin). Однако это рекомендация, а не жесткое правило. На практике лимиты часто выше и варьируются.
Лимиты по браузерам (наиболее распространенные)
- Chrome, Firefox, Edge (на базе Chromium): обычно предлагают 10 МБ на источник. В некоторых версиях или условиях может быть доступно до 5 МБ.
- Safari (Desktop): жестко ограничивает 5 МБ на источник. Это ограничение строго соблюдается.
- Safari (Mobile / iOS): также 5 МБ, но стоит отметить, что в мобильных браузерах общее доступное пространство может быть меньше из-за ограничений устройства.
- Internet Explorer 8+: предлагает 10 МБ на домен.
Важно: «Источник» (origin) включает комбинацию протокола, домена и порта. Например,
https://example.comиhttp://example.comсчитаются разными источниками и имеют отдельные хранилища.
Как браузер определяет и применяет лимит?
Браузер не выделяет заранее заданный объем дискового пространства. Лимит применяется динамически:
- При записи данных браузер вычисляет их размер (включая ключи и значения в строковом формате).
- Если попытка записи превышает доступный лимит, возникает исключение
QuotaExceededError. - Браузеры могут учитывать сжатие данных. Например, Chrome использует алгоритм сжатия Snappy, поэтому фактический объем дискового пространства может отличаться от объема записанных строк.
Проверка доступного пространства и обработка ошибок
Нет прямого API для проверки остатка свободного места. Рабочий подход — попытка записи и обработка возможной ошибки.
function testLocalStorageCapacity() {
const key = 'testData';
const megaByte = 1024 * 1024;
let data = '';
// Начинаем с 1 МБ и увеличиваем
for (let i = 1; i <= 20; i++) {
try {
// Создаем строку размером ~ i МБ
data = 'x'.repeat(megaByte * i);
localStorage.setItem(key, data);
console.log(`Успешно записано ~${i} МБ`);
localStorage.removeItem(key); // очищаем для следующей попытки
} catch (e) {
if (e.name === 'QuotaExceededError') {
console.log(`Лимит достигнут на ~${i} МБ`);
localStorage.removeItem(key);
return;
}
}
}
}
// Вызываем функцию для теста
testLocalStorageCapacity();
Ключевые рекомендации по использованию
- Не рассчитывайте на максимальный объем. Разрабатывайте приложения, учитывая минимальный лимит (5 МБ), чтобы обеспечить кросс-браузерную совместимость.
- Лимит делится между LocalStorage и SessionStorage. Они являются частью одного хранилища на источник.
- Данные хранятся только в строковом формате. Для сложных объектов используйте
JSON.stringify(), что увеличивает итоговый размер. - Очищайте неиспользуемые данные. Регулярно удаляйте старые или ненужные ключи, чтобы избежать превышения лимита.
- Рассмотрите альтернативы. Для больших объемов данных лучше использовать IndexedDB (поддерживает значительно большие объемы, часто сотни МБ или даже ГБ), Cache API или серверное хранилище.
Альтернативы для больших объемов данных
- IndexedDB: Асинхронная, объектная база данных в браузере. Лимиты обычно намного выше (сотни МБ), но также зависят от браузера и устройства.
- Cache API: Часть Service Worker API, предназначенная для хранения сетевых запросов и ответов. Используется преимущественно для кэширования ресурсов.
- Server-side storage: Наиболее надежный метод — хранить данные на сервере (в базе данных или файловой системе) и использовать браузерное хранилище только для временных или небольших данных (например, токенов, настроек).
Итог
Максимальный размер LocalStorage — величина нефиксированная, но в кросс-браузерной разработке безопасно ориентироваться на 5 МБ. Превышение этого лимита приведет к исключению QuotaExceededError. Для надежных приложений, требующих хранения значительных данных клиента, используйте IndexedDB, оценивая его лимиты отдельно для каждого целевого браузера и устройства.