Migrer vers des scripts d'arrière-plan basés sur des événements

L'implémentation de scripts en arrière-plan non persistants réduira considérablement le coût des ressources de votre extension. La plupart des fonctionnalités des extensions peuvent être compatibles avec un script en arrière-plan basé sur des événements. Une extension ne doit disposer d'un arrière-plan persistant que dans de rares circonstances, car elle consomme en permanence des ressources système et peut mettre à rude épreuve les appareils moins puissants.

Améliorez les performances d'une extension en migrant un script de fond persistant vers un modèle non persistant basé sur les événements. Par défaut, "persistent" est défini sur "true".

Désigner la persistance comme "false"

Recherchez la clé "background" dans le manifest de l'extension, puis ajoutez ou mettez à jour le champ "persistent" sur "false".

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

Il en va de même pour les scripts d'arrière-plan qui reposent sur un fichier HTML.

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

Écouteurs d'événements Surface

Les écouteurs doivent se trouver au niveau supérieur pour activer le script en arrière-plan si un événement important est déclenché. Les écouteurs enregistrés peuvent devoir être restructurés en un modèle synchrone. Structurer les écouteurs, comme ci-dessous, ne permet pas de les appeler, car ils ne sont pas enregistrés de manière synchrone.

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

Conservez plutôt les écouteurs au niveau supérieur et non imbriqués.

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

Enregistrer les modifications d'état dans l'espace de stockage

Utilisez l'API Storage pour définir et renvoyer des états et des valeurs. Utilisez local.set pour effectuer la mise à jour sur la machine locale.

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

Utilisez local.get pour récupérer la valeur de cette variable.

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

Transformer des minuteurs en alarmes

Les minuteurs basés sur le DOM, tels que window.setTimeout() ou window.setInterval(), ne sont pas respectés dans les scripts en arrière-plan non persistants s'ils se déclenchent lorsque la page d'événement est inactive.

let timeout = 1000 * 60 * 3;  // 3 minutes in milliseconds
window.setTimeout(function() {
  alert('Hello, world!');
}, timeout);

Utilisez plutôt l'API alarms.

chrome.alarms.create({delayInMinutes: 3.0})

Ajoutez ensuite un écouteur.

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

Mettre à jour les appels des fonctions de script d'arrière-plan

Si vous utilisez extension.getBackgroundPage pour appeler une fonction à partir de la page en arrière-plan, passez à runtime.getBackgroundPage. La méthode plus récente active le script non persistant avant de le renvoyer.

function backgroundFunction() {
  alert('Background, reporting for duty!')
}
document.getElementById('target').addEventListener('click', function(){
  chrome.extension.getBackgroundPage().backgroundFunction();
});

Cette méthode ne fonctionne pas si le script en arrière-plan est inactif, ce qui est l'état par défaut d'un script non persistant. La méthode plus récente inclut une fonction de rappel pour s'assurer que le script en arrière-plan a été chargé.

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