لا يتم إنشاء كل مساحة التخزين بشكل متساوٍ: التعريف بـ "حِزم مساحة التخزين"

يحدد معيار مساحة التخزين واجهة برمجة تطبيقات لتقديرات مساحة التخزين الدائمة وحصص الحصص وبنية مساحة التخزين على النظام الأساسي. نحن بصدد إطلاق واجهة برمجة تطبيقات لجعل عملية تفريغ مساحة التخزين باستمرار تحت ضغط شديد للذاكرة أكثر قابلية للتنبؤ. تتوفّر هذه الميزة بدايةً من الإصدار 122 من Chromium.

ما هي المشكلة التي يحلها معيار التخزين؟

عادةً، عندما تنفد مساحة التخزين على جهاز المستخدم، يتم فقدان البيانات المُخزَّنة من خلال واجهات برمجة التطبيقات، مثل 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 في منح المواقع الإلكترونية إمكانية إنشاء حِزم تخزين متعددة، حيث يمكن للمتصفّح أن يختار حذف كل حزمة بشكل مستقل عن الحِزم الأخرى. يتيح ذلك للمطوّرين تحديد أولويات الإخلاء للتأكّد من عدم حذف البيانات الأكثر قيمة.

مثال على حالة الاستخدام

لتوضيح المكان الذي ستكون فيه حزم التخزين مفيدة، تخيل أن تطبيق بريد إلكتروني. سيكون من غير الممكن التغاضي إذا فقد التطبيق المسودات غير المرسلة الخاصة بالمستخدم والتي لا توجد إلا على العميل. وفي المقابل، إذا كانت هذه الرسائل مخزنة على خادم، فربما لا مانع من إزالة بعض أقدم رسائل البريد الإلكتروني الوارد من العميل في حال تعرّض المتصفح لضغط شديد في التخزين.

واجهة تطبيق البريد الإلكتروني
تطبيق البريد الإلكتروني يتضمّن حِزم مساحة تخزين منفصلة للبريد الوارد والمسودات. (لأغراض التوضيح فقط، لا يعكس هذا بالضرورة طريقة عمل 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`.
});

الوصول إلى واجهات برمجة التطبيقات لمساحة التخزين من حزمة تخزين

ترتبط كل حزمة تخزين بواجهات برمجة تطبيقات التخزين، مثل IndexedDB أو واجهة ذاكرة التخزين المؤقت أو واجهة الملف. تعمل واجهات برمجة تطبيقات التخزين هذه على النحو المعتاد، أي أنّ نقطة الدخول تأتي من واجهة 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);
});

تصحيح أخطاء حِزم التخزين في "أدوات مطوري البرامج"

افحص حِزم التخزين في شجرة مخصّصة في قسم التطبيق > مساحة التخزين.

تاريخ تفعيل شجرة حِزم التخزين وقبلها وبعدها في قسم "مساحة التخزين"

مراجع مفيدة