Migreer naar gebeurtenisgestuurde achtergrondscripts

Het implementeren van niet-permanente achtergrondscripts zal de resourcekosten van uw extensie aanzienlijk verlagen. De meeste functionaliteit van een extensie kan worden ondersteund door een gebeurtenisgestuurd achtergrondscript. Alleen in uitzonderlijke gevallen zou een extensie een persistent achtergrondscript moeten hebben, omdat deze constant systeemresources verbruikt en een belasting kan vormen voor apparaten met een lager vermogen.

Verbeter de prestaties van een extensie door een persistent achtergrondscript te migreren naar een gebeurtenisgestuurd, niet-persistent model. Standaard is "persistent" ingesteld op true.

Wijs persistentie aan als onjuist

Zoek de sleutel "background" in het extensiemanifestbestand en voeg vervolgens het veld "persistent" toe aan het bestaande veld of stel het in op false.

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

Hetzelfde geldt voor achtergrondscripts die afhankelijk zijn van een HTML-bestand.

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

Oppervlaktegebeurtenisluisteraars

Luisteraars moeten zich op het hoogste niveau bevinden om het achtergrondscript te activeren wanneer een belangrijke gebeurtenis wordt getriggerd. Geregistreerde luisteraars moeten mogelijk worden geherstructureerd naar een synchroon patroon. Als luisteraars op de onderstaande manier worden gestructureerd, kunnen ze niet worden aangeroepen omdat ze niet synchroon zijn geregistreerd.

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

Houd luisteraars in plaats daarvan op het hoogste niveau en niet genest.

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

Registreer statuswijzigingen in de opslag.

Gebruik de opslag-API om statussen en waarden in te stellen en op te halen. Gebruik local.set om de status op de lokale machine bij te werken.

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

Gebruik local.get om de waarde van die variabele op te halen.

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

Verander timers in alarmen.

DOM-gebaseerde timers, zoals window.setTimeout() of window.setInterval() , worden niet gerespecteerd in niet-persistente achtergrondscripts als ze worden geactiveerd terwijl de gebeurtenispagina inactief is.

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

Gebruik in plaats daarvan de alarm-API .

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

Voeg vervolgens een luisteraar toe.

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

Update-aanroepen voor achtergrondscriptfuncties

Als je extension.getBackgroundPage gebruikt om een ​​functie vanuit de achtergrondpagina aan te roepen, moet je overschakelen naar runtime.getBackgroundPage . De nieuwere methode activeert het niet-persistente script voordat het wordt geretourneerd.

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

Deze methode werkt niet als het achtergrondscript inactief is, wat de standaardstatus is voor een niet-persistent script. De nieuwere methode bevat een callbackfunctie om te controleren of het achtergrondscript is geladen.

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