Возможно ли закешировать около 1 гб в браузере?

В планах написать специфическое веб приложение. Основное требование, чтобы пользователь мог работать с пакетом данных независимо от скорости подключения интернета, в том числе в офлайне. "Пакет данных" это около 300-400 мегабайт (скорость работы с ним приличная даже на слабых девайсах). На написание приложений под разные платформы ресурсов нет.
Возможно ли сохранить такой объем данных в современных браузерах и каким образом это сделать лучше всего?
Интересует прежде всего chrome и safari, в том числе на смартфонах.
  • Вопрос задан
  • 822 просмотра
Пригласить эксперта
Ответы на вопрос 4
zkrvndm
@zkrvndm
Архитектор решений
Возможно конечно. Для хранения больших объемов данных в браузерах существует встроенная БД IndexedDB.

Для работы с ней сначала подключаем специальную библиотеку, которая упрощает ввод и вывод:
<script src="https://cdnjs.cloudflare.com/ajax/libs/localforage/1.9.0/localforage.js"></script>

Далее, чтобы сохранить какие-то данные выполняем в консоли браузера:
result = await localforage.setItem('key', save_data);
console.log('Данные успешно сохранены:');
console.dir(result);

Где в save_data лежат сохраняемые данные, а key это ключ по которому можно было бы получить к ним доступ.

Из особенностей, в save_data мы можем положить любой тип данных - хоть строку, хоть массив, хоть объект. Да даже файл при желании можно сохранить! При этом нет ограничений по объему хранимых данных, можете хоть сто мегабайт, хоть триста запихнуть - встроенное хранилище все сожрет.

Чтобы потом извлечь сохраненные данные достаточно выполнить:
result = await localforage.getItem('key');
console.log('Данные успешно извлечены:');
console.dir(result);

Срок хранения данных - неограниченно. Или пока пользователь вручную не обнулит кеш браузера.

P. S. Обратите внимание, что если вы где-то в своем коде внутри функции используете слово await, то такая функция обязательно должна иметь приставку async! Иначе получите ошибку. В консоли можно использовать await в лоб, но для использования await в коде нужно, чтобы функция внутри которой она вызывается была асинхронной!!!
Ответ написан
daemonhk
@daemonhk
ПсиХоПат
Нет (5-10 Мб максимум), да и глупо звучит. Что будут делать пользователи с ограниченными ресурсами?
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
https://developer.mozilla.org/en-US/docs/Web/API/I... Скачивайте все локально и запускайте какой нибудь электрон. Пс гиг в кэше это жестко! По идее смотрите лимиты
Ответ написан
Комментировать
killovv
@killovv
vk.com/2style
Если не нужны лишние библиотеки, вот моя упрощённая версия

let db={
	o:h=>new Promise(r=>{let i=indexedDB.open('you_db');i.onsuccess=()=>r(i.result);i.onupgradeneeded=()=>i.result.createObjectStore('db',{keyPath:'key'})}).then(h),
	t:o=>o.transaction('db','readwrite').objectStore('db'),
	g:(k,h)=>db.o(o=>new Promise(r=>{let t=db.t(o).get(k);t.onsuccess=()=>r(t.result&&t.result.val)}).then(h)),
	s:(k,v)=>db.o(o=>db.t(o).put({key:k,val:v}))
};


использовать так:
db.s('sync', сохранить данные )
db.g('sync', данные => функция )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы