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

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

설치

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

ServiceWorkerRegistration.install

설치 중에 시작되는 첫 번째 이벤트는 웹 서비스 워커의 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

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

확장 프로그램 시작

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

유휴 및 종료

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

  • 비활성 상태가 되고 30초 후 이벤트를 수신하거나 익스텐션 API를 호출하면 이 타이머가 재설정됩니다.
  • 이벤트나 API 호출과 같은 단일 요청을 처리하는 데 5분이 넘게 걸리는 경우
  • fetch() 응답이 도착하는 데 30초 넘게 걸리는 경우

확장 프로그램 API에 대한 이벤트 및 호출은 이러한 타이머를 재설정하며, 서비스 워커가 비활성 상태가 되면 수신 이벤트가 이를 복구합니다. 하지만 예기치 않은 종료에 대비하여 서비스 워커를 설계해야 합니다.

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

전역 변수를 사용하는 대신 데이터 유지

서비스 워커가 종료되면 설정한 모든 전역 변수가 손실됩니다. 전역 변수를 사용하는 대신 저장소에 값을 저장합니다. 다음은 사용 가능한 옵션입니다. 확장 프로그램 서비스 워커에서는 Web Storage API를 사용할 수 없습니다.

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

최소 Chrome 버전 선택

Manifest V3 출시 이후 Google에서는 서비스 워커 전체 기간을 몇 가지 개선했습니다. 즉, 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()를 호출하여 이를 방지합니다.