← Назад к вопросам
Какой максимальный размер хранилища у localStorage?
1.3 Junior🔥 141 комментариев
#Браузер и сетевые технологии
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Максимальный размер хранилища localStorage
Стандартный лимит
Официальный размер localStorage в большинстве браузеров составляет 5-10 МБ на каждый origin (домен + протокол + порт). Чаще всего это 5 МБ (5242880 байт), но точное значение зависит от браузера и его конфигурации.
По браузерам
Chrome/Edge: 10 МБ
Firefox: 10 МБ
Safari: 5 МБ
Internet Explorer: 10 МБ
Opera: 5-10 МБ
Это мягкие ограничения, и браузер может запросить разрешение у пользователя на увеличение в некоторых случаях.
Как проверить доступный размер
function getStorageSize() {
let size = 0;
try {
for (let key in localStorage) {
if (localStorage.hasOwnProperty(key)) {
size += localStorage[key].length + key.length;
}
}
} catch (e) {
console.error('Ошибка при расчёте размера:', e);
}
return size; // размер в байтах
}
console.log('Текущий размер:', getStorageSize(), 'байт');
console.log('В МБ:', (getStorageSize() / 1024 / 1024).toFixed(2));
Определение лимита
function findStorageLimit() {
const testKey = '__storageTest_' + Date.now();
const testValue = new Array(1024).join('a'); // 1 КБ
let limit = 0;
try {
for (let i = 0; i < 10 * 1024; i++) { // до 10 МБ
try {
localStorage.setItem(testKey + i, testValue);
limit = (i + 1) * testValue.length;
} catch (e) {
// Превышен лимит
break;
}
}
// Очистка
for (let i = 0; limit / (i + 1) / testValue.length > 1; i++) {
localStorage.removeItem(testKey + i);
}
return limit;
} catch (e) {
return 0;
}
}
console.log('Доступный лимит:', findStorageLimit(), 'байт');
Практические ограничения
Есть несколько важных моментов, которые часто забывают:
// 1. Кодировка UTF-16 при сохранении строк
// Каждый символ может занимать 2 байта в localStorage
const text = 'привет'; // На русском
localStorage.setItem('ru', text);
// Размер: 6 символов * 2 байта = 12 байт (может быть больше)
// 2. Ключи тоже считаются в размер
localStorage.setItem('очень-длинный-ключ', 'значение');
// Размер = длина_ключа + длина_значения
// 3. Синхронизация между вкладками
// localStorage общее для всех вкладок одного origin
// Избегай одновременных больших сохранений
// 4. Проверка доступного пространства
function canStoreData(key, value) {
try {
const testKey = '__test_' + Date.now();
localStorage.setItem(testKey, value);
localStorage.removeItem(testKey);
return true;
} catch (e) {
if (e.name === 'QuotaExceededError') {
return false;
}
throw e;
}
}
if (canStoreData('myKey', myLargeValue)) {
localStorage.setItem('myKey', myLargeValue);
} else {
// Обработать переполнение
console.warn('localStorage переполнен');
}
Когда localStorage недостаточно
// Если нужно больше — используй IndexedDB (до гигабайтов)
// Пример использования IndexedDB
function saveToIndexedDB(key, value) {
return new Promise((resolve, reject) => {
const request = indexedDB.open('myDB', 1);
request.onsuccess = (e) => {
const db = e.target.result;
const transaction = db.transaction(['store'], 'readwrite');
const objectStore = transaction.objectStore('store');
objectStore.put({ key, value, timestamp: Date.now() });
transaction.oncomplete = () => resolve();
transaction.onerror = () => reject(transaction.error);
};
request.onerror = () => reject(request.error);
});
}
// localStorage: быстро, 5-10 МБ, синхронно
// IndexedDB: медленнее, может быть до гигабайтов, асинхронно
Обработка ошибок
try {
localStorage.setItem('key', 'value');
} catch (e) {
if (e.name === 'QuotaExceededError') {
console.error('localStorage заполнен');
// Удалить старые данные и попробовать снова
} else if (e.name === 'SecurityError') {
console.error('Ошибка безопасности, возможно приватный режим');
} else {
console.error('Неизвестная ошибка:', e);
}
}
Выводы
- Стандартный лимит — 5-10 МБ в зависимости от браузера
- Это мягкое ограничение — браузер может попросить разрешение
- Всегда проверяй перед сохранением больших объёмов данных
- Для больших объёмов используй IndexedDB вместо localStorage
- Помни о кодировке — UTF-16 может занимать больше места
- Обрабатывай ошибки — QuotaExceededError будет выброшена при переполнении