ביטול הנעילה של שיבוט מובנה להעברת הודעות בתוסף ל-Chrome

Justin Lulejian
Justin Lulejian

תאריך פרסום: 13 באפריל 2026

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

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

למה כדאי להשתמש בשיבוט מובנה?

סריאליזציה של JSON (באמצעות JSON.stringify מתחת לפני השטח) פועלת, אבל לפעמים היא מחייבת את המפתחים לבצע פעולות מורכבות כשמדובר בסוגים מודרניים של JavaScript.

הנה דוגמה ספציפית לבעיה שאולי נתקלתם בה כשפיתחתם תוסף:

// Sending a Map with JSON serialization
const myMap = new Map([['id', 123]]);

// Arrives as {} on the other side!
chrome.runtime.sendMessage(myMap);

// Workaround: Convert Map to an Array of entries before sending
const message = Array.from(myMap.entries());
chrome.runtime.sendMessage(message);

// On the receiving side:
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  const receivedMap = new Map(message);
});

יש מצבים נוספים שבהם JSON נכשל, ואולי נאלצתם למצוא פתרונות עקיפים כדי להתמודד איתם. למשל: Set, BigInt, NaN ו-Infinity, Date ו-Error אובייקטים.

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

// Sending a Map with Structured Clone
const myMap = new Map([['id', 123]]);

// Arrives as a Map on the other side!
chrome.runtime.sendMessage(myMap);

// On the receiving side:
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  // message is already a Map instance!
  console.log(message.get('id')); // 123
});

סוגים נתמכים נוספים

שיבוט מובנה תומך במגוון רחב של סוגים אחרים כמו File ו-Blob.

איך מצטרפים לתוכנית

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

{
  "name": "My Extension",
  "version": "1.0",
  "manifest_version": 3,
  "message_serialization": "structured_clone"
}

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

התמיכה באלגוריתם של שיבוט מובנה מאפשרת לנו להתאים את API להעברת הודעות בין תוספים ליכולות של פלטפורמת אינטרנט רגילה (בדומה ל-postMessage שמשמש ב-Web Workers ובתקשורת iframe), וכך להעניק לכם גמישות ויכולות נוספות.

יכולת פעולה הדדית ונקודות חשובות

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

סוגים שלא נתמכים

ההטמעה שלנו לא תומכת באובייקטים משותפים כמו SharedArrayBuffer ובהעברה של אובייקטים כמו ArrayBuffer. הפעולה SharedArrayBuffer תיכשל בסריאליזציה או בדסריאליזציה (תלוי במצב), וניסיון לשלוח אובייקט שניתן להעברה כמו Uint8Array ישלח במקום זאת עותק.

תקשורת בין שלוחות

אנחנו אוכפים התאמה של פורמטים של סריאליזציה כדי להבטיח את תקינות הנתונים. תוספים עם פורמטים שונים של סריאליזציה לא יכולים לתקשר ישירות דרך runtime.sendMessage או runtime.connect. לדוגמה, אם תוסף א' משתמש בסריאליזציה של JSON ומנסה לשלוח הודעה לתוסף ב' באמצעות שיבוט מובנה, שליחת ההודעה תיכשל והיציאה תיסגר (ולהיפך).

תקשורת בדף אינטרנט

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

העברת הודעות מקומית

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

‫toJSON() methods

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

class User {
  constructor(name, password) {
    this.name = name;
    this.password = password;
  }

  // This will be ignored by structured clone!
  toJSON() {
    return { name: this.name };
  }
}

const user = new User("Alice", "secret123");

// JSON -> {"name":"Alice"}
// Structured Clone -> { name: "Alice", password: "secret123" }

האם סריאליזציה של JSON עומדת להתבטל?

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

שיתוף משוב

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

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