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