Не все хранилища одинаковы: введение в сегменты хранения

Стандарт хранения определяет API для постоянного хранилища и оценки квот, а также архитектуру хранилища платформы. Мы запускаем API, который сделает вытеснение из постоянной памяти более предсказуемым при сильном нехватке памяти. Он доступен начиная с Chromium 122.

Какую проблему решает стандарт хранения?

Традиционно, когда у пользователя заканчивается место на устройстве, данные, хранящиеся с помощью таких API, как IndexedDB или localStorage , теряются без возможности вмешательства пользователя. Способ сделать хранилище постоянным — вызвать метод persist() интерфейса StorageManager . Он одновременно запрашивает разрешение у конечного пользователя и меняет хранилище на постоянное после предоставления:

const persisted = await navigator.storage.persist();
if (persisted) {
  /* Storage will not be cleared except by explicit user action. */
}

Этот метод запроса сохранения хранилища — все или ничего. Невозможно выразить более детальные потребности в постоянстве. Это все одно ведро для хранения.

API сегментов хранения

Основная идея API Storage Buckets — предоставить сайтам возможность создавать несколько сегментов хранения, при этом браузер может удалить каждый сегмент независимо от других сегментов. Это позволяет разработчикам указывать приоритеты вытеснения, чтобы гарантировать, что наиболее ценные данные не будут удалены.

Пример использования

Чтобы проиллюстрировать, где могут пригодиться сегменты хранения, представьте себе приложение электронной почты. Было бы непростительно, если бы приложение потеряло неотправленные черновики пользователя, существующие только на клиенте. Напротив, если они хранятся на сервере, пользователь, вероятно, будет согласен удалить некоторые из своих самых старых входящих писем из клиента, если его браузер испытывает сильную нехватку памяти.

Интерфейс приложения электронной почты
Приложение электронной почты с отдельными сегментами хранения для входящих сообщений и черновиков. (Исключительно в иллюстративных целях: это не обязательно отражает принцип работы Gmail.)

Используйте API сегментов хранилища

Создайте новый сегмент хранилища

Новый сегмент хранилища можно создать с помощью метода open() в интерфейсе StorageBucketManager .

// Create a storage bucket for emails that are synchronized with the
// server.
const inboxBucket = await navigator.storageBuckets.open('inbox');

Создайте постоянный новый сегмент хранилища.

Чтобы обеспечить сохранение сегмента хранилища, вы можете передать аргументы параметров durability и persisted в метод open() :

  • persisted определяет, следует ли сохранять сегмент хранилища или нет. Допустимые значения: false (по умолчанию) или true .
  • durability дает браузеру подсказку, которая помогает ему сбалансировать производительность записи и снизить риск потери данных в случае сбоев питания. Допустимые значения: 'relaxed' (по умолчанию) или 'strict' :

    • 'strict' сегменты пытаются минимизировать риск потери данных при сбое питания. Это может произойти за счет снижения производительности, а это означает, что запись может занять больше времени, может повлиять на общую производительность системы, может потреблять больше энергии аккумулятора и может быстрее изнашивать устройство хранения.
    • 'relaxed' сегменты могут «забыть» записи, которые были завершены за последние несколько секунд, когда происходит потеря мощности. В свою очередь, запись данных в эти корзины может иметь лучшие характеристики производительности и может позволить заряду батареи продлиться дольше, а также может привести к увеличению срока службы устройства хранения. Кроме того, сбой питания не приведет к повреждению данных с большей скоростью, чем в случае 'strict' сегментов.
// Create a storage bucket for email drafts that only exist on the client.
const draftsBucket = await navigator.storageBuckets.open('drafts', {
  durability: 'strict', // Or `'relaxed'`.
  persisted: true, // Or `false`.
});

Доступ к API хранилища из сегмента хранилища.

Каждый сегмент хранилища связан с API-интерфейсами хранилища, например IndexedDB , интерфейсом кэша или интерфейсом файла . Эти API хранилища работают как обычно, с той лишь разницей, что точка входа находится в интерфейсе StorageBucket , например StorageBucket.indexedDB .

const inboxDb = await new Promise(resolve => {
  const request = inboxBucket.indexedDB.open('messages');
  request.onupgradeneeded = () => { /* migration code */ };
  request.onsuccess = () => resolve(request.result);
  request.onerror = () => reject(request.error);
});

Полезные ресурсы