ארכיטקטורת Progressive Web App: תבניות Service Worker ב-JavaScript | MLOG | MLOG

4. רשת-בלבד (Network-Only)

אסטרטגיית רשת-בלבד תמיד מביאה נכסים מהרשת, ועוקפת את המטמון לחלוטין. אסטרטגיה זו משמשת כאשר אתם זקוקים באופן מוחלט לגרסה העדכנית ביותר של משאב, ושמירה במטמון אינה רצויה.

דוגמה:

            
self.addEventListener('fetch', event => {
  event.respondWith(
    fetch(event.request)
  );
});

            

5. ישן-בזמן-אימות-מחדש (Stale-While-Revalidate)

אסטרטגיית ישן-בזמן-אימות-מחדש מגישה את הנכס מהמטמון באופן מיידי, ובמקביל מביאה את הגרסה העדכנית ביותר מהרשת. לאחר שבקשת הרשת מסתיימת, המטמון מתעדכן עם הגרסה החדשה. אסטרטגיה זו מספקת תגובה ראשונית מהירה תוך הבטחה שהמשתמש יקבל בסופו של דבר את התוכן העדכני ביותר. זוהי אסטרטגיה שימושית לתוכן לא קריטי, שבו המהירות עדיפה על פני עדכניות מוחלטת.

דוגמה:

            
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request)
      .then(response => {
        const fetchPromise = fetch(event.request).then(networkResponse => {
          caches.open('my-cache').then(cache => {
            cache.put(event.request, networkResponse.clone());
            return networkResponse;
          });
        });
        return response || fetchPromise;
      })
  );
});

            

6. מטמון, ואז רשת (Cache, then Network)

דומה ל-stale-while-revalidate אך ללא החזרה מיידית של הנכס מהמטמון. היא בודקת את המטמון תחילה, ורק אם הנכס קיים, בקשת הרשת תמשיך ברקע כדי לעדכן את המטמון.

בחירת אסטרטגיית ה-Caching הנכונה

אסטרטגיית ה-caching האופטימלית תלויה בדרישות הספציפיות של היישום שלכם. קחו בחשבון גורמים כגון:

על ידי בחירה קפדנית של אסטרטגיות ה-caching המתאימות, תוכלו לשפר משמעותית את הביצועים ואת חוויית המשתמש של ה-PWA שלכם, אפילו בסביבות אופליין. כלים כמו Workbox ([https://developers.google.com/web/tools/workbox](https://developers.google.com/web/tools/workbox)) יכולים לפשט את יישום האסטרטגיות הללו.

סנכרון ברקע: טיפול בשינויים במצב אופליין

סנכרון ברקע מאפשר ל-PWA שלכם לבצע משימות ברקע, גם כשהמשתמש במצב אופליין. זה שימושי במיוחד לטיפול בשליחת טפסים, עדכוני נתונים ופעולות אחרות הדורשות קישוריות רשת. ה-API של `BackgroundSyncManager` מאפשר לכם לרשום משימות שיבוצעו כאשר הרשת תהפוך לזמינה.

רישום משימת סנכרון ברקע

כדי לרשום משימת סנכרון ברקע, עליכם להשתמש במתודה `register` של ה-`BackgroundSyncManager`. מתודה זו מקבלת שם תג ייחודי כארגומנט. שם התג מזהה את המשימה הספציפית שיש לבצע.

דוגמה:

            
self.addEventListener('sync', event => {
  if (event.tag === 'my-sync-task') {
    event.waitUntil(doSomeWork());
  }
});

            

טיפול באירוע ה-Sync

כאשר הדפדפן מזהה קישוריות רשת, הוא שולח אירוע `sync` ל-service worker. ניתן להאזין לאירוע זה ולבצע את הפעולות הנדרשות, כגון שליחת נתונים לשרת.

דוגמה:

            
async function doSomeWork() {
  // Retrieve data from IndexedDB
  const data = await getDataFromIndexedDB();

  // Send data to the server
  try {
    const response = await fetch('/api/sync', {
      method: 'POST',
      body: JSON.stringify(data),
      headers: {
        'Content-Type': 'application/json'
      }
    });

    if (response.ok) {
      // Clear the data from IndexedDB
      await clearDataFromIndexedDB();
    } else {
      // Handle errors
      console.error('Sync failed:', response.status);
      throw new Error('Sync failed');
    }
  } catch (error) {
    // Handle network errors
    console.error('Network error:', error);
    throw error;
  }
}

            

דוגמה: שליחת טופס במצב אופליין

דמיינו תרחיש שבו משתמש ממלא טופס כשהוא במצב אופליין. ה-service worker יכול לאחסן את נתוני הטופס ב-IndexedDB ולרשום משימת סנכרון ברקע. כאשר הרשת תהפוך לזמינה, ה-service worker יאחזר את נתוני הטופס מ-IndexedDB וישלח אותם לשרת.

  1. המשתמש ממלא את הטופס ולוחץ על 'שלח' כשהוא במצב אופליין.
  2. נתוני הטופס מאוחסנים ב-IndexedDB.
  3. משימת סנכרון ברקע נרשמת עם תג ייחודי (למשל, `form-submission`).
  4. כאשר הרשת זמינה, אירוע ה-`sync` מופעל.
  5. ה-service worker מאחזר את נתוני הטופס מ-IndexedDB ושולח אותם לשרת.
  6. אם השליחה מוצלחת, נתוני הטופס מוסרים מ-IndexedDB.

הודעות פוש: יצירת מעורבות עם המשתמשים באמצעות עדכונים בזמן אמת

הודעות פוש מאפשרות ל-PWA שלכם לשלוח עדכונים והודעות בזמן למשתמשים, גם כאשר האפליקציה אינה פועלת באופן פעיל בדפדפן. זה יכול לשפר משמעותית את מעורבות המשתמשים והשימור שלהם. ה-Push API וה-Notifications API עובדים יחד כדי לספק הודעות פוש.

הרשמה להודעות פוש

כדי לקבל הודעות פוש, על המשתמשים תחילה לתת הרשאה ל-PWA שלכם. ניתן להשתמש ב-`PushManager` API כדי לרשום משתמשים להודעות פוש.

דוגמה:

            
navigator.serviceWorker.ready.then(registration => {
  registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: 'YOUR_PUBLIC_VAPID_KEY'
  })
  .then(subscription => {
    // Send subscription details to your server
    sendSubscriptionToServer(subscription);
  })
  .catch(error => {
    console.error('Failed to subscribe:', error);
  });
});

            

