확장 서비스 워커는 표준 서비스 워커 이벤트 및 확장 네임스페이스의 이벤트에 모두 응답합니다. 확장 프로그램이 사용되는 동안 한 유형이 다른 유형을 따르는 경우가 많기 때문에 함께 표시됩니다.
설치
사용자가 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가 너무 복잡한 경우가 많지만 이를 토대로 구축된 서드 파티 스토리지 솔루션이 다수 있습니다.
- CacheStorage API
- 요청 및 응답 객체 쌍의 영구 스토리지 메커니즘입니다. 이 API는 웹 서비스 워커를 위해 특별히 설계되었으며 엔드포인트에서 데이터를 검색하는 데 사용됩니다. 이 API는 사용자에게 최신 데이터를 표시하는 것이 중요한지 여부와 그 중요성에 따라 다양한 방법으로 사용할 수 있습니다. 자세한 내용은 오프라인 설명서를 참조하세요. 가져오기 핸들러를 통해 네트워크 요청을 특별히 프록시하지 않는 한
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()
를 호출하여 이를 방지합니다.