همه فضای ذخیره‌سازی برابر ایجاد نمی‌شوند: معرفی Storage Buckets

استاندارد Storage یک 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. */
}

این روش درخواست برای تداوم ذخیره سازی همه یا هیچ است. هیچ راهی برای بیان نیازهای ماندگار ریزتر وجود ندارد. این همه یک سطل ذخیره سازی است.

Storage Buckets API

ایده اصلی Storage Buckets API این است که به سایت ها توانایی ایجاد سطل های ذخیره سازی متعدد را می دهد، جایی که مرورگر ممکن است انتخاب کند که هر سطل را مستقل از سایر سطل ها حذف کند. این به توسعه دهندگان اجازه می دهد تا اولویت بندی اخراج را مشخص کنند تا مطمئن شوند با ارزش ترین داده ها حذف نمی شوند.

از مثال موردی استفاده کنید

برای نشان دادن جایی که سطل های ذخیره سازی مفید هستند، یک برنامه ایمیل را تصور کنید. اگر برنامه پیش‌نویس‌های ارسال‌نشده کاربر را که فقط روی مشتری وجود دارد، از دست بدهد، نابخشودنی خواهد بود. در مقابل، اگر آنها بر روی یک سرور ذخیره شوند، کاربر احتمالاً مشکلی ندارد که برخی از قدیمی‌ترین ایمیل‌های صندوق ورودی خود را از مشتری حذف کند، اگر مرورگر آنها تحت فشار ذخیره‌سازی سنگین باشد.

رابط برنامه ایمیل
برنامه ایمیل با سطل های ذخیره سازی جداگانه برای صندوق ورودی و پیش نویس ها. (فقط برای اهداف توضیحی، این لزوما نشان دهنده نحوه عملکرد Gmail نیست.)

از 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);
});

منابع مفید