חשוב: החליפו את `YOUR_PUBLIC_VAPID_KEY` במפתח ה-VAPID (Voluntary Application Server Identification) הציבורי שלכם. מפתחות VAPID משמשים לזיהוי שרת האפליקציה שלכם ולהבטחת שליחת הודעות פוש באופן מאובטח.

טיפול בהודעות פוש

כאשר מתקבלת הודעת פוש, ה-service worker שולח אירוע `push`. ניתן להאזין לאירוע זה ולהציג את ההודעה למשתמש.

דוגמה:

            
self.addEventListener('push', event => {
  const payload = event.data ? event.data.text() : 'No payload';

  event.waitUntil(
    self.registration.showNotification('My PWA', {
      body: payload,
      icon: 'icon.png'
    })
  );
});

            

התאמה אישית של הודעות פוש

ה-Notifications API מאפשר לכם להתאים אישית את המראה וההתנהגות של הודעות פוש. ניתן לציין את הכותרת, הגוף, הסמל, התג (badge) ואפשרויות אחרות.

דוגמה:

            
self.addEventListener('push', event => {
  const data = event.data.json();
  const title = data.title || 'My PWA';
  const options = {
    body: data.body || 'No message',
    icon: data.icon || 'icon.png',
    badge: data.badge || 'badge.png',
    vibrate: [200, 100, 200],
    data: { // Custom data that you can access when the user clicks the notification
      url: data.url || '/'
    },
    actions: [
      {action: 'explore', title: 'Explore this new world',
        icon: 'images/checkmark.png'},
      {action: 'close', title: 'Close',
        icon: 'images/xmark.png'},
    ]
  };

  event.waitUntil(self.registration.showNotification(title, options));
});


self.addEventListener('notificationclick', function(event) {
  event.notification.close();

  // Check if the user clicked on an action.
  if (event.action === 'explore') {
    clients.openWindow(event.notification.data.url);
  } else {
    // Default action: open the app.
    clients.openWindow('/');
  }
});

            

דוגמה: התראת חדשות

אפליקציית חדשות יכולה להשתמש בהודעות פוש כדי להתריע למשתמשים על חדשות מתפרצות. כאשר מתפרסמת כתבה חדשה, השרת שולח הודעת פוש למכשיר של המשתמש, המציגה סיכום קצר של הכתבה. המשתמש יכול אז ללחוץ על ההודעה כדי לפתוח את הכתבה המלאה ב-PWA.

תבניות Service Worker מתקדמות

1. אנליטיקה במצב אופליין

עקבו אחר התנהגות המשתמשים גם כשהם במצב אופליין על ידי אחסון נתוני אנליטיקה באופן מקומי ושליחתם לשרת כאשר הרשת זמינה. ניתן להשיג זאת באמצעות IndexedDB ו-Background Sync.

2. ניהול גרסאות ועדכונים

יישמו אסטרטגיית ניהול גרסאות חזקה עבור ה-service worker שלכם כדי להבטיח שהמשתמשים תמיד יקבלו את העדכונים האחרונים מבלי להפריע לחוויה שלהם. השתמשו בטכניקות של cache busting כדי לפסול נכסים ישנים שנשמרו במטמון.

3. Service Workers מודולריים

ארגנו את קוד ה-service worker שלכם למודולים כדי לשפר את התחזוקתיות והקריאות. השתמשו במודולים של JavaScript (ESM) או בכלי לאיגוד מודולים כמו Webpack או Rollup.

4. שמירה דינמית במטמון

שמרו נכסים במטמון באופן דינמי על בסיס אינטראקציות של המשתמש ודפוסי שימוש. זה יכול לעזור לייעל את גודל המטמון ולשפר את הביצועים.

שיטות עבודה מומלצות לפיתוח Service Worker

סיכום

JavaScript service workers הם כלים רבי עוצמה לבניית PWAs חזקות, בעלות ביצועים גבוהים ומעוררות מעורבות. על ידי הבנת מחזור החיים של ה-service worker ויישום אסטרטגיות caching מתאימות, סנכרון ברקע והודעות פוש, תוכלו ליצור חוויות משתמש יוצאות דופן, אפילו בסביבות אופליין. מאמר זה בחן תבניות מפתח ושיטות עבודה מומלצות של service worker כדי להדריך אתכם בבניית PWAs מוצלחות לקהל גלובלי. ככל שהרשת ממשיכה להתפתח, service workers ימלאו תפקיד חשוב יותר ויותר בעיצוב עתיד פיתוח הווב.

זכרו להתאים את התבניות הללו לדרישות היישום הספציפיות שלכם ותמיד לתעדף את חוויית המשתמש. על ידי אימוץ הכוח של service workers, תוכלו ליצור PWAs שהן לא רק פונקציונליות אלא גם מהנות לשימוש, ללא קשר למיקום המשתמש או לחיבור הרשת שלו.

מקורות נוספים: