Стандарт хранения определяет 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 заключается в предоставлении сайтам возможности создавать несколько контейнеров хранения, где браузер может выбрать удаление каждого контейнера независимо от других контейнеров. Это позволяет разработчикам указывать приоритеты вытеснения, чтобы гарантировать, что самые ценные данные не будут удалены.
Пример использования
Чтобы проиллюстрировать, где могут пригодиться контейнеры хранения, представьте себе приложение электронной почты. Было бы непростительно, если бы приложение потеряло неотправленные черновики пользователя, которые существуют только на клиенте. Напротив, если они хранятся на сервере, пользователь, вероятно, был бы не против, если бы некоторые из его самых старых входящих писем были удалены из клиента, если его браузер испытывает сильную нехватку хранилища.

Используйте API Storage Buckets
Создать новый контейнер для хранения
Новый контейнер хранения можно создать с помощью метода 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 , интерфейсом Cache или интерфейсом File . Эти 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);
});
Отладка контейнеров хранения в DevTools
Проверьте контейнеры хранения в специальном дереве в разделе Приложение > Хранилище .