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

La mise en œuvre de scripts d'arrière-plan non persistants réduit considérablement le coût des ressources de votre extension. La plupart des fonctionnalités d'extension peuvent être compatibles avec un script d'arrière-plan basé sur des événements. Une extension ne peut avoir un arrière-plan persistant que dans de rares circonstances, car elle consomme constamment des ressources système et peut mettre à rude épreuve les appareils de faible puissance.

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

Définir la persistance comme fausse

Recherchez la clé "background" dans le fichier 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 de surface

Les écouteurs doivent se trouver au premier niveau pour activer le script d'arrière-plan si un événement important est déclenché. Vous devrez peut-être restructurer les écouteurs enregistrés dans un modèle synchrone. Comme indiqué ci-dessous, la structuration des écouteurs ne leur permet pas d'être appelés, 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);
});

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

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

Changements d'état d'enregistrement 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 DOM, tels que window.setTimeout() ou window.setInterval(), ne sont pas respectés dans les scripts d'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!")
});

Appels de mise à jour pour les fonctions de script d'arrière-plan

Si vous utilisez extension.getBackgroundPage pour appeler une fonction à partir de la page en arrière-plan, effectuez la mise à jour vers runtime.getBackgroundPage. La méthode la 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, c'est-à-dire l'état par défaut d'un script non persistant. La méthode la plus récente inclut une fonction de rappel pour s'assurer que le script en arrière-plan est chargé.

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