Worker layanan ekstensi merespons peristiwa service worker standar dan peristiwa di namespace ekstensi. Keduanya ditampilkan bersama karena sering kali satu jenis mengikuti jenis lainnya selama penggunaan ekstensi.
Penginstalan
Penginstalan terjadi saat pengguna menginstal atau mengupdate service worker dari Chrome Web Store atau saat mereka memuat atau mengupdate ekstensi mode developer menggunakan halaman chrome://extensions. Tiga peristiwa terjadi dalam urutan ini:
install(peristiwa service worker)browser.runtime.onInstalled(peristiwa ekstensi)activate(peristiwa service worker)
ServiceWorkerRegistration.install
Peristiwa pertama yang diaktifkan selama penginstalan adalah peristiwa install pekerja layanan web.
browser.runtime.onInstalled
Berikutnya adalah peristiwa onInstalled ekstensi, yang dipicu saat ekstensi (bukan service worker) pertama kali diinstal, saat ekstensi diupdate ke versi baru, dan saat Chrome diupdate ke versi baru. Gunakan peristiwa ini untuk menetapkan status atau untuk inisialisasi satu kali, seperti menu konteks.
browser.runtime.onInstalled.addListener((details) => {
if(details.reason !== "install" && details.reason !== "update") return;
browser.contextMenus.create({
"id": "sampleContextMenu",
"title": "Sample Context Menu",
"contexts": ["selection"]
});
});
ServiceWorkerRegistration.active
Terakhir, peristiwa activate pekerja layanan diaktifkan. Perhatikan bahwa tidak seperti pekerja layanan web, peristiwa ini diaktifkan segera setelah penginstalan ekstensi karena tidak ada yang sebanding dengan pemuatan ulang halaman di ekstensi.
Mulai ekstensi
Saat profil pengguna dimulai, peristiwa browser.runtime.onStartup diaktifkan, tetapi tidak ada peristiwa service worker yang dipanggil.
Mode tidak ada aktivitas dan penonaktifan
Biasanya, Chrome menghentikan service worker jika salah satu kondisi berikut terpenuhi:
- Setelah 30 detik tidak ada aktivitas. Menerima peristiwa atau memanggil API ekstensi akan mereset timer ini.
- Saat satu permintaan, seperti peristiwa atau panggilan API, memerlukan waktu lebih dari 5 menit untuk diproses.
- Jika respons
fetch()memerlukan waktu lebih dari 30 detik untuk tiba.
Peristiwa dan panggilan ke API ekstensi akan mereset timer ini, dan jika service worker telah tidak aktif, peristiwa masuk akan mengaktifkannya kembali. Namun, Anda harus mendesain service worker agar tangguh terhadap penghentian yang tidak terduga.
Untuk mengoptimalkan konsumsi resource ekstensi, hindari agar service worker tetap aktif tanpa batas waktu jika memungkinkan. Uji ekstensi Anda untuk memastikan Anda tidak melakukannya secara tidak sengaja.
Mempertahankan data daripada menggunakan variabel global
Setiap variabel global yang Anda tetapkan akan hilang jika service worker berhenti. Daripada menggunakan variabel global, simpan nilai ke penyimpanan. Opsi Anda akan tercantum.
- browser.storage API
- API ekstensi yang menawarkan beberapa jenis penyimpanan; lokal, sesi, terkelola (domain), dan sinkronisasi. API ini menyimpan objek JSON yang diidentifikasi dan diambil dengan kunci yang ditentukan developer. Jenis penyimpanan ini tidak dihapus saat pengguna mengosongkan cache web.
- IndexedDB API
- API tingkat rendah untuk penyimpanan data terstruktur sisi klien, termasuk file dan blob. API ini menyediakan primitif untuk membuat penyimpanan dan pengambilan data transaksional. Meskipun API ini sering kali terlalu rumit untuk beberapa kasus penggunaan, sejumlah solusi penyimpanan pihak ketiga dibangun di atasnya.
- CacheStorage API
- Mekanisme penyimpanan persisten untuk pasangan objek Permintaan dan Respons. API ini dirancang khusus untuk pekerja layanan web dan digunakan untuk mengambil data dari endpoint. Ada berbagai cara untuk menggunakan API ini, bergantung pada apakah dan seberapa penting pengguna melihat data terbaru. Untuk mengetahui informasi selengkapnya, lihat The Offline Cookbook. Kecuali jika Anda secara khusus melakukan proxy permintaan jaringan menggunakan pengendali pengambilan, Anda harus menggunakan
browser.storage.
Pilih versi Chrome minimum
Sejak rilis Manifest V3, kami telah melakukan beberapa peningkatan pada masa aktif service worker. Artinya, jika ekstensi Manifes V3 Anda mendukung Chrome versi sebelumnya, ada kondisi yang harus Anda perhatikan. Jika kondisi ini tidak memengaruhi ekstensi Anda, Anda dapat melanjutkan dari bagian ini. Jika ya, pertimbangkan untuk menentukan versi Chrome minimum dalam manifes Anda.
Chrome 120
Alarm kini dapat disetel ke periode minimum 30 detik agar sesuai dengan siklus proses service worker. Lihat browser.alarms untuk mengetahui detail selengkapnya.
Chrome 118
Sesi debugger aktif yang dibuat menggunakan API browser.debugger kini membuat service worker tetap aktif. Hal ini mencegah waktu tunggu habis untuk pekerja layanan selama panggilan untuk API ini.
Chrome 116
Chrome 116 memperkenalkan peningkatan masa aktif service worker berikut:
Koneksi
WebSocketaktif kini memperpanjang masa aktif service worker ekstensi. Mengirim atau menerima pesan di seluruhWebSocketdalam service worker ekstensi akan mereset timer tidak ada aktivitas service worker.API ekstensi tambahan diizinkan untuk melewati periode waktu tunggu lima menit untuk pekerja layanan ekstensi. API ini menampilkan perintah pengguna sehingga penyelesaiannya mungkin memerlukan waktu lebih dari lima menit. Ini termasuk
desktopCapture.chooseDesktopMedia(),identity.launchWebAuthFlow(),management.uninstall(), danpermissions.request().
Chrome 114
Mengirim pesan dengan pesan yang berjalan lama membuat service worker tetap aktif. Membuka port tidak lagi mereset timer.
Chrome 110
Panggilan API ekstensi mereset timer. Sebelumnya, hanya handler peristiwa yang sedang berjalan yang akan membuat service worker tetap aktif. Peristiwa apa pun yang diantrekan, tetapi handler-nya belum dipanggil, tidak akan menyebabkan reset.
Chrome 109
Pesan yang dikirim dari dokumen di luar layar akan mereset timer.
Chrome 105
Menghubungkan ke host pesan native menggunakan browser.runtime.connectNative() akan membuat service worker tetap aktif. Jika proses host mengalami error atau dimatikan, port akan ditutup dan service worker akan dihentikan setelah timer selesai. Lindungi dari hal ini dengan memanggil browser.runtime.connectNative() di pengendali peristiwa onDisconnect port.