הסבר על מכסת האחסון

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

אילו אפשרויות הגדרה נתמכות?

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

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

import {registerRoute} from 'workbox-routing';
import {CacheFirst} from 'workbox-strategies';
import {ExpirationPlugin} from 'workbox-expiration';

registerRoute(
  ({request}) => request.destination === 'image',
  // Use a cache-first strategy with the following config:
  new CacheFirst({
    // You need to provide a cache name when using expiration.
    cacheName: 'images',
    plugins: [
      new ExpirationPlugin({
        // Keep at most 50 entries.
        maxEntries: 50,
        // Don't keep any entries for more than 30 days.
        maxAgeSeconds: 30 * 24 * 60 * 60,
        // Automatically cleanup if quota is exceeded.
        purgeOnQuotaError: true
      })
    ]
  })
);

צריך להגדיר את maxEntries, את maxAgeSeconds או את שניהם כשמשתמשים ב-ExpirationPlugin. הערך purgeOnQuotaError הוא אופציונלי.

maxEntries

כך אפשר להגדיר מגבלה על מספר הרשומות (כלומר כתובות URL ייחודיות) במטמון נתון.

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

maxAgeSeconds

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

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

purgeOnQuotaError

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

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

כמה נתונים מותר לאחסן?

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

בדפדפנים מסוימים יש ממשק לשליחת שאילתות לגבי נפח האחסון המשוער שבו נעשה שימוש במקור, יחד עם המגבלה העליונה, באמצעות navigator.storage.estimate(). במאמר חישוב נפח האחסון הזמין מוסבר איך להשתמש בנתונים האלה באפליקציות האינטרנט שלכם.

שיקולים מיוחדים לגבי מצב פרטי ב-Chrome

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

היזהרו מתשובות לא ברורות!

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

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

כשמתחילים לשמור בתגובה מטמון תשובות אטומות, אפשר להשתמש במכסה הרבה יותר מהר ממה שציפיתם. לכן, מומלץ להשתמש ב-ExpirationPlugin עם maxEntries, ואולי גם עם purgeOnQuotaError, שמוגדרים בצורה מתאימה.