העברה לסקריפטים מבוססי-אירועים ברקע

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

כדי לשפר את הביצועים של תוסף, אפשר להעביר סקריפט רקע מתמשך למודל לא מתמשך שמבוסס על אירועים. כברירת מחדל, "persistent" מוגדר כ-True.

הגדרת ההתמדה כ-false

מאתרים את המפתח "background" בקובץ manifest של התוסף, ואז מוסיפים או מעדכנים את השדה "persistent" לערך false.

{
  "name": "My extension",
  ...
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  ...
}

אותו עיקרון חל על סקריפטים ברקע שמסתמכים על קובץ HTML.

{
  "name": "My extension",
  ...
  "background": {
    "page": "background.html",
    "persistent": false
  },
  ...
}

פונקציות event listener של משטחים

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

chrome.storage.local.get('runtimeEvents', function (events) {
  for (let event of events)
    chrome.runtime[event].addListener(listener);
});

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

chrome.runtime.onStartup.addListener(function() {
  // run startup function
})

תיעוד שינויים במצב באחסון

משתמשים ב-Storage API כדי להגדיר ולהחזיר מצבים וערכים. אפשר להשתמש ב-local.set כדי לעדכן במחשב המקומי.

  chrome.storage.local.set({ variable: variableInformation });

משתמשים ב-local.get כדי לאחזר את הערך של המשתנה הזה.

chrome.storage.local.get(['variable'], function(result) {
  let awesomeVariable = result.variable;
  // Do something with awesomeVariable
});

הפיכת טיימרים לשעונים מעוררים

שעוני עצר מבוססי DOM, כמו window.setTimeout() או window.setInterval(), לא מכובדים בסקריפטים של רקע לא קבועים אם הם מופעלים כשדף האירוע לא פעיל.

let timeout = 1000 * 60 * 3;  // 3 minutes in milliseconds
window.setTimeout(function() {
  alert('Hello, world!');
}, timeout);

במקום זאת, צריך להשתמש ב-alarms API.

chrome.alarms.create({delayInMinutes: 3.0})

ואז מוסיפים מאזין.

chrome.alarms.onAlarm.addListener(function() {
  alert("Hello, world!")
});

עדכון הקריאות לפונקציות של סקריפט ברקע

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

function backgroundFunction() {
  alert('Background, reporting for duty!')
}
document.getElementById('target').addEventListener('click', function(){
  chrome.extension.getBackgroundPage().backgroundFunction();
});

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

document.getElementById('target').addEventListener('click', function() {
  chrome.runtime.getBackgroundPage(function(backgroundPage){
    backgroundPage.backgroundFunction()
  })
});