كيفية جعل مدونة جيكيل تعمل بدون اتصال باستخدام خدمة العاملين
[*]تُعتبر تطبيقات الويب التقدمية (PWAs) اليوم من أبرز الابتكارات في عالم تطوير الويب، حيث تُتيح استخدام المواقع بشكلٍ غير متصل بالإنترنت بفضل تقنية الـ Service Workers. في هذا الدليل، سنستعرض كيفية جعل مدونة أو موقع مُعتمد على Jekyll يعمل في وضع عدم الاتصال، مع توضيح لبعض الإمكانيات المثيرة للاهتمام المصاحبة لذلك.
خلفية تقنية Service Workers
[*]كان هناك سابقًا نظام يعتمد على ملفات YAML يُسمى App Cache، ولكنه كان يفتقر إلى القدرة على تخزين الأصول وصفحات الويب بشكل ديناميكي. ومع ظهور Service Workers، أصبح من الممكن استخدام واجهة برمجة تطبيقات JavaScript قائمة على الأحداث لتخزين الأصول، مما يُتيح تقديم الصفحات حتى في حالة عدم توفر اتصال بالإنترنت. تم تقديم Service Workers لأول مرة في Chrome Canary عام 2014، ورغم أن مواصفاته لا تزال قيد التطوير، استضاف فريق Google Chrome الكثير من النقاشات حول هذه التقنية. ومع ذلك، لم تُعتمد Apple هذه التقنية على أجهزتها حتى كتابة هذه السطور.ما هو Service Worker؟
[*]Service Worker يمكن اعتباره عامل ويب مُعزز. جميع المهام تعمل بشكل غير متزامن، مما يسمح بتشغيل مهام تتطلب قوة CPU أو ذاكرة عالية، مثل حسابات معقدة، دون التأثير على أداء واجهة المستخدم. يتمكن Service Worker من تخزين الأصول مثل JavaScript وHTML والصور في ذاكرة المتصفح، مما يتيح تحميل الصفحات بسرعة، حتى في وضع عدم الاتصال.كيفية إعداد Service Worker في Jekyll
[*]لتمكين وظيفة العمل دون اتصال في موقع Jekyll، يمكنك إضافة الكود التالي في الصفحات المعنية:function showOfflineToast() {
let offlineToast = document.querySelector('.offline-ready');
offlineToast.classList.add('active');
setTimeout(function(){
offlineToast.className = offlineToast.className.replace("active", "").trim();
}, 5500);
}
if (navigator.serviceWorker) {
navigator.serviceWorker.register('/sw.js').then(function(reg) {
if (!reg.installing) return;
console.log("[*] ServiceWorker is installing...");
var worker = reg.installing;
worker.addEventListener('statechange', function() {
if (worker.state == 'redundant') {
console.log('[*] Install failed');
}
if (worker.state == 'installed') {
console.log('[*] Install successful!');
}
if (worker.state == 'activated' && !navigator.serviceWorker.controller) {
showOfflineToast();
}
});
});
}
[*]يمكنك إدراج هذا الكود في ملف يُسمى serviceWorker.html داخل دليل includes واستخدامه في default.html عبر محرك القالب الخاص بـ Jekyll.
الكود الرئيسي لـ Service Worker
[*]الكود الأساسي لـ Service Worker يُخزن في ملف sw.js في جذر المشروع الخاص بك. يجب عليك تعريف الملفات التي ترغب في تخزينها:const staticCacheName = "gdad-s-river-static-v61";
const filesToCache = [
"/",
{% for page in site.html_pages %}
'{{ page.url }}',
{% endfor %}
{% for post in site.posts %}
'{{ post.url }}',
{% endfor %}
"/assets/images/bhavri-github-callbacks.png",
"css/main.css",
];
[*]عند تنشيط الـ Service Worker، تحتاج إلى إدارة الملفات التي لم تعد مستخدمة وضمان تقديم أحدث نسخة.