확장 프로그램은 Chrome 검색 환경을 수정하거나 향상 시키는 데 사용되는 이벤트 기반 프로그램입니다.
이벤트는 새 페이지로 이동, 책갈피 제거 또는 탭 닫기와 같은 브라우저 트리거입니다.
확장 프로그램은 백그라운드 스크립트에서 이러한 이벤트를 모니터링 한 다음 지정된 지침에 따라 반응합니다.
필요할 때 배경 페이지가 로드되고 유휴 상태가 되면 언로드 됩니다. 이벤트의 몇 가지 예는 다음과 같습니다.
일단 로드 되면 백그라운드 페이지가 Chrome API 호출 또는 네트워크 요청 실행과 같은 작업을 수행하는 동안 계속 실행됩니다. 또한 보이는 모든 보기와 모든 메시지 포트가 닫힐 때까지 백그라운드 페이지가 언로드 되지 않습니다. 뷰를 열면 이벤트 페이지가 로드 되는 것이 아니라 로드 된 후에만 닫히지 않습니다.
효과적인 백그라운드 스크립트는 화재를 수신하는 이벤트가 발생하고 지정된 지침에 따라 반응 한 다음 언로드 될 때까지 휴면 상태를 유지합니다.
백그라운드 스크립트 등록
백그라운드 스크립트는 "background"필드 아래 매니페스트에 등록됩니다. "scripts"키 뒤에 배열로 나열되며 "persistent"는 false로 지정되어야 합니다.
{ "name": "Awesome Test Extension", ... "background": { "scripts": ["background.js"], "persistent": false }, ... }
모듈화 된 코드에 대해 여러 배경 스크립트를 등록 할 수 있습니다.
{ "name": "Awesome Test Extension", ... "background": { "scripts": [ "backgroundContextMenus.js", "backgroundOmniBox.js", "backgroundOauth.js" ], "persistent": false }, ... }
백그라운드 스크립트를 지속적으로 활성 상태로 유지하는 유일한 경우는 확장 프로그램에서 chrome.webRequest API를 사용하여 네트워크 요청을 차단하거나 수정하는 경우입니다. webRequest API는 비 영구 백그라운드 페이지와 호환되지 않습니다.
확장이 현재 영구 배경 페이지를 사용하는 경우 비 영구 모델로 전환하는 방법에 대한 지침은 배경 마이그레이션 가이드를 참조하십시오.
확장 초기화
설치시 확장을 초기화하려면 runtime.onInstalled 이벤트를 청취하십시오. 이 이벤트를 사용하여 상태를 설정하거나 상황에 맞는 메뉴와 같은 일회성 초기화에 사용합니다.
chrome.runtime.onInstalled.addListener(function() { chrome.contextMenus.create({ "id": "sampleContextMenu", "title": "Sample Context Menu", "contexts": ["selection"] }); });
리스너 설정
확장이 의존하는 이벤트 주변의 배경 스크립트를 구성합니다. 기능적으로 관련 있는 이벤트를 정의하면 해당 이벤트가 실행될 때까지 백그라운드 스크립트가 휴면 상태에 있게 되고 확장 프로그램에서 중요한 트리거가 누락되는 것을 방지 할 수 있습니다.
리스너는 페이지 시작부터 동기적으로 등록되어야 합니다.
chrome.runtime.onInstalled.addListener(function() { chrome.contextMenus.create({ "id": "sampleContextMenu", "title": "Sample Context Menu", "contexts": ["selection"] }); }); // This will run when a bookmark is created. chrome.bookmarks.onCreated.addListener(function() { // do something });
리스너는 제대로 트리거 되지 않으므로 비동기적으로 등록하지 마십시오.
chrome.runtime.onInstalled.addListener(function() { // ERROR! Events must be registered synchronously from the start of // the page. chrome.bookmarks.onCreated.addListener(function() { // do something }); });
확장 프로그램은 removeListener를 호출하여 백그라운드 스크립트에서 리스너를 제거 할 수 있습니다.
이벤트에 대한 모든 리스너가 제거되면 Chrome은 더 이상 해당 이벤트에 대한 확장 프로그램의 백그라운드 스크립트를 로드 하지 않습니다.
chrome.runtime.onMessage.addListener(function(message, sender, reply) { chrome.runtime.onMessage.removeListener(event); });
이벤트 필터링
이벤트 필터를 지원하는 API를 사용하여 리스너를 확장이 관심을 갖는 케이스로 제한하십시오. 확장 프로그램이 tabs.onUpdated 이벤트를 수신하는 경우 tabs API가 필터를 지원하지 않으므로 대신 필터와 함께 webNavigation.onCompleted 이벤트를 사용해보십시오.
chrome.webNavigation.onCompleted.addListener(function() { alert("This is my favorite website!"); }, {url: [{urlMatches : 'https://www.google.com/'}]});
React to Listeners
리스너는 이벤트가 발생하면 기능을 트리거하기 위해 존재합니다. 이벤트에 반응하려면 리스너 이벤트 내에서 원하는 반응을 구성합니다.
chrome.runtime.onMessage.addListener(function(message, callback) { if (message.data == “setAlarm”) { chrome.alarms.create({delayInMinutes: 5}) } else if (message.data == “runLogic”) { chrome.tabs.executeScript({file: 'logic.js'}); } else if (message.data == “changeColor”) { chrome.tabs.executeScript( {code: 'document.body.style.backgroundColor="orange"'}); }; });
백그라운드 스크립트 언로드
onSuspend를 받지 않고 확장 프로그램이 충돌하더라도 중요한 정보가 손실 되지 않도록 데이터를 주기적으로 유지해야 합니다. 이를 지원하려면 스토리지 API를 사용하십시오.
chrome.storage.local.set({variable: variableInformation});
확장에서 메시지 전달을 사용하는 경우 모든 포트가 닫혀 있는지 확인하십시오. 백그라운드 스크립트는 모든 메시지 포트가 종료 될 때까지 언로드 되지 않습니다. runtime.Port.onDisconnect 이벤트를 수신하면 열린 포트가 닫히는 시기를 알 수 있습니다. runtime.Port.disconnect를 사용하여 수동으로 닫으십시오.
chrome.runtime.onMessage.addListener(function(message, callback) { if (message == 'hello') { sendResponse({greeting: 'welcome!'}) } else if (message == 'goodbye') { chrome.runtime.Port.disconnect(); } });
백그라운드 스크립트의 수명은 확장에 대한 항목이 Chrome의 작업 관리자에서 나타나고 사라지는 시기를 모니터링하여 관찰 할 수 있습니다.
Chrome 메뉴를 클릭하고 더 많은 도구 위로 마우스를 가져간 다음 "작업 관리자"를 선택하여 작업 관리자를 엽니다.
백그라운드 스크립트는 몇 초 동안 사용하지 않으면 자체적으로 언로드 됩니다. 마지막 순간 정리가 필요한 경우 runtime.onSuspend 이벤트를 수신하십시오.
chrome.runtime.onSuspend.addListener(function() { console.log("Unloading."); chrome.browserAction.setBadgeText({text: ""}); });
그러나 데이터를 유지하는 것이 runtime.onSuspend에 의존하는 것보다 선호 되어야 합니다. 필요한 만큼 정리할 수 없으며 충돌시 도움이 되지 않습니다.
등록된 댓글이 없습니다.