תקופת ניסיון של מקורות של עובדים משותפים עם משך חיים ארוך יותר

תאריך פרסום: 31 ביולי 2025

החל מ-Chrome 139, אפשר להשתתף בניסוי חדש של מקורות (origin) בנושא עובדים משותפים עם משך חיים מורחב. במהלך תקופת הניסיון, נוספת אפשרות חדשה extendedLifetime: true שמאפשרת לעובדים משותפים להמשיך לפעול גם אחרי שהמסמך האחרון נטען.

תרחיש השימוש בתכונה של משך חיים ארוך יותר

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

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

  • ממשקי JavaScript API סינכרוניים, כמו פעולות הכתיבה של localStorage, מופעלים עד הסוף לפני שהדף הנוכחי מוסר מהזיכרון.
  • ל-fetch API יש מספר אפשרויות כמו keepalive, ולאחרונה גם fetchLater, שמאפשרות לשלוח בקשות גם אחרי שהמסמך נסגר למשך תקופה קצרה.

עם זאת, הם מתייחסים רק לעבודה סינכרונית, למעט בקשת fetch הסופית. הם לא מאפשרים שימוש בממשקי API אסינכרוניים כמו IndexedDB,‏ Compression Streams או Web Crypto כדי לבצע גיבוב או הצפנה. הרבה ממשקי API, במיוחד ממשקי API חדשים יותר, הם אסינכרוניים כדי למנוע חסימה של השרשור הראשי, ולכן אי אפשר להשתמש בממשקי ה-API האלה בפריקה.

החלופה היא להשתמש בסקריפטים של Service Worker, שלא קשורים למחזור החיים של דפים ספציפיים. עם זאת, זהו פתרון כבד יחסית, עם דרישות מורכבות יותר לגבי מחזור החיים והניהול של המפתחים, שלא לדבר על דרישות נוספות לגבי תהליכים וזיכרון עבור המשתמשים. הם גם לא תואמים לתרחיש השימוש העיקרי של Service Workers (לפעול כ-proxy לבקשות רשת). שימוש ב-service workers מלאים רק לתרחיש השימוש של השלמת עבודה מסוימת בטעינת הדף נראה מוגזם.

הפתרון המוצע

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

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

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

הפעלת הארכת משך החיים

כדי להפעיל את התכונה באתרים עבור משתמשים, צריך להירשם לניסיון מקור של עובדים משותפים עם משך חיים מורחב. לחלופין, מפתחים יכולים להפעיל את התכונה בדפדפן שלהם באמצעות הדגל chrome://flags/#enable-experimental-web-platform-features.

קוד לדוגמה

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

const myWorker = new SharedWorker("worker.js", { extendedLifetime: true });

בנוסף, מכיוון ש-workers משותפים תומכים גם ב-blobs, אפשר להפעיל את התכונה הזו בלי סקריפט נפרד. לדוגמה, כדי לכתוב נתונים ל-IndexedDb:

const sharedWorkerScript = `
  const transaction = db.transaction("analytics", "readwrite");
  const store = transaction.objectStore("analytics");
  const request = store.get("visitCount");
  request.onsuccess = (event) => {
    const newCount = (event.target.result || 0) + 1;
    store.put(newCount, "visitCount");
  };
`;

document.addEventListener("pagehide", () => {
  const blob = new Blob([sharedWorkerScript], { type: "text/javascript" });
  const blobURL = URL.createObjectURL(blob);
  new SharedWorker(blobURL, { extendedLifetime: true });
});

יש לנו גם אפליקציה לדוגמה כאן: https://sharedworker-extendedlifetime.netlify.app/. כשמטעינים מחדש את הדף (או סוגרים אותו ופותחים אותו מחדש תוך 30 שניות), החישוב הקודם עדיין זמין.

אפשר לראות את העובדים המשותפים באתר בכתובת: chrome://inspect/#workers בקרוב נשפר את האפשרות הזו כדי להראות אם נעשה שימוש באפשרות extendedLifetime. גם עובדים משותפים עם משך חיים מורחב ימשיכו להופיע בדף הזה למשך 30 שניות אחרי שהדף נטען.

שיתוף משוב

נשמח לקבל ממך משוב על תקופת הניסיון המורחבת של מקור shared worker.

הצורה של ה-API נמצאת בדיון ב-GitHub, ויש לנו הסבר טכני מפורט יותר.

כדי לשלוח משוב על ההטמעה של Chrome, אפשר לדווח על באג ב-Chromium.