Wdrożenie skryptów działających w tle, które nie są trwałe, znacznie zmniejszy koszt zasobów rozszerzenia. Większość funkcji rozszerzenia może być obsługiwana przez skrypt działający w tle oparty na zdarzeniach. Rozszerzenie powinno mieć trwałe działanie w tle tylko w rzadkich przypadkach, ponieważ stale zużywa zasoby systemowe i może obciążać urządzenia o mniejszej mocy.
Zwiększ wydajność rozszerzenia, migrując trwały skrypt działający w tle do modelu opartego na zdarzeniach i nietrwałego. Domyślnie wartość parametru "persistent" jest ustawiona na true.
Ustawienie trwałości na false
Znajdź klucz "background" w pliku manifestu rozszerzenia, a następnie dodaj lub zaktualizuj pole
"persistent" na false.
{
"name": "My extension",
...
"background": {
"scripts": ["background.js"],
"persistent": false
},
...
}
To samo dotyczy skryptów działających w tle, które korzystają z pliku HTML.
{
"name": "My extension",
...
"background": {
"page": "background.html",
"persistent": false
},
...
}
Detektory zdarzeń
Detektory muszą znajdować się na najwyższym poziomie, aby aktywować skrypt działający w tle, jeśli zostanie wywołane ważne zdarzenie. Zarejestrowane detektory mogą wymagać przekształcenia w schemat synchroniczny. Detektory skonstruowane w sposób opisany poniżej nie będą mogły być wywoływane, ponieważ nie są zarejestrowane synchronicznie.
chrome.storage.local.get('runtimeEvents', function (events) {
for (let event of events)
chrome.runtime[event].addListener(listener);
});
Zamiast tego detektory powinny znajdować się na najwyższym poziomie i nie być zagnieżdżone.
chrome.runtime.onStartup.addListener(function() {
// run startup function
})
Rejestrowanie zmian stanu w pamięci
Użyj interfejsu Storage API, aby ustawiać i zwracać stany oraz wartości. Użyj local.set, aby zaktualizować dane na komputerze lokalnym.
chrome.storage.local.set({ variable: variableInformation });
Użyj local.get, aby pobrać wartość tej zmiennej.
chrome.storage.local.get(['variable'], function(result) {
let awesomeVariable = result.variable;
// Do something with awesomeVariable
});
Przekształcanie timerów w alarmy
Timery oparte na DOM, takie jak window.setTimeout() lub window.setInterval(), nie są obsługiwane w skryptach działających w tle, które nie są trwałe, jeśli są wywoływane, gdy strona zdarzenia jest nieaktywna.
let timeout = 1000 * 60 * 3; // 3 minutes in milliseconds
window.setTimeout(function() {
alert('Hello, world!');
}, timeout);
Zamiast tego użyj interfejsu Alarms API.
chrome.alarms.create({delayInMinutes: 3.0})
Następnie dodaj detektor.
chrome.alarms.onAlarm.addListener(function() {
alert("Hello, world!")
});
Aktualizowanie wywołań funkcji skryptu działającego w tle
Jeśli używasz extension.getBackgroundPage do wywoływania funkcji ze strony działającej w tle, zaktualizuj ją do
runtime.getBackgroundPage. Nowsza metoda aktywuje skrypt nietrwały przed jego zwróceniem.
function backgroundFunction() {
alert('Background, reporting for duty!')
}
document.getElementById('target').addEventListener('click', function(){
chrome.extension.getBackgroundPage().backgroundFunction();
});
Ta metoda nie będzie działać, jeśli skrypt działający w tle jest nieaktywny, co jest domyślnym stanem skryptu nietrwałego. Nowsza metoda zawiera wywołanie zwrotne, które zapewnia, że skrypt działający w tle został wczytany.
document.getElementById('target').addEventListener('click', function() {
chrome.runtime.getBackgroundPage(function(backgroundPage){
backgroundPage.backgroundFunction()
})
});