백그라운드 스크립트로 일정 관리하기

확장 프로그램은 Chrome 탐색 환경을 수정하거나 개선하는 데 사용되는 이벤트 기반 프로그램입니다. 이벤트는 새 페이지로 이동, 북마크 삭제, 탭 닫기와 같은 브라우저 트리거입니다. 확장 프로그램은 백그라운드 스크립트에서 이러한 이벤트를 모니터링하고 지정된 안내에 따라 반응합니다.

백그라운드 페이지는 필요할 때 로드되고 유휴 상태가 되면 로드 해제됩니다. 이벤트의 예는 다음과 같습니다.

  • 확장 프로그램이 먼저 설치되거나 새 버전으로 업데이트됩니다.
  • 백그라운드 페이지가 이벤트를 수신 대기하고 있었고 이벤트가 전달됩니다.
  • 콘텐츠 스크립트 또는 다른 확장 프로그램에서 메시지를 전송합니다.
  • 확장 프로그램의 다른 뷰(예: 팝업)에서 runtime.getBackgroundPage를 호출합니다.

로드된 후에는 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
    },
    ...
  }

확장 프로그램에서 현재 영구 백그라운드 페이지를 사용하는 경우 비영구 모델로 전환하는 방법에 대한 안내는 백그라운드 이전 가이드를 참조하세요.

확장 프로그램 초기화

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 이벤트를 수신 대기하는 경우 탭 API가 필터를 지원하지 않으므로 필터와 함께 webNavigation.onCompleted 이벤트를 대신 사용해 보세요.

chrome.webNavigation.onCompleted.addListener(function() {
    alert("This is my favorite website!");
}, {url: [{urlMatches : 'https://www.google.com/'}]});

리스너에 반응

리스너는 이벤트가 발생하면 기능을 트리거하기 위해 존재합니다. 이벤트에 반응하려면 리스너 이벤트 내부에 원하는 반응을 구조화합니다.

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를 수신하지 않고 비정상 종료될 경우 중요한 정보가 손실되지 않도록 데이터를 주기적으로 유지해야 합니다. 이를 지원하려면 storage 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 작업 관리자에서 나타났다가 사라질 때를 모니터링하여 확인할 수 있습니다.

ALT_TEXT_HERE

Chrome 메뉴를 클릭하고 더 많은 도구로 마우스를 가져간 후 '작업 관리자'를 선택하여 작업 관리자를 엽니다.

백그라운드 스크립트는 몇 초간 비활성 상태가 되면 자동으로 언로드됩니다. 마지막 순간에 정리가 필요한 경우 runtime.onSuspend 이벤트를 수신 대기합니다.

chrome.runtime.onSuspend.addListener(function() {
  console.log("Unloading.");
  chrome.browserAction.setBadgeText({text: ""});
});

하지만 runtime.onSuspend에 의존하는 것보다는 데이터를 유지하는 것이 더 좋습니다. 이 수정은 필요한 만큼의 정리를 허용하지 않으며 비정상 종료 발생 시 도움이 되지 않습니다.