Migra a secuencias de comandos en segundo plano controladas por eventos

La implementación de secuencias de comandos en segundo plano no persistentes reducirá considerablemente el costo de recursos de la extensión. La mayoría de las funcionalidades de las extensiones pueden ser compatibles con una secuencia de comandos en segundo plano basada en eventos. Solo en circunstancias poco frecuentes una extensión debe tener un fondo persistente, ya que consume recursos del sistema de forma constante y puede generar un esfuerzo en los dispositivos de menor potencia.

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

Designa la persistencia como falsa

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

{
  "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 registraron de forma síncrona.

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

En cambio, mantén los objetos de escucha en el nivel superior y no anidados.

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

Cómo registrar cambios de estado en el almacenamiento

Usa la API de Storage para establecer y mostrar estados y valores. Usa local.set para realizar la actualización 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 cronómetros basados en DOM, como window.setTimeout() o window.setInterval(), no se respetan en las secuencias de comandos no persistentes en segundo plano 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 usar 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 nuevo 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 de 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 cargue la secuencia de comandos en segundo plano.

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