확장 프로그램 서비스 워커 수명 주기

확장 프로그램 서비스 워커는 표준 서비스 워커 이벤트와 확장 프로그램 네임스페이스의 이벤트에 모두 응답합니다. 확장 프로그램 사용 중에 한 유형이 다른 유형을 따르는 경우가 많으므로 함께 표시됩니다.

설치

설치는 사용자가 Chrome 웹 스토어에서 서비스 워커를 설치 또는 업데이트하거나 압축 해제된 확장 프로그램을 로드 또는 업데이트할 때 chrome://extensions 페이지를 사용하여 발생합니다. 다음과 같은 세 가지 이벤트가 이 순서대로 발생합니다.

  1. install (서비스 워커 이벤트)
  2. chrome.runtime.onInstalled (확장 프로그램 이벤트)
  3. activate (서비스 워커 이벤트)

ServiceWorkerRegistration.install

설치 중에 발생하는 첫 번째 이벤트는 웹 서비스 워커의 설치 이벤트입니다.

chrome.runtime.onInstalled

다음은 확장 프로그램의 onInstalled 이벤트입니다. 이 이벤트는 서비스 워커가 아닌 확장 프로그램이 처음 설치될 때, 확장 프로그램이 새 버전으로 업데이트될 때, Chrome이 새 버전으로 업데이트될 때 발생합니다. 이 이벤트를 사용하여 상태를 설정하거나 컨텍스트 메뉴와 같은 일회성 초기화를 실행합니다.

chrome.runtime.onInstalled.addListener((details) => {
  if(details.reason !== "install" && details.reason !== "update") return;
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

ServiceWorkerRegistration.active

마지막으로 서비스 워커의 활성화 이벤트가 발생합니다. 웹 서비스 워커와 달리 이 이벤트는 확장 프로그램에 페이지 새로고침과 같은 것이 없으므로 확장 프로그램 설치 직후에 실행됩니다.

확장 프로그램 시작

사용자 프로필이 시작되면 chrome.runtime.onStartup 이벤트가 발생하지만 서비스 워커 이벤트는 호출되지 않습니다.

유휴 상태 및 종료

일반적으로 Chrome은 다음 조건 중 하나가 충족되면 서비스 워커를 종료합니다.

  • 30초 동안 활동이 없을 때. 이벤트를 수신하거나 확장 프로그램 API를 호출하면 이 타이머가 재설정됩니다.
  • 이벤트 또는 API 호출과 같은 단일 요청을 처리하는 데 5분 이상 걸릴 때.
  • fetch() 응답이 도착하는 데 30초 이상 걸릴 때.

확장 프로그램 API에 대한 이벤트 및 호출은 이러한 타이머를 재설정하며 서비스 워커가 휴면 상태가 된 경우 수신 이벤트가 이를 다시 활성화합니다. 그렇더라도 예기치 않은 종료에 탄력적으로 대처할 수 있도록 서비스 워커를 설계해야 합니다.

확장 프로그램의 리소스 소비를 최적화하려면 가능하면 서비스 워커를 무기한 활성 상태로 유지하지 마세요. 확장 프로그램을 테스트하여 의도치 않게 이 작업을 실행하지 않도록 하세요.

전역 변수 대신 데이터 유지

서비스 워커가 종료되면 설정한 전역 변수가 삭제됩니다. 전역 변수를 사용하는 대신 값을 저장소에 저장하세요. 옵션이 나열됩니다.

chrome.storage API
여러 유형의 저장소(로컬, 세션, 관리형(도메인), 동기화)를 제공하는 확장 프로그램 API입니다. 이 API는 개발자가 정의한 키로 식별되고 검색되는 JSON 객체를 저장합니다. 이러한 유형의 저장소는 사용자가 웹 캐시를 지울 때 삭제되지 않습니다.
IndexedDB API
파일 및 Blob을 비롯한 구조화된 데이터의 클라이언트 측 저장을 위한 하위 수준 API입니다. 이 API는 트랜잭션 데이터 저장소 및 검색을 위한 기본 요소를 제공합니다. 이 API는 일부 사용 사례에 너무 복잡한 경우가 많지만 여러 서드 파티 저장소 솔루션이 이 API를 기반으로 빌드됩니다.
CacheStorage API
요청 및 응답 객체 쌍을 위한 영구 스토리지 메커니즘입니다. 이 API는 웹 서비스 워커를 위해 특별히 설계되었으며 엔드포인트에서 데이터를 검색하는 데 사용됩니다. 사용자가 최신 데이터를 보는 것이 얼마나 중요한지에 따라 이 API를 사용하는 방법은 다양합니다. 자세한 내용은 오프라인 Cookbook을 참고하세요. fetch 핸들러를 사용하여 네트워크 요청을 구체적으로 프록시하지 않는 한 chrome.storage를 사용해야 합니다.

최소 Chrome 버전 선택

Manifest V3 출시 이후 서비스 워커 수명에 몇 가지 개선사항이 적용되었습니다. 즉, Manifest V3 확장 프로그램이 이전 버전의 Chrome을 지원하는 경우 알아야 할 조건이 있습니다. 이러한 조건이 확장 프로그램에 영향을 미치지 않는다면 이 섹션을 건너뛰어도 됩니다. 영향을 미친다면 매니페스트에서 최소 Chrome 버전을 지정하는 것이 좋습니다.

Chrome 120

이제 서비스 워커 수명 주기에 맞게 알람을 최소 30초로 설정할 수 있습니다. 자세한 내용은 chrome.alarms를 참고하세요.

Chrome 118

chrome.debugger API를 사용하여 만든 활성 디버거 세션은 이제 서비스 워커를 활성 상태로 유지합니다. 이렇게 하면 이 API를 호출하는 동안 서비스 워커가 제한 시간을 초과하지 않습니다.

Chrome 116

Chrome 116에는 다음과 같은 서비스 워커 수명 개선사항이 도입되었습니다.

  • 이제 활성 WebSocket 연결이 확장 프로그램 서비스 워커 수명을 연장합니다. 확장 프로그램 서비스 워커에서 WebSocket을 통해 메시지를 보내거나 받으면 서비스 워커의 유휴 타이머가 재설정됩니다.

  • 추가 확장 프로그램 API는 확장 프로그램 서비스 워커의 5분 제한 시간을 초과할 수 있습니다. 이러한 API는 사용자 메시지를 표시하므로 해결하는 데 5분 이상 걸릴 수 있습니다. 여기에는 desktopCapture.chooseDesktopMedia(), identity.launchWebAuthFlow(), management.uninstall(), permissions.request()가 포함됩니다.

Chrome 114

수명이 긴 메시지를 사용하여 메시지를 보내면 서비스 워커가 활성 상태로 유지됩니다. 포트를 열어도 더 이상 타이머가 재설정되지 않습니다.

Chrome 110

확장 프로그램 API 호출은 타이머를 재설정합니다. 이전에는 실행 중인 이벤트 핸들러만 서비스 워커를 활성 상태로 유지했습니다. 대기열에 추가되었지만 핸들러가 호출되지 않은 이벤트는 재설정을 일으키지 않습니다.

Chrome 109

화면 외부 문서에서 전송된 메시지는 타이머를 재설정합니다.

Chrome 105

chrome.runtime.connectNative()를 사용하여 기본 메시지 호스트에 연결하면 서비스 워커가 활성 상태로 유지됩니다. 호스트 프로세스가 다운되거나 종료되면 포트가 닫히고 타이머가 완료된 후 서비스 워커가 종료됩니다. 포트의 onDisconnect 이벤트 핸들러에서 chrome.runtime.connectNative()를 호출하여 이를 방지합니다.