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

Wdrożenie nietrwałych skryptów w tle znacznie obniży koszt zasobów rozszerzenia. Większość funkcji rozszerzeń może być obsługiwana przez skrypt działający w tle na podstawie zdarzenia. Tylko w rzadkich przypadkach rozszerzenie powinno mieć stałe tło, ponieważ stale zużywa zasoby systemowe i może powodować obciążenia urządzeń o mniejszej mocy.

Aby zwiększyć wydajność rozszerzenia, przenieś stały skrypt w tle do nietrwałego modelu opartego na zdarzeniach. Domyślnie zasada "persistent" ma wartość Prawda.

Określ czas trwałości jako fałsz

Znajdź klucz "background" w pliku manifest rozszerzenia, a następnie dodaj lub zmień wartość pola "persistent" na false.

{
  "name": "My extension",
  ...
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  ...
}

To samo dotyczy skryptów działających w tle, które wymagają pliku HTML.

{
  "name": "My extension",
  ...
  "background": {
    "page": "background.html",
    "persistent": false
  },
  ...
}

Wyświetlanie detektorów zdarzeń

Aby w przypadku wywołania ważnego zdarzenia aktywować skrypt działający w tle, detektory muszą znajdować się na najwyższym poziomie. Zarejestrowane detektory mogą wymagać przekształcenia do wzorca synchronicznego. Ustrukturyzowanie odbiorników, jak pokazano poniżej, nie pozwoli na ich wywoływanie, ponieważ nie są one rejestrowane synchronicznie.

chrome.storage.local.get('runtimeEvents', function (events) {
  for (let event of events)
    chrome.runtime[event].addListener(listener);
});

Zamiast tego utrzymuj słuchacze u góry i niezagnieżdżone.

chrome.runtime.onStartup.addListener(function() {
  // run startup function
})

Rejestruj zmiany stanu w pamięci

Aby ustawiać i zwracać stany i wartości, użyj interfejsu API do przechowywania danych. Użyj local.set, aby przeprowadzić aktualizację na komputerze lokalnym.

  chrome.storage.local.set({ variable: variableInformation });

Użyj funkcji local.get, aby pobrać wartość tej zmiennej.

chrome.storage.local.get(['variable'], function(result) {
  let awesomeVariable = result.variable;
  // Do something with awesomeVariable
});

Przekształć minutniki w alarmy

Liczniki czasu na podstawie DOM, takie jak window.setTimeout() czy window.setInterval(), nie są uwzględniane w nietrwałych skryptach działających w tle, jeśli są wywoływane, gdy strona zdarzenia jest uśpiona.

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 odbiornik.

chrome.alarms.onAlarm.addListener(function() {
  alert("Hello, world!")
});

Aktualizowanie wywołań funkcji skryptu w tle

Jeśli do wywoływania funkcji ze strony w tle używasz extension.getBackgroundPage, przejdź na runtime.getBackgroundPage. Nowsza metoda aktywuje nietrwały skrypt 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 (jest to domyślny stan nietrwałego skryptu). Nowsza metoda zawiera funkcję wywołania zwrotnego, która sprawdza, czy skrypt działający w tle został wczytany.

document.getElementById('target').addEventListener('click', function() {
  chrome.runtime.getBackgroundPage(function(backgroundPage){
    backgroundPage.backgroundFunction()
  })
});