Tüm depolama alanları eşit değildir: kullanıma sunulan depolama paketleri

Storage Standard, kalıcı depolama ve kota tahminleri için bir API ve platform depolama mimarisi tanımlar. Yoğun bellek baskısı altında kalıcı depolama alanından çıkarma işleminin daha tahmin edilebilir olmasını sağlayan bir API'yi kullanıma sunuyoruz. Chromium 122 tarihinden itibaren kullanılabilir.

Depolama alanı standardı hangi sorunları çözer?

Normalde, kullanıcının cihazındaki depolama alanı tükendiğinde, IndexedDB veya localStorage gibi API'lerle depolanan veriler kullanıcı müdahale edebilmeden kaybolur. Depolama alanını kalıcı hale getirmenin bir yolu, StorageManager arayüzünün persist() yöntemini kullanmaktır. Aynı anda son kullanıcıdan izin ister ve izin verildikten sonra depolama alanını kalıcı olacak şekilde değiştirir:

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

Depolama alanının kalıcı olmasını isteme yöntemi "ya hep ya hiç" değildir. Kalıcılık ihtiyaçlarının daha ayrıntılı şekilde ifade edilmesi mümkün değildir. Hepsi tek bir depolama paketidir.

Storage Buckets API

Storage Buckets API'nin temel fikri, sitelere, tarayıcının her bir paketi diğer paketlerden bağımsız olarak silmeyi seçebileceği birden fazla depolama paketi oluşturma özelliği sağlamaktır. Bu sayede geliştiriciler, en değerli verilerin silinmediğinden emin olmak için çıkarma önceliğini belirleyebilir.

Kullanım alanı örneği

Depolama paketlerinin nerelerde kullanılabileceğini göstermek için bir e-posta uygulaması düşünün. Uygulama, kullanıcının yalnızca istemcide bulunan gönderilmemiş taslaklarını kaybederse bu durum affedilmez. Bunun aksine, bu iletiler bir sunucuda depolanıyorsa, tarayıcısı yoğun bir depolama yükü altındaysa kullanıcı, en eski gelen kutusu e-postalarından bazılarının istemciden kaldırılmasında sorun yaşar.

E-posta uygulaması arayüzü
Gelen kutusu ve taslaklar için ayrı depolama paketlerine sahip e-posta uygulaması. (Bu, yalnızca örnek olarak verilmiştir. Gmail'in işleyiş şeklini yansıtmayabilir.)

Storage Buckets API'yi kullanma

Yeni bir depolama paketi oluştur

StorageBucketManager arayüzünde open() yöntemiyle yeni bir depolama paketi oluşturulabilir.

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

Kalıcı yeni depolama paketi oluşturma

Depolama paketinin kalıcı olduğundan emin olmak için durability ve persisted seçenek bağımsız değişkenlerini open() yöntemine aktarabilirsiniz:

  • persisted, depolama paketinin kullanılıp kullanılmayacağını belirler. İzin verilen değerler false (varsayılan) veya true olur.
  • durability, tarayıcıya bir ipucu sağlayarak güç kesintileri durumunda yazma performansını daha düşük veri kaybı riskine karşı dengelemeye yardımcı olur. İzin verilen değerler 'relaxed' (varsayılan) veya 'strict' şeklindedir:

    • 'strict' paket, güç kesintisi durumunda veri kaybı riskini en aza indirmeye çalışır. Bu durum performansın düşmesine yol açabilir. Yani yazma işlemlerinin tamamlanması daha uzun sürebilir, genel sistem performansını etkileyebilir, daha fazla pil gücü tüketebilir ve depolama cihazının daha hızlı tükenmesine neden olabilir.
    • Güç kaybı yaşandığında 'relaxed' paket, son birkaç saniyede tamamlanan yazma işlemlerini "unutabilir". Bunun karşılığında, bu paketlere veri yazmak daha iyi performans özelliklerine sahip olabilir, pil şarjının daha uzun süre dayanmasına ve depolama cihazının daha uzun süre kullanılmasına neden olabilir. Ayrıca güç kesintisi, 'strict' paketlerinden daha yüksek oranda veri bozulmasına neden olmaz.
// 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`.
});

Storage paketinden depolama API'lerine erişme

Her depolama paketi, depolama API'leriyle (ör. IndexedDB, Cache arayüzü veya Dosya arayüzü) ilişkilendirilir. Bu depolama API'leri her zamanki gibi çalışır, yalnızca giriş noktası StorageBucket arayüzünden gelir (örneğin, 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);
});

Faydalı kaynaklar