אחסון קבוע

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

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

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

הרבה דפדפנים מודרניים תומכים באחסון מתמיד.

Browser Support

  • Chrome: 55.
  • Edge: 79.
  • Firefox: 57.
  • Safari: 15.2.

Source

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

בדיקה אם האחסון של האתר סומן כקבוע

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

// Check if site's storage has been marked as persistent
if (navigator.storage && navigator.storage.persist) {
  const isPersisted = await navigator.storage.persisted();
  console.log(`Persisted storage granted: ${isPersisted}`);
}

מתי כדאי לבקש אחסון מתמיד?

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

בקשה לאחסון מתמיד

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

// Request persistent storage for site
if (navigator.storage && navigator.storage.persist) {
  const isPersisted = await navigator.storage.persist();
  console.log(`Persisted storage granted: ${isPersisted}`);
}

איך ניתנת הרשאה?

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

דפדפן Chrome ודפדפנים אחרים שמבוססים על Chromium

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

היוריסטיקות שמשמשות לקביעה אם אתר מסוים חשוב כוללות:

  • מה רמת המעורבות באתר?
  • האם האתר הותקן או נוסף לסימניות?
  • האם האתר קיבל הרשאה להציג התראות?

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

Firefox

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

חלון קופץ שמוצג על ידי Firefox כשאתר מבקש אחסון מתמיד.
חלון קופץ שמוצג על ידי Firefox כשאתר מבקש אחסון מתמיד.

איזה אחסון מוגן על ידי אחסון מתמיד?

אם ניתנת הרשאה לאחסון מתמיד, הדפדפן לא יסיר נתונים שמאוחסנים ב:

  • Cache API
  • קובצי Cookie
  • אחסון DOM (אחסון מקומי)
  • ‫File System API (מערכת קבצים שסופקה על ידי הדפדפן ומוגנת על ידי ארגז חול)
  • IndexedDB
  • קובצי שירות (service worker)
  • מטמון אפליקציות (הוצא משימוש, לא מומלץ לשימוש)
  • WebSQL (deprecated, don't use)

איך משביתים את האחסון המתמיד

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

סיכום

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

תודה

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