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

Общая рекомендация из 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.


Похожие записи

Добавить css link и js script динамически

const link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = 'https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css';
link.integrity = 'sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO'; // необязательно
link.crossOrigin = 'anonymous'; // необязательно
document.head.appendChild(link);

const script = document.createElement('script');
script.src = 'https://code.jquery.com/jquery-3.3.1.slim.min.js';
script.integrity = 'sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo'; // необязательно
s...