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