Zu ereignisgesteuerten Hintergrundskripts migrieren

Wenn Sie nicht persistente Hintergrundskripts implementieren, können Sie die Ressourcenkosten Ihrer Erweiterung erheblich senken. Die meisten Erweiterungsfunktionen können von einem ereignisbasierten Hintergrundskript unterstützt werden. Eine Erweiterung sollte nur in seltenen Fällen einen persistenten Hintergrund haben, da sie ständig Systemressourcen verbrauchen und leistungsschwächere Geräte belasten können.

Sie können die Leistung einer Erweiterung verbessern, indem Sie ein nichtflüchtiges Hintergrundskript zu einem ereignisbasierten, nicht persistenten Modell migrieren. Die Standardeinstellung für "persistent" ist „true“.

Persistenz als falsch festlegen

Suchen Sie in der Manifestdatei der Erweiterung nach dem Schlüssel "background" und fügen Sie das Feld "persistent" auf „false“ hinzu oder aktualisieren Sie es auf „false“.

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

Dasselbe gilt für Hintergrundskripts, die auf einer HTML-Datei basieren.

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

Oberflächenereignis-Listener

Listener müssen sich auf oberster Ebene befinden, damit das Hintergrundskript aktiviert werden kann, wenn ein wichtiges Ereignis ausgelöst wird. Registrierte Listener müssen möglicherweise in ein synchrones Muster umstrukturiert werden. Wenn Sie Listener wie unten dargestellt strukturieren, können sie nicht aufgerufen werden, da sie nicht synchron registriert werden.

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

Belassen Sie die Listener stattdessen auf der obersten Ebene und lösen Sie die Verschachtelung auf.

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

Statusänderungen im Speicher aufzeichnen

Mit der Storage API können Sie Status und Werte festlegen und zurückgeben. Verwenden Sie local.set, um auf dem lokalen Computer zu aktualisieren.

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

Verwenden Sie local.get, um den Wert dieser Variablen abzurufen.

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

Timer in Alarme umwandeln

DOM-basierte Timer wie window.setTimeout() oder window.setInterval() werden in Skripts im nicht persistenten Hintergrund nicht berücksichtigt, wenn sie ausgelöst werden, wenn die Ereignisseite inaktiv ist.

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

Verwenden Sie stattdessen die Alarms API.

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

Fügen Sie dann einen Listener hinzu.

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

Aufrufe für Hintergrund-Skriptfunktionen aktualisieren

Wenn Sie extension.getBackgroundPage verwenden, um eine Funktion von der Hintergrundseite aufzurufen, aktualisieren Sie auf runtime.getBackgroundPage. Die neuere Methode aktiviert das nicht persistente Skript, bevor es zurückgegeben wird.

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

Diese Methode funktioniert nicht, wenn das Hintergrundskript inaktiv ist. Dies ist der Standardstatus für ein nicht persistentes Skript. Die neuere Methode enthält eine Callback-Funktion, mit der sichergestellt wird, dass das Hintergrundskript geladen wurde.

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