Кейсы

Обзор средств хранения данных в браузере

Общая рекомендация из Storage for the web по хранению ресурсов:

  • Для файлов и сетевых ресурсов, необходимых для загрузки приложения, используйте Cache Storage API (часть service-воркеров).
  • Для других данных используйте IndexedDB (используя пакет idb). Стоит отметить, что IndexedDB имеет более сложный API в сравнении с Web Storage API.

IndexedDB и Cache Storage API поддерживаются всеми современными браузерами. Они оба асинхронны и не блокируют основной поток. Они доступны из объекта window, web-воркеров и service-воркеров.

IndexedDB

Перед началом работы надо открыть базу данных и создать хранилища (аналогичные таблицам в базе данных). Все операции с данными в IndexedDB совершаются внутри транзакций.

import { openDB } from 'https://unpkg.com/idb?module';

const db = await openDB('myStore', 1, {
upgrade(database) {
    database.createObjectStore('myTable');
},
});
const table = db.transaction('myTable', 'readwrite').objectStore('myTable');
await table.put(7, 'id');
console.log(await table.get('id'));

Web Storage API

Для случаев записи данных малого размера можно использовать LocalStorage или SessionStorage. Это хранилища типа ключ-значение. Имеют одинаковое API, которое блокируют основной поток (страница зависает на время выполения операций). Могут хранить только строковые данные и недоступны в web-воркерах и service-воркерах. Отличаются между собой тем, что в SessionStorage данные пропадают при закрытии страницы, но сохраняются при перезагрузке страницы. LocalStorage не имеет таких ограничений.

// у sessionStorage идентичные методы
localStorage.setItem('id', 7);
localStorage.getItem('id');
localStorage.removeItem('user');

Cookies

Cookies не должны использоваться для хранения данных. Они отправляются на сервер с каждым HTTP-запросом, поэтому хранение в них больших объемов данных может привести к существенному снижению производительности за счет увеличения продолжительности запросов. Они являются синхронными, недоступны в веб-воркерах, могут хранить только строковые данные.

// Create
document.cookie = "user_name=Ire Aderinokun";  
document.cookie = "user_age=25;max-age=31536000;secure";

// Read (All)
console.log( document.cookie );

// Update
document.cookie = "user_age=24;max-age=31536000;secure"; 

// Delete
document.cookie = "user_name=Ire Aderinokun;expires=Thu, 01 Jan 1970 00:00:01 GMT"; 

Файловые API

File System Access API — прежнее название Native File System API. Позволяет разработчикам создавать web- приложения, которые взаимодействуют с файлами на локальном устройстве пользователя, такие как фото-, видео-, текстовые редакторы. Пример текстового редактора из статьи. После того, как пользователь предоставляет доступ к веб-приложению, этот API позволяет читать или сохранять изменения непосредственно в файлах и папках на устройстве пользователя. Помимо чтения и записи файлов, есть возможность открывать каталог и просматривать его содержимое.

File System API и FileWriter API предоставляют методы для чтения и записи файлов в изолированную файловую систему. Явлется инициативой и поддерживается в Chromium-based браузерах. Не рекомендуется к использованию.

WebSQL (deprecated)

WebSQL — попытка перенести SQL в web, W3C отказался от развития в пользу IndexedDB.

Однако стоит отметить проект Absurd SQL. Абсурд потому что база данных SQLite в базе данных IndexedDB. Под капотом это расширение проекта sql.js для сохранения в IndexedDB.