שמירה מראש עם תיבת עבודה

שמירה במטמון היא אחת מהפעולות הנפוצות ביותר שמבצעים ב-Service Worker, ו-Workbox מאפשר גמישות רבה בהשלמת המשימה החשובה הזו, ללא קשר לאחד מכלי ה-build של Workbox שבחרתם. במדריך הזה תלמדו איך לשמור נכסים מראש במטמון באמצעות generateSW וגם באמצעות injectManifest, ונסביר איזו מהשיטות האלה הכי מתאימה לפרויקט שלכם.

טעינה באמצעות generateSW

הדרך הקלה ביותר לשמור נכסים במטמון ב-Workbox היא generateSW. מה שחשוב לזכור לגבי generateSW הוא שאתם לא כותבים קובץ שירות (service worker) משלכם – אתם מבקשים מ-Workbox ליצור בשבילכם קובץ כזה. עם זאת, תוכלו להשפיע על ההתנהגות באמצעות מגוון אפשרויות הגדרה.

generateSW מבצע פעולות שונות כברירת מחדל בהתאם לכלי ה-build שבו אתם משתמשים. כשמשתמשים ב-workbox-webpack-plugin, לא צריך לציין אפשרויות הגדרה. כברירת מחדל, הפלאגין יאחסן מראש את כל מה ש-webpack כולל בתרשים התלות שלו ויכתוב Service Worker בשם service-worker.js לספרייה שצוינה ב-output.path

לעומת זאת, אם משתמשים ב-workbox-build או ב-workbox-cli, רק נכסי HTML, CSS ו-JavaScript שנקראים ממערכת הקבצים המקומית יישמרו מראש כברירת מחדל. כדי שהשמירה מראש במטמון תעבוד, צריך לציין את swDest ואת האפשרות globDirectory בהגדרות של generateSW. סביר להניח שתרצו להגדיר אפשרויות נוספות שמשפיעות גם על התנהגות קובץ השירות שלכם, לכן עיינו בתיעוד.

טעינה באמצעות injectManifest

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

כשמשתמשים ב-injectManifest, אתם אחראים על חיווט הלוגיקה של השמירה במטמון. כש-injectManifest בוחן את ה-worker של שירות הקלט, הוא מחפש משתנה self.__WB_MANIFEST מיוחד ומחליף אותו במניפסט של המטמון מראש. אם המשתנה הזה לא קיים, injectManifest יקפיץ הודעת שגיאה.

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

השוואה בטבלה

אפשר ללחוץ על כל אחת מהכרטיסיות הבאות כדי להשוות את השימוש בשיטות generateSW ו-injectManifest:

מכיוון ש-generateSW יוצר קובץ שירות (service worker), צריך רק לציין הגדרה. הנה דוגמה באמצעות workbox-build:

// build-sw.js
import {generateSW} from 'workbox-build';

generateSW({
  swDest: './dist/sw.js',
  globDirectory: './dist',
  globPatterns: [
    '**/*.js',
    '**/*.css',
    '**/*.svg'
  ]
});

לאחר מכן אפשר לבנות את Service Worker בשורת הפקודה באמצעות Node:

node build-sw.js

ב-injectManifest נדרש קובץ שירות של מקור, ולכן כדי להשתמש בדוגמה סבירה נדרש קובץ worker של שירות מקור. אם כל מה שנדרש הוא שמירה מראש, ה-service worker הזה עשוי להיראות בערך כך:

import {precacheAndRoute} from 'workbox-precaching';

precacheAndRoute(self.__WB_MANIFEST);

חשוב לזכור את המחרוזת self.__WB_MANIFEST. זהו placeholder ש-Workbox מחליף במניפסט של המטמון מראש. בהמשך מוצגת הגדרה חוקית לתרחיש לדוגמה הזה:

// build-sw.js
import {injectManifest} from 'workbox-build';

injectManifest({
  swSrc: './src/sw.js',
  swDest: './dist/sw.js',
  globDirectory: './dist',
  globPatterns: [
    '**/*.js',
    '**/*.css',
    '**/*.svg'
  ]
});

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

סיכום

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