Стандарт хранения определяет 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 сегментов хранилища
Создайте новый сегмент хранилища
Новый сегмент хранилища можно создать с помощью метода 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);
});
Отладка сегментов хранилища в DevTools
Проверьте сегменты хранилища в выделенном дереве в разделе «Приложение» > «Хранилище» .