Przejdź na skrypty działające w tle oparte na zdarzeniach

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