Migra a secuencias de comandos en segundo plano controladas por eventos

Implementar secuencias de comandos en segundo plano no persistentes reducirá en gran medida el costo de recursos de tu extensión. La mayoría de las funciones de extensión se pueden admitir con una secuencia de comandos en segundo plano basada en eventos. Solo en circunstancias excepcionales, una extensión debe tener un segundo plano persistente, ya que consumen constantemente recursos del sistema y pueden causar tensión en dispositivos de menor potencia.

Para mejorar el rendimiento de una extensión, migra una secuencia de comandos en segundo plano persistente a un modelo no persistente basado en eventos. De forma predeterminada, "persistent" se establece en true.

Designa la persistencia como falsa

Ubica la clave "background" en el archivo de manifiesto de la extensión y, luego, agrega o actualiza el campo "persistent" a false.

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

Lo mismo se aplica a las secuencias de comandos en segundo plano que dependen de un archivo HTML.

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

Objetos de escucha de eventos de la superficie

Los objetos de escucha deben estar en el nivel superior para activar la secuencia de comandos en segundo plano si se activa un evento importante. Es posible que los objetos de escucha registrados deban reestructurarse a un patrón síncrono. Si se estructuran los objetos de escucha, como se muestra a continuación, no se podrán invocar porque no están registrados de forma síncrona.

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

En su lugar, mantén los objetos de escucha en el nivel superior y sin anidar.

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

Registra los cambios de estado en el almacenamiento

Usa la API de storage para establecer y mostrar estados y valores. Usa local.set para actualizar en la máquina local.

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

Usa local.get para obtener el valor de esa variable.

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

Transforma los temporizadores en alarmas

Los temporizadores basados en DOM, como window.setTimeout() o window.setInterval(), no se respetan en las secuencias de comandos en segundo plano no persistentes si se activan cuando la página de eventos está inactiva.

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

En su lugar, usa la API de alarms.

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

Luego, agrega un objeto de escucha.

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

Actualiza las llamadas para las funciones de secuencia de comandos en segundo plano

Si usas extension.getBackgroundPage para llamar a una función desde la página en segundo plano, actualiza a runtime.getBackgroundPage. El método más reciente activa la secuencia de comandos no persistente antes de mostrarla.

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

Este método no funcionará si la secuencia de comandos en segundo plano está inactiva, que es el estado predeterminado para una secuencia de comandos no persistente. El método más reciente incluye una función de devolución de llamada para garantizar que se haya cargado la secuencia de comandos en segundo plano.

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