A implementação de scripts de segundo plano não persistentes reduz muito 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 sob circunstâncias raras uma extensão deve ter um plano de fundo persistente, já que eles consomem constantemente recursos do sistema e podem causar problemas em dispositivos de baixa potência.
Melhore o desempenho 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 "true".
Designar persistência como "false"
Localize a chave "background" no arquivo de manifesto 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 de 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 de segundo plano se um evento importante for acionado. Os listeners registrados podem precisar ser reestruturados para um padrão síncrono. A estruturação de listeners, como abaixo, não permite que eles sejam invocados porque não estã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 aninhados.
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 acessar 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 aceitos em scripts de 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 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 de segundo plano
Se você estiver usando extension.getBackgroundPage para chamar uma função da página de 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 funciona se o script de 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 de segundo plano tenha sido carregado.
document.getElementById('target').addEventListener('click', function() {
chrome.runtime.getBackgroundPage(function(backgroundPage){
backgroundPage.backgroundFunction()
})
});