Zu ereignisgesteuerten Hintergrundskripts migrieren

Durch die Implementierung nicht persistenter Hintergrundskripts werden die Ressourcenkosten Ihrer Erweiterung erheblich gesenkt. Die meisten Erweiterungsfunktionen können durch ein ereignisbasiertes Hintergrundskript unterstützt werden. Nur unter seltenen Umständen sollte eine Erweiterung einen persistenten Hintergrund haben, da sie ständig Systemressourcen verbrauchen und Geräte mit geringerer Leistung belasten können.

Die Leistung einer Erweiterung lässt sich verbessern, indem ein nichtflüchtiges Hintergrundskript zu einem ereignisbasierten, nichtflüchtigen Modell migriert wird. Standardmäßig ist "persistent" auf „true“ festgelegt.

Persistenz als „false“ festlegen

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

{
  "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
  },
  ...
}

Ereignis-Listener anzeigen

Listener müssen auf der obersten Ebene sein, damit das Hintergrundskript aktiviert wird, wenn ein wichtiges Ereignis ausgelöst wird. Registrierte Listener müssen möglicherweise in ein synchrones Muster umstrukturiert werden. Wenn Sie Listener wie unten 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);
});

Lassen Sie Listener stattdessen auf oberster Ebene und unverschachtelt.

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

Statusänderungen im Speicher aufzeichnen

Verwenden Sie die Storage API, um Status und Werte festzulegen und zurückzugeben. Verwenden Sie local.set, um die lokale Maschine zu aktualisieren.

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

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

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

Timer in Wecker umwandeln

DOM-basierte Zeitgeber wie window.setTimeout() oder window.setInterval() werden in nicht persistenten Hintergrundskripts nicht berücksichtigt, wenn sie ausgelöst werden, während 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 Hintergrundskriptfunktionen aktualisieren

Wenn Sie extension.getBackgroundPage verwenden, um eine Funktion von der Hintergrundseite aufzurufen, aktualisieren Sie auf runtime.getBackgroundPage. Bei der neueren Methode wird das nicht persistente Skript aktiviert, 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. Das ist der Standardstatus für ein nicht persistentes Skript. Die neuere Methode enthält eine Callback-Funktion, um sicherzustellen, dass das Hintergrundskript geladen wurde.

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