Ringkasan pekerja

Cara pekerja web dan pekerja layanan dapat meningkatkan performa situs, dan kapan harus menggunakan pekerja web dibandingkan dengan pekerja layanan.

Andrew Guan
Andrew Guan
Demián Renzulli
Demián Renzulli

Ringkasan ini menjelaskan cara pekerja web dan pekerja layanan dapat meningkatkan performa situs, dan kapan harus menggunakan pekerja web dibandingkan dengan pekerja layanan. Lihat rangkaian ini lainnya untuk mengetahui pola komunikasi jendela dan pekerja layanan tertentu.

Browser menggunakan satu thread (thread utama) untuk menjalankan semua JavaScript di halaman web, serta menjalankan tugas seperti merender halaman dan melakukan pembersihan sampah memori. Menjalankan kode JavaScript yang berlebihan dapat memblokir thread utama, sehingga menunda browser melakukan tugas ini dan menyebabkan pengalaman pengguna yang buruk.

Dalam pengembangan aplikasi iOS/Android, pola umum untuk memastikan bahwa thread utama aplikasi tetap bebas merespons peristiwa pengguna adalah dengan mengalihkan operasi ke thread tambahan. Faktanya, di versi terbaru Android, memblokir thread utama terlalu lama menyebabkan error aplikasi.

Di web, JavaScript dirancang berdasarkan konsep thread tunggal, dan tidak memiliki kemampuan yang diperlukan untuk mengimplementasikan model multithreading seperti yang dimiliki aplikasi, seperti memori bersama.

Terlepas dari keterbatasan ini, pola serupa dapat dicapai di web menggunakan pekerja untuk menjalankan skrip di thread latar belakang, sehingga memungkinkan mereka melakukan tugas tanpa mengganggu thread utama. Pekerja adalah seluruh cakupan JavaScript yang berjalan di thread terpisah, tanpa memori bersama.

Dalam postingan ini, Anda akan mempelajari dua jenis pekerja yang berbeda (pekerja web dan pekerja layanan), persamaan dan perbedaan mereka, serta pola yang paling umum untuk menggunakannya di {i>website<i} produksi.

Diagram yang menunjukkan dua tautan antara objek Window dan pekerja web serta pekerja layanan.

Pekerja web dan pekerja layanan

Kesamaan

Pekerja web dan pekerja layanan adalah dua jenis pekerja yang tersedia untuk situs. Mereka memiliki beberapa kesamaan:

  • Keduanya berjalan di thread sekunder, yang memungkinkan kode JavaScript untuk dieksekusi tanpa memblokir thread utama dan antarmuka pengguna.
  • Objek tersebut tidak memiliki akses ke objek Window dan Document, sehingga tidak dapat berinteraksi dengan DOM secara langsung, dan memiliki akses terbatas ke API browser.

Perbedaan

Orang mungkin berpikir bahwa sebagian besar hal yang dapat didelegasikan ke pekerja web dapat dilakukan pada pekerja layanan dan sebaliknya, tetapi ada perbedaan penting di antara mereka:

  • Tidak seperti pekerja web, pekerja layanan memungkinkan Anda menangkap permintaan jaringan (melalui peristiwa fetch) dan memproses peristiwa Push API di latar belakang (melalui peristiwa push).
  • Halaman dapat menghasilkan beberapa pekerja web, tetapi satu pekerja layanan mengontrol semua tab aktif dalam cakupan yang didaftarkan.
  • Masa pakai pekerja web dikaitkan erat dengan tab yang memilikinya, sedangkan siklus proses pekerja layanan tidak bergantung padanya. Oleh karena itu, menutup tab tempat pekerja web sedang berjalan akan menghentikannya, sementara pekerja layanan dapat terus berjalan di latar belakang, meskipun situs tidak memiliki tab aktif yang terbuka.

Kasus penggunaan

Perbedaan antara kedua jenis pekerja ini mengindikasikan dalam situasi mana seseorang mungkin ingin menggunakan salah satunya:

Kasus penggunaan untuk pekerja web lebih sering terkait dengan memindahkan pekerjaan (seperti komputasi berat) ke thread sekunder, untuk menghindari pemblokiran UI.

Diagram yang menunjukkan link dari objek Window ke pekerja web.
  • Contoh: tim yang membuat video game PROXX ingin membiarkan thread utama sebebas mungkin untuk menangani input dan animasi pengguna. Untuk mencapainya, mereka menggunakan pekerja web untuk menjalankan logika game dan pemeliharaan status di thread terpisah.
Screenshot video game PROXX.

Tugas pekerja layanan umumnya lebih terkait dengan bertindak sebagai proxy jaringan, menangani tugas latar belakang, dan hal-hal seperti caching dan offline.

Screenshot video game PROXX.

Contoh: Di PWA podcast, seseorang mungkin ingin mengizinkan pengguna mendownload episode lengkap untuk mendengarkannya saat offline. Pekerja layanan, dan, khususnya, Background Fetch API dapat digunakan untuk tujuan tersebut. Dengan demikian, jika pengguna menutup tab saat episode sedang didownload, tugas tidak perlu terganggu.

Screenshot PWA Podcast.
UI diupdate untuk menunjukkan progres download (kiri). Berkat pekerja layanan, operasi dapat terus berjalan saat semua tab telah ditutup (kanan).

Alat dan library

Komunikasi jendela dan pekerja dapat diimplementasikan menggunakan API dengan tingkat yang lebih rendah yang berbeda. Untungnya, ada library yang memisahkan proses ini, yang menangani kasus penggunaan paling umum. Di bagian ini, kita akan membahas dua di antaranya yang menangani jendela untuk pekerja web dan pekerja layanan, masing-masing: Comlink dan Workbox.

Screenshot video game PROXX.

Comlink adalah library RPC (1,6 ribu) kecil yang menangani banyak detail dasar saat membuat situs yang menggunakan Pekerja Web. Metode ini telah digunakan di situs seperti PROXX dan Squoosh. Ringkasan motivasi dan contoh kodenya dapat ditemukan di sini.

Workbox

Workbox adalah library populer untuk membuat situs yang menggunakan pekerja layanan. Modul ini mengemas serangkaian praktik terbaik untuk hal-hal seperti caching, offline, sinkronisasi latar belakang, dll. Modul workbox-window memberikan cara yang mudah untuk bertukar pesan antara pekerja layanan dan halaman.

Langkah berikutnya

Bagian selanjutnya dari rangkaian ini berfokus pada pola untuk komunikasi jendela dan pekerja layanan:

  • Panduan penyimpanan cache implisit: Memanggil pekerja layanan dari halaman untuk meng-cache resource terlebih dahulu (mis. dalam skenario pengambilan data).
  • Update siaran: Memanggil halaman dari pekerja layanan untuk menginformasikan update penting (mis., versi baru situs tersedia).
  • Komunikasi dua arah: Mendelegasikan tugas kepada pekerja layanan (misalnya, download yang berat), dan memberi tahu halaman tentang progresnya.

Untuk pola komunikasi jendela dan pekerja web, lihat: Menggunakan pekerja web untuk menjalankan JavaScript di luar thread utama browser.