Migra a secuencias de comandos en segundo plano controladas por eventos

La implementación de 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 la extensión pueden admitirse 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 consume recursos del sistema constantemente y puede generar una sobrecarga en los dispositivos de menor potencia.

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

Designa la persistencia como falsa

Busca la clave "background" en el archivo manifest 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 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 en un patrón síncrono. La estructuración de los objetos de escucha, como se muestra a continuación, no permitirá que se invoquen porque no se registran 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 almacenamiento 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 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 del evento 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 alarmas.

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 secuencias 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()
  })
});