Когда запускается фоновый скрипт в расширении Chrome? - PullRequest
0 голосов
/ 10 ноября 2018

В моем расширении chrome у меня есть фоновый скрипт, который будет извлекать некоторые данные, которые ему понадобятся, используя XMLHttpRequest.

// note that this code is in the global scope i.e. outside of any function
// also note that I got this code from the page talking about XMLHttpRequest
var myData = [];

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = handleStateChange;
xhr.open("GET", "...", true);
xhr.send();

function handleStateChange() {
  myData = Object.values(JSON.parse(xhr.responseText));
}

Я хочу знать, когда будет запущен xor.send().

Я заметил, что каждый раз, когда я перезагружаю добавочный номер нажатием кнопки enter image description here, будет вызываться xhr.send(). Я также заметил, что открытие новой вкладки / окна не вызывает повторного запуска фонового скрипта.

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

Работает ли он только тогда, когда расширение установлено / перезагружено?

1 Ответ

0 голосов
/ 22 ноября 2018

pid диспетчера задач и столбцы

Поскольку в глобальном масштабе существует только одна копия фоновой страницы расширения для всех вкладок и окон вашего пользователя (реагируя на все ресурсы для каждой вкладки), вы никогда не увидите процесс запуска (кроме случаев перезапуска и обновления браузера), если он никогда не быть отстраненным Вы можете запустить диспетчер задач и посмотреть, всегда ли фон расширения присутствует и сохраняет тот же Process ID, указывая, что он не выключен. Существует также необязательный столбец Keepalive count, который показывает, сколько операций удерживают процесс активным, задачи с - могут быть принудительно постоянными, но, похоже, происходит по нескольким причинам.

enter image description here

приостановка никогда не происходит

Если фоновая страница имеет persistent:false и соответствует всем остальным критериям для ее закрытия, ее можно отключить до следующего события (слушатель, getBackgroundPage() и т. Д.). Следующее событие, требующее его, будет затем загружать фоновую страницу, выполняя глобальную область и т. Д., Как часть настройки слушателей, которые, как ожидается, будут вызваны.

Вы можете перейти в chrome://extensions, чтобы включить режим разработчика, а затем проверить фоновую страницу расширения, чтобы увидеть persistent и permissions: [chrome.webRequest], поскольку они мешают:

enter image description here

enter image description here

Если вы все еще получаете поведение persistent:true без явных настроек, вызывающих его, то это может быть вызвано состоянием в глобальной области видимости вашей фоновой страницы. Лучше всего следовать руководству по миграции , например, ваш запрос xhr принадлежит при запуске, если вы хотите сохранить данные при первом запуске после приостановок:

chrome.runtime.onStartup.addListener(function() {

    var xhr = new XMLHttpRequest()
    xhr.onreadystatechange = handleStateChange
    xhr.open("GET", "...", true)
    xhr.send()
    function handleStateChange() {
        chrome.storage.local.set({ myData: 
        JSON.stringify(Object.values(JSON.parse(xhr.responseText)))});
    }
  })

Это должно иметь примерно такое же поведение при запуске этого кода в глобальной области действия с persistent:true, но xhr может быть сборщиком мусора, поскольку это не область действия других прослушивателей и т. Д. (Поскольку chrome отмечает типы ресурсов, такие как сетевые сокеты в качестве причин, по которым он не может быть приостановлен, важно вывести их из области действия.) После адаптации вы можете проверить поведение при перезагрузке расширения в фоновой проверке страницы, даже если браузер все еще не приостанавливает его автоматически.

Если вы не хотите адаптироваться к persistent:false, я бы установил persistent:true в манифесте, а не полагался на текущее неявное поведение. (Даже если вы не можете вызвать приостановку в своей тестовой системе, системы с большим объемом памяти или другими условиями могут выгружать фоновые страницы, если вы установите persistent:false.)

приостановка произошла, но не вызывает проблем с вашим кодом

Если вы обнаружите, что Process ID меняется, но у вас нет проблем, то вам немного повезло. Система проверяет, работает ли ваша глобальная область всякий раз, когда она перезапускает фоновую страницу для вас для входящего запроса, но не гарантирует, что какие-либо асинхронные части выполнили . Например, он должен запустить ajax, если ему нужно запустить фоновую страницу, чтобы проверить, есть ли у вас соответствующий прослушиватель, но ему разрешено вызывать этот прослушиватель, когда синхронная часть глобальной области завершена, что может быть до ответа , Следовательно, вы не можете рассчитывать на MyData, если функция Suspend работает правильно.

обработка обработчиков событий при настройке / использовании данных в глобальной области видимости

Если вы хотите сохранить запрос xhr в глобальной области и правильно поддерживать persistent:false, вам необходимо убедиться, что слушатели регистрируются немедленно, но внутри ожидают myData. Например, если myData было обещанием, которое разрешает handleStateChange(), другие слушатели могут давать асинхронные ответы, используя myData.then(..), и получать ajax-ответ от самого последнего перезапуска фоновой страницы вместо того, чтобы сохранять в локальном хранилище chrome после ~ установки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...