Переход на фоновые скрипты, управляемые событиями

Использование непостоянных фоновых скриптов значительно снизит потребление ресурсов вашим расширением. Большинство функций расширения можно поддерживать с помощью фонового скрипта, основанного на событиях. Постоянный фоновый скрипт следует использовать лишь в редких случаях , поскольку они постоянно потребляют системные ресурсы и могут создавать нагрузку на маломощные устройства.

Повысьте производительность расширения, переведя фоновый скрипт с постоянным доступом на модель с непостоянным доступом, основанную на событиях. По умолчанию параметр "persistent" имеет значение true.

Обозначьте настойчивость как ложную.

Найдите ключ "background" в файле манифеста расширения, затем добавьте или обновите поле "persistent" установив для него значение false.

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

То же самое относится и к фоновым скриптам, которые используют HTML-файл.

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

Обработчики событий поверхности

Для активации фонового скрипта при возникновении важного события слушатели должны находиться на верхнем уровне. Зарегистрированные слушатели, возможно, потребуется перестроить в синхронный режим. Структура слушателей, как показано ниже, не позволит их вызвать, поскольку они не зарегистрированы синхронно.

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

Вместо этого, держите слушателей на верхнем уровне и не вкладывайте их в подсистему.

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

Запись изменений состояния в хранилище

Используйте API хранилища для установки и возврата состояний и значений. Используйте local.set для обновления на локальном компьютере.

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

Используйте local.get , чтобы получить значение этой переменной.

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

Превратите таймеры в будильники.

Таймеры, основанные на DOM, такие как window.setTimeout() или window.setInterval() , не учитываются в непостоянных фоновых скриптах, если они срабатывают, когда страница событий неактивна.

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

Вместо этого используйте API оповещений .

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

Затем добавьте слушатель.

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

Обновление вызовов для функций фонового скрипта.

Если вы используете extension.getBackgroundPage для вызова функции со страницы фона, обновите метод до runtime.getBackgroundPage . Новый метод активирует непостоянный скрипт перед возвратом результата.

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

Этот метод не сработает, если фоновый скрипт неактивен, что является состоянием по умолчанию для непостоянного скрипта. Новый метод включает функцию обратного вызова для проверки загрузки фонового скрипта.

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