العربية

دليل شامل لتنفيذ تطبيقات الويب التقدمية (PWA)، يغطي المفاهيم الأساسية، وعمال الخدمة، وملفات البيان، والإشعارات الفورية، وأفضل الممارسات لجمهور عالمي.

تطبيقات الويب التقدمية (PWA): دليل التنفيذ الكامل للمطورين العالميين

تمثل تطبيقات الويب التقدمية (PWAs) نقلة نوعية في تطوير الويب، حيث تزيل الحدود الفاصلة بين مواقع الويب التقليدية وتطبيقات الجوال الأصلية. إنها توفر تجربة مستخدم محسّنة تتميز بالموثوقية والقابلية للتثبيت والتفاعل، مما يجعلها حلاً مثالياً للوصول إلى جمهور عالمي لديه قدرات اتصال بالإنترنت وأجهزة متفاوتة.

ما هي تطبيقات الويب التقدمية؟

تطبيقات الويب التقدمية هي تطبيقات ويب تستفيد من معايير الويب الحديثة لتقديم تجربة شبيهة بتطبيقات الجوال الأصلية. إنها:

على عكس التطبيقات الأصلية، يمكن اكتشاف تطبيقات PWA من خلال محركات البحث، ومشاركتها بسهولة عبر عناوين URL، ولا تتطلب من المستخدمين المرور بمتاجر التطبيقات. وهذا يجعلها حلاً فعالاً من حيث التكلفة ويمكن الوصول إليه للشركات التي تتطلع إلى توسيع نطاق وصولها.

التقنيات الأساسية وراء تطبيقات PWA

تُبنى تطبيقات PWA على ثلاث تقنيات أساسية:

1. HTTPS

الأمان له أهمية قصوى. يجب تقديم تطبيقات PWA عبر بروتوكول HTTPS لمنع التنصت وضمان سلامة البيانات. وهذا مطلب أساسي لكي تعمل عمال الخدمة.

2. عمال الخدمة (Service Workers)

عمال الخدمة هي ملفات جافاسكريبت تعمل في الخلفية، منفصلة عن خيط المتصفح الرئيسي. تعمل كخوادم وكيلة (proxy servers) بين تطبيق الويب والشبكة، مما يتيح ميزات مثل:

دورة حياة عامل الخدمة: يعد فهم دورة حياة عامل الخدمة (التسجيل، التثبيت، التفعيل، التحديثات) أمرًا بالغ الأهمية لتنفيذ PWA بشكل فعال. يمكن أن تؤدي الإدارة غير الصحيحة إلى مشكلات في التخزين المؤقت وسلوك غير متوقع. سنتناول التحديثات بمزيد من التفصيل لاحقًا.

3. بيان تطبيق الويب (Web App Manifest)

بيان تطبيق الويب هو ملف JSON يوفر بيانات وصفية حول PWA، مثل:

خطوات التنفيذ: بناء تطبيق PWA بسيط

دعنا نستعرض خطوات بناء تطبيق PWA بسيط:

الخطوة 1: إعداد HTTPS

تأكد من أن موقع الويب الخاص بك يتم تقديمه عبر HTTPS. يمكنك الحصول على شهادة SSL مجانية من Let's Encrypt.

الخطوة 2: إنشاء بيان تطبيق الويب (manifest.json)

أنشئ ملفًا باسم `manifest.json` وأضف الكود التالي:


{
  "name": "My Simple PWA",
  "short_name": "PWA",
  "icons": [
    {
      "src": "icon-192x192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "icon-512x512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ],
  "start_url": "/index.html",
  "display": "standalone",
  "theme_color": "#ffffff",
  "background_color": "#ffffff"
}

استبدل `icon-192x192.png` و `icon-512x512.png` بملفات الأيقونات الفعلية الخاصة بك. ستحتاج إلى إنشاء هذه الأيقونات بأحجام مختلفة. يمكن أن تساعد الأدوات عبر الإنترنت مثل Real Favicon Generator في ذلك.

الخطوة 3: ربط ملف البيان في ملف HTML الخاص بك

أضف السطر التالي إلى قسم `` في ملف `index.html` الخاص بك:


<link rel="manifest" href="/manifest.json">

الخطوة 4: إنشاء عامل خدمة (service-worker.js)

أنشئ ملفًا باسم `service-worker.js` وأضف الكود التالي:


const CACHE_NAME = 'my-pwa-cache-v1';
const urlsToCache = [
  '/',
  '/index.html',
  '/style.css',
  '/script.js',
  '/icon-192x192.png',
  '/icon-512x512.png'
];

self.addEventListener('install', function(event) {
  // تنفيذ خطوات التثبيت
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(function(cache) {
        console.log('تم فتح ذاكرة التخزين المؤقت');
        return cache.addAll(urlsToCache);
      })
  );
});

self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.match(event.request)
      .then(function(response) {
        // العثور على الاستجابة في ذاكرة التخزين المؤقت - إرجاع الاستجابة
        if (response) {
          return response;
        }

        // هام: إذا وصلنا إلى هنا، فهذا يعني أن الطلب لم يتم العثور عليه في ذاكرة التخزين المؤقت.
        return fetch(event.request).then(
          function(response) {
            // التحقق مما إذا كنا قد تلقينا استجابة صالحة
            if(!response || response.status !== 200 || response.type !== 'basic') {
              return response;
            }

            // هام: استنساخ الاستجابة. الاستجابة هي تدفق بيانات (stream)
            // ولأننا نريد أن يستهلك المتصفح الاستجابة
            // وكذلك أن تستهلكها ذاكرة التخزين المؤقت، نحتاج إلى
            // استنساخها حتى يكون لدينا نسختان مستقلتان.
            var responseToCache = response.clone();

            caches.open(CACHE_NAME)
              .then(function(cache) {
                cache.put(event.request, responseToCache);
              });

            return response;
          }
        );
      })
  );
});

self.addEventListener('activate', function(event) {

  var cacheWhitelist = [CACHE_NAME];

  event.waitUntil(
    caches.keys().then(function(cacheNames) {
      return Promise.all(
        cacheNames.map(function(cacheName) {
          if (cacheWhitelist.indexOf(cacheName) === -1) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
});

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

الخطوة 5: تسجيل عامل الخدمة في ملف JavaScript الخاص بك

أضف الكود التالي إلى ملف `script.js` الخاص بك:


if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
    navigator.serviceWorker.register('/service-worker.js')
      .then(function(registration) {
        // تم التسجيل بنجاح
        console.log('تم تسجيل عامل الخدمة بنجاح بالنطاق: ', registration.scope);
      },
      function(err) {
        // فشل التسجيل :(
        console.log('فشل تسجيل عامل الخدمة: ', err);
      });
  });
}

يتحقق هذا الكود مما إذا كان المتصفح يدعم عمال الخدمة ويسجل ملف `service-worker.js`.

الخطوة 6: اختبار تطبيق PWA الخاص بك

افتح موقع الويب الخاص بك في متصفح يدعم تطبيقات PWA (مثل Chrome، Firefox، Safari). افتح أدوات المطورين وتحقق من علامة التبويب "Application" لمعرفة ما إذا كان عامل الخدمة مسجلاً بشكل صحيح وتم تحميل ملف البيان.

يجب أن ترى الآن مطالبة "إضافة إلى الشاشة الرئيسية" في متصفحك. سيؤدي النقر فوق هذه المطالبة إلى تثبيت PWA على جهازك.

ميزات واعتبارات متقدمة لتطبيقات الويب التقدمية

الإشعارات الفورية

تُعد الإشعارات الفورية طريقة قوية لإعادة جذب المستخدمين إلى PWA الخاص بك. لتنفيذ الإشعارات الفورية، ستحتاج إلى:

  1. الحصول على مفتاح واجهة برمجة تطبيقات الإشعارات (Push API Key): ستحتاج إلى استخدام خدمة مثل Firebase Cloud Messaging (FCM) أو خدمة مشابهة للتعامل مع الإشعارات الفورية. يتطلب هذا إنشاء حساب والحصول على مفتاح API.
  2. اشتراك المستخدم: في PWA الخاص بك، ستحتاج إلى طلب إذن من المستخدم لتلقي الإشعارات الفورية ثم اشتراكهم في خدمة الإشعارات الخاصة بك.
  3. التعامل مع أحداث الإشعارات (Push Events): في عامل الخدمة الخاص بك، ستحتاج إلى الاستماع إلى أحداث الإشعارات وعرض الإشعار للمستخدم.

مثال (مبسط - باستخدام Firebase):

في ملف `service-worker.js` الخاص بك:


// استيراد مكتبات Firebase
importScripts('https://www.gstatic.com/firebasejs/9.6.11/firebase-app-compat.js');
importScripts('https://www.gstatic.com/firebasejs/9.6.11/firebase-messaging-compat.js');

// تهيئة Firebase
const firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  projectId: "YOUR_PROJECT_ID",
  storageBucket: "YOUR_STORAGE_BUCKET",
  messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
  appId: "YOUR_APP_ID",
  measurementId: "YOUR_MEASUREMENT_ID"
};

firebase.initializeApp(firebaseConfig);

const messaging = firebase.messaging();

messaging.onBackgroundMessage(function(payload) {
  console.log('[firebase-messaging-sw.js] Received background message ', payload);
  // تخصيص الإشعار هنا
  const notificationTitle = 'عنوان رسالة الخلفية';
  const notificationOptions = {
    body: 'نص رسالة الخلفية.',
    icon: '/icon-512x512.png'
  };

  self.registration.showNotification(notificationTitle, notificationOptions);
});

هام: استبدل القيم النائبة بتهيئة Firebase الفعلية الخاصة بك. يوضح هذا المثال التعامل مع الرسائل في الخلفية. ستحتاج إلى تنفيذ منطق الاشتراك في كود JavaScript الرئيسي الخاص بك.

المزامنة في الخلفية

تسمح المزامنة في الخلفية لـ PWA الخاص بك بأداء المهام حتى عندما يكون المستخدم غير متصل بالإنترنت. هذا مفيد لسيناريوهات مثل:

لاستخدام المزامنة في الخلفية، ستحتاج إلى التسجيل لحدث `sync` في عامل الخدمة الخاص بك والتعامل مع منطق المزامنة.

استراتيجيات الدعم دون اتصال بالإنترنت

هناك عدة استراتيجيات لتوفير الدعم دون اتصال بالإنترنت في PWA الخاص بك:

تعتمد أفضل استراتيجية على المتطلبات المحددة لتطبيقك.

تحديثات PWA

تُعد تحديثات عامل الخدمة جزءًا مهمًا من صيانة PWA. عندما يكتشف المتصفح تغييرًا في ملف `service-worker.js` الخاص بك (حتى تغيير بايت واحد)، فإنه يؤدي إلى عملية تحديث. يتم تثبيت عامل الخدمة الجديد في الخلفية، لكنه لا يصبح نشطًا حتى المرة التالية التي يزور فيها المستخدم PWA الخاص بك أو يتم إغلاق جميع علامات التبويب الحالية التي يتحكم فيها عامل الخدمة القديم.

يمكنك فرض تحديث فوري عن طريق استدعاء `self.skipWaiting()` في حدث `install` لعامل الخدمة الجديد و `clients.claim()` في حدث `activate`. ومع ذلك، يمكن أن يؤدي هذا إلى تعطيل تجربة المستخدم، لذا استخدمه بحذر.

اعتبارات تحسين محركات البحث (SEO) لتطبيقات الويب التقدمية

تطبيقات PWA بشكل عام صديقة لمحركات البحث، لأنها في الأساس مواقع ويب. ومع ذلك، هناك بعض الأشياء التي يجب وضعها في الاعتبار:

التوافق عبر المتصفحات

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

تصحيح أخطاء تطبيقات الويب التقدمية

يمكن أن يكون تصحيح أخطاء تطبيقات PWA أمرًا صعبًا بسبب الطبيعة غير المتزامنة لعمال الخدمة. استخدم أدوات المطورين في المتصفح لفحص تسجيل عامل الخدمة والتخزين المؤقت وطلبات الشبكة. انتبه جيدًا لسجلات وحدة التحكم ورسائل الخطأ.

أمثلة على تطبيقات PWA حول العالم

لقد نجحت العديد من الشركات في جميع أنحاء العالم في تنفيذ تطبيقات PWA. فيما يلي بعض الأمثلة المتنوعة:

الخاتمة: احتضان مستقبل الويب

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