Migrar para scripts em segundo plano orientados a eventos

A implementação de scripts em segundo plano não persistentes reduzirá bastante o custo de recursos da extensão. A maioria das funcionalidades de extensão pode ser compatível com um script de segundo plano baseado em eventos. Somente em circunstâncias raras as extensões precisam ter um plano de fundo persistente, porque elas consomem recursos do sistema constantemente e podem sobrecarregar dispositivos de baixo consumo.

Melhore o desempenho de uma extensão migrando um script em segundo plano persistente para um modelo não persistente baseado em eventos. Por padrão, "persistent" é definido como verdadeiro.

Designar a persistência como falsa

Localize a chave "background" no arquivo de manifesto de extensão e adicione ou atualize o campo "persistent" para "false".

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

O mesmo se aplica aos scripts em segundo plano que dependem de um arquivo HTML.

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

Listeners de eventos de superfície

Os listeners precisam estar no nível superior para ativar o script em segundo plano se um evento importante for acionado. Os listeners registrados podem precisar ser restaurados para um padrão síncrono. Estruturar listeners, como mostrado abaixo, não vai permitir que eles sejam invocados, porque não são registrados de forma síncrona.

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

Em vez disso, mantenha os listeners no nível superior e desaninhados.

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

Registrar mudanças de estado no armazenamento

Use a API storage para definir e retornar estados e valores. Use local.set para atualizar na máquina local.

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

Use local.get para capturar o valor dessa variável.

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

Transformar timers em alarmes

Os timers baseados em DOM, como window.setTimeout() ou window.setInterval(), não serão respeitados em scripts em segundo plano não persistentes se forem acionados quando a página de eventos estiver inativa.

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

Em vez disso, use a API de alarmes.

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

Em seguida, adicione um listener.

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

Atualizar chamadas para funções de script em segundo plano

Se estiver usando extension.getBackgroundPage para chamar uma função da página em segundo plano, atualize para runtime.getBackgroundPage. O método mais novo ativa o script não persistente antes de retorná-lo.

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

Esse método não funcionará se o script em segundo plano estiver inativo, que é o estado padrão para um script não persistente. O método mais recente inclui uma função de callback para garantir que o script de segundo plano seja carregado.

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