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

Wdrożenie nietrwałych skryptów działających w tle znacznie zmniejszy koszty zasobów rozszerzenia. Większość funkcji rozszerzeń może obsługiwać skrypt działający w tle na podstawie zdarzenia. Tylko w rzadkich przypadkach rozszerzenie powinno mieć trwałe tło, ponieważ stale zużywa zasoby systemowe i może obciążać urządzenia o mniejszych możliwościach.

Zwiększ wydajność rozszerzenia, przenosząc trwały skrypt uruchamiany w tle na model nietrwały oparty na zdarzeniach. Domyślnie "persistent" ma wartość Prawda.

Oznacz trwałość jako fałszywą

W pliku manifest rozszerzenia odszukaj klucz "background", a potem dodaj lub zaktualizuj pole "persistent", aby ustawić wartość false (fałsz).

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

To samo dotyczy skryptów uruchamianych w tle, które korzystają z pliku HTML.

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

Wyświetlanie detektorów zdarzeń

Aby skrypt tła mógł zostać aktywowany, gdy zostanie wywołane ważne zdarzenie, musisz umieścić odbiorców na najwyższym poziomie. Zarejestrowanych detektorów może być konieczne przystosowanie do wzorca synchronicznego. Takie ustrukturyzowanie odbiorców nie pozwoli na ich wywołanie, ponieważ nie są rejestrowane synchronicznie.

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

Zamiast tego pozostaw je na najwyższym poziomie i nie zagnieżdżaj.

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

Rejestrowanie zmian stanu w magazynie

Aby ustawiać i zwracać stany i wartości, użyj interfejsu storage API. Aby zaktualizować aplikację na komputerze lokalnym, użyj local.set.

  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łcanie liczników czasu w alarmy

Liczniki czasu oparte na DOM, np. window.setTimeout() czy window.setInterval(), nie są uwzględniane w nietrwałych skryptach działających w tle, jeśli są uruchamiane, 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!")
});

Zaktualizuj wywołania funkcji skryptów działających w tle

Jeśli używasz funkcji extension.getBackgroundPage do wywołania funkcji ze strony 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 zadziała, jeśli skrypt w tle jest nieaktywny, co jest domyślnym stanem skryptu nietrwałego. Nowsza metoda zawiera funkcję wywołania zwrotnego, która zapewnia załadowanie skryptu w tle.

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