Migrar para scripts em segundo plano orientados a eventos

A implementação de scripts de segundo plano não persistentes reduz muito o custo de recursos da sua extensão. A maioria dos recursos de extensão pode ser compatível com um script em segundo plano baseado em eventos. Somente em circunstâncias raras uma extensão pode ter um plano de fundo persistente, já que elas consomem recursos do sistema constantemente e podem causar sobrecarga em dispositivos de baixa potência.

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

Definir a persistência como falsa

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

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

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

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

Mostrar listeners de eventos

Os listeners precisam estar no nível superior para ativar o script em segundo plano se um evento importante for acionado. Pode ser necessário reestruturar os listeners registrados para um padrão síncrono. A estrutura dos listeners, como abaixo, não permite 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 não aninhe.

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 extrair 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 são atendidos em scripts de segundo plano não persistentes se forem acionados quando a página do evento estiver inativa.

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

Em vez disso, use a API Alarms.

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 você estiver usando extension.getBackgroundPage para chamar uma função da página em segundo plano, atualize para runtime.getBackgroundPage. O método mais recente 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 vai funcionar se o script em segundo plano estiver inativo, que é o estado padrão de um script não persistente. O método mais recente inclui uma função de callback para garantir que o script em segundo plano foi carregado.

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