Esegui la migrazione agli script in background basati su eventi

L'implementazione di script in background non permanenti riduce notevolmente il costo delle risorse dell'estensione. La maggior parte delle funzionalità dell'estensione può essere supportata da uno script in background basato su eventi. Solo in circostanze rare un'estensione dovrebbe avere uno sfondo persistente, in quanto consuma costantemente risorse di sistema e può causare un sovraccarico sui dispositivi con potenza inferiore.

Migliora le prestazioni di un'estensione eseguendo la migrazione di uno script in background permanente a un modello non permanente basato su eventi. Per impostazione predefinita, il valore di "persistent" è true.

Specifica la persistenza come falsa

Individua la chiave "background" nel file manifest dell'estensione, quindi aggiungi o aggiorna il campo "persistent" impostandolo su false.

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

Lo stesso vale per gli script in background che si basano su un file HTML.

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

Listener di eventi Surface

I listener devono essere al livello superiore per attivare lo script in background se viene attivato un evento importante. Potrebbe essere necessario ristrutturare i listener registrati secondo un pattern sincrono. La strutturazione degli ascoltatori, come di seguito, non ne consente l'utilizzo perché non sono registrati in modo sincrono.

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

Invece, mantieni gli ascoltatori al livello superiore e non nidificati.

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

Registra le modifiche dello stato nello spazio di archiviazione

Utilizza l'API Storage per impostare e restituire stati e valori. Utilizza local.set per eseguire l'aggiornamento sulla macchina locale.

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

Usa local.get per acquisire il valore di questa variabile.

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

Trasforma i timer in sveglie

I timer basati su DOM, come window.setTimeout() o window.setInterval(), non vengono rispettati negli script in background non persistenti se vengono attivati quando la pagina dell'evento è inattiva.

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

Utilizza invece l'API allarmi.

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

Quindi aggiungi un listener.

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

Aggiorna le chiamate per le funzioni di script in background

Se utilizzi extension.getBackgroundPage per chiamare una funzione dalla pagina in background, esegui l'aggiornamento a runtime.getBackgroundPage. Il metodo più recente attiva lo script non persistente prima di restituirlo.

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

Questo metodo non funziona se lo script in background non è attivo, ovvero lo stato predefinito per uno script non persistente. Il metodo più recente include una funzione di callback per garantire che lo script in background sia stato caricato.

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