إدارة الإصدارات والترقيات
رحّلوا المخططات عند تغيير الإصدارات.
إدارة الإصدارات والترقيات درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
لماذا نستخدم إدارة الإصدارات؟
تتطور التطبيقات؛ فقد تضيفون مخازن بيانات أو فهارس، أو تغيّرون بنية البيانات. يستخدم IndexedDB رقم إصدار لإدارة تغييرات المخطط بأمان في متصفح كل مستخدم.
رقم الإصدار
الوسيط الثاني للدالة open هو الإصدار، ويجب أن يكون عددًا صحيحًا موجبًا. تؤدي زيادة هذا الرقم إلى إبلاغ المتصفح بتغير المخطط وبدء الترقية.
// Bumping from 1 to 2 triggers onupgradeneeded:
const request = indexedDB.open('app-db', 2);لا تزيد الترقية إلا إلى إصدار أعلى
لا يمكنكم سوى زيادة الإصدار. ويفشل الفتح باستخدام رقم أقل من الرقم المخزن مع ظهور خطأ. لا تُنقصوا رقم الإصدار أبدًا.
// If the stored DB is version 3:
const req = indexedDB.open('app-db', 2);
req.onerror = () => console.log('cannot open older version');oldVersion وnewVersion
يكشف الحدث داخل onupgradeneeded عن oldVersion وnewVersion. استخدموهما لتطبيق عمليات الترحيل التي لم تُنفَّذ بعد فقط.
request.onupgradeneeded = (e) => {
console.log('upgrading from', e.oldVersion, 'to', e.newVersion);
};عمليات الترحيل التدريجية
من الأنماط المتينة استخدام تسلسل يتابع التنفيذ اعتمادًا على oldVersion: إذ تعتمد كل كتلة على الكتلة السابقة، بحيث يصل المستخدم من أي إصدار قديم إلى أحدث مخطط.
request.onupgradeneeded = (e) => {
const db = e.target.result;
if (e.oldVersion < 1) {
db.createObjectStore('notes', { keyPath: 'id' });
}
if (e.oldVersion < 2) {
db.createObjectStore('tags', { keyPath: 'name' });
}
};إضافة فهرس لاحقًا
لإضافة فهرس إلى مخزن بيانات موجود أثناء الترقية، احصلوا على المخزن من معاملة الترقية، ثم استدعوا createIndex عليه.
request.onupgradeneeded = (e) => {
if (e.oldVersion < 3) {
const store = e.target.transaction.objectStore('notes');
store.createIndex('byDate', 'createdAt');
}
};معاملة تغيير الإصدار
أثناء تنفيذ onupgradeneeded، تكون transaction الخاصة بالحدث معاملة خاصة من النوع versionchange. وهي السياق الوحيد الذي يمكن فيه إجراء تعديلات المخطط وترحيل البيانات معًا.
request.onupgradeneeded = (e) => {
const tx = e.target.transaction; // versionchange tx
const store = tx.objectStore('notes');
// migrate existing records here if needed
};ترحيل البيانات الموجودة
إذا تطلب تغيير المخطط إعادة تشكيل السجلات، فكرّروا على المخزن باستخدام مؤشر داخل الترقية، ثم أعيدوا كتابة القيم المحوّلة باستخدام put.
const store = e.target.transaction.objectStore('notes');
store.openCursor().onsuccess = (ev) => {
const cursor = ev.target.result;
if (cursor) {
const note = cursor.value;
note.archived = false; // new field
cursor.update(note);
cursor.continue();
}
};الحدث versionchange
عندما تجري إحدى علامات التبويب ترقية، تتلقى علامات التبويب الأخرى التي تحتفظ بالإصدار القديم حدث versionchange في db الخاصة بها. وينبغي لها إغلاق الاتصالات حتى لا تعيق الترقية.
db.onversionchange = () => {
db.close(); // let the other tab upgrade
console.log('database is outdated, please reload');
};حذف مخازن البيانات
يمكنكم إزالة مخزن بيانات لم يعد مطلوبًا أثناء الترقية باستخدام db.deleteObjectStore(name). ويؤدي ذلك إلى حذفه وحذف بياناته نهائيًا.
request.onupgradeneeded = (e) => {
const db = e.target.result;
if (e.oldVersion < 4 && db.objectStoreNames.contains('temp')) {
db.deleteObjectStore('temp');
}
};أفضل ممارسات الترقية
اجعلوا عمليات الترحيل قابلة للتنفيذ بأمان أكثر من مرة ومرتبة حسب oldVersion، وأغلقوا الاتصالات القديمة عند وقوع versionchange، واختبروا الترقية انطلاقًا من كل إصدار سابق. يحافظ ذلك على بيانات المستخدمين العائدين.
اختبار سريع
اختبروا مدى فهمكم لإدارة الإصدارات والترقيات.
مراجعة
لقد تعلمتم إدارة الإصدارات والترقيات:
- ارفعوا رقم الإصدار لتشغيل
onupgradeneeded. - استخدموا
oldVersionلتنفيذ عمليات ترحيل تدريجية وآمنة عند تكرارها. - تعدّل معاملة الترقية من النوع
versionchangeالمخطط والبيانات. - رحّلوا السجلات باستخدام مؤشر و
cursor.update. - أغلقوا علامات التبويب القديمة عند وقوع حدث
versionchange.
لقد أكملتم IndexedDB. التالي: Service Workers.
الأسئلة الشائعة
هل درس «إدارة الإصدارات والترقيات» مجاني؟
نعم — نص درس «إدارة الإصدارات والترقيات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «إدارة الإصدارات والترقيات»؟
رحّلوا المخططات عند تغيير الإصدارات. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟
لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «إدارة الإصدارات والترقيات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟
نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فتح قاعدة بيانات
- المعاملات وCRUD
- الفهارس والاستعلامات
- إدارة الإصدارات والترقيات