Pekerja Web dalam TypeScript
Artikel ini menjelaskan Pekerja Web dalam TypeScript.
Anda dapat mempelajari tentang konsep Web Workers
dan berbagai tips penggunaannya dengan contoh.
YouTube Video
Pekerja dalam TypeScript
Worker
dalam TypeScript adalah mekanisme untuk menjalankan proses di latar belakang, terpisah dari thread utama, menggunakan API Pekerja Web JavaScript. Hal ini memungkinkan komputasi berat dan tugas asinkron dijalankan tanpa memengaruhi operasi antarmuka pengguna.
Worker
beroperasi secara paralel dengan thread utama (thread UI) dan dapat bertukar data antar thread melalui pesan. Bahkan dalam TypeScript, Anda dapat menggunakan Worker
sambil menulis kode dengan keamanan tipe.
Penggunaan Dasar Pekerja
-
Membuat Pekerja
Buat instansi
Worker
dan jalankan skrip yang ditentukan. Biasanya, skrip didefinisikan dalam file terpisah. -
Pertukaran Pesan
Kirim dan terima pesan antara thread utama dan thread
Worker
menggunakanpostMessage
danonmessage
.
Contoh: Implementasi Dasar Pekerja
- worker.ts: Skrip untuk Pekerja
1// worker.ts
2self.onmessage = (event) => {
3 const data = event.data;
4 const result = data.num1 + data.num2;
5 self.postMessage(result); // Return the result to the main thread
6};
- main.ts: Skrip untuk menggunakan Pekerja di Thread Utama
1// main.ts
2const worker = new Worker(
3 new URL('./worker.ts', import.meta.url),
4 { type: 'module' }
5);
6
7worker.onmessage = (event) => {
8 console.log("Result from worker:", event.data); // Receive message from the worker
9};
10
11worker.postMessage({ num1: 10, num2: 20 }); // Send message to the worker
- Dalam contoh ini,
worker.ts
berjalan di thread terpisah, menghitung jumlahnum1
dannum2
, lalu mengembalikannya ke thread utama. Thread utama menerima hasilnya dan menampilkannya di konsol. - Ketika Anda menentukan
type: 'module'
, skrip Worker akan diinterpretasikan sebagai modul ES, sehingga Anda dapat menggunakanimport
danexport
. Ini memungkinkan Anda menangani struktur modul tanpa menggunakanimportScripts()
yang tradisional.
Poin-Poin yang Harus Diperhatikan Saat Menggunakan Pekerja dalam TypeScript
Menambahkan Definisi Tipe
Dalam TypeScript, definisikan tipe data untuk memastikan interaksi yang aman terhadap tipe selama pengiriman dan penerimaan pesan.
1// Define data types
2interface WorkerData {
3 num1: number;
4 num2: number;
5}
6
7interface WorkerResult {
8 result: number;
9}
10
11// worker.ts
12self.onmessage = (event: MessageEvent<WorkerData>) => {
13 const data = event.data;
14 const result = data.num1 + data.num2;
15 const message: WorkerResult = { result };
16 self.postMessage(message); // Send the result in a type-safe manner
17};
18
19// main.ts
20const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });
21
22// Type the event from the worker
23worker.onmessage = (event: MessageEvent<WorkerResult>) => {
24 console.log("Result from worker:", event.data); // event.data is number
25};
26
27// Send typed data to the worker
28const message: WorkerData = { num1: 10, num2: 20 };
29worker.postMessage(message);
- Dengan menentukan parameter tipe dari
MessageEvent
, Anda dapat dengan jelas mendefinisikan tipe data yang akan diterima. Hal ini memungkinkan data untuk dipertukarkan dengan keamanan tipe.
Mengatur Webpack atau Vite
Saat menggunakan Worker
di TypeScript, penggabung seperti Webpack
atau Vite
mungkin diperlukan. Dengan menggunakan alat ini, Anda dapat menggabungkan skrip Worker
dengan benar dan membuatnya tersedia dari thread utama.
Sebagai contoh, saat menggunakan Vite
, gunakan import.meta.url
untuk mengimpor Worker
dengan benar.
1const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });
- Ini memastikan bahwa skrip
Worker
yang digabungkan dimuat dengan benar, memungkinkan pemrosesan menggunakanWorker
.
Pertimbangan untuk Pengiriman Pesan dan Concurrency
-
Penyalinan Data
Saat mengirim dan menerima pesan antara thread utama dan thread
Worker
, data akan disalin. Saat menangani data yang kompleks seperti objek, efisiensi perlu dipertimbangkan. Sering bertukar data dalam jumlah besar dapat menurunkan kinerja. -
Objek
Transferable
Beberapa objek, seperti
ArrayBuffer
, disebut sebagai objekTransferable
. ObjekTransferable
dapat dipindahkan ke Worker alih-alih disalin selama pengiriman pesan. Ini memungkinkan Anda menghindari beban tambahan dari penyalinan data.
1const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });
2
3const buffer = new ArrayBuffer(1024);
4worker.postMessage(buffer, [buffer]); // Transfer ownership to the Worker
5
6console.log(buffer.byteLength); // 0 (ownership moved)
-
Dengan melewatkan
[buffer]
sebagai argumen kedua keworker.postMessage()
,buffer
akan dipindahkan ke Worker, bukan disalin. -
Setelah ini,
buffer
di thread utama menjadi kosong (denganbyteLength
0) dan hanya dapat digunakan oleh Worker.
Menghentikan Worker
Worker
harus dihentikan setelah digunakan untuk meminimalkan konsumsi memori. Anda dapat menghentikan Worker
dengan menggunakan metode terminate
.
1const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });
2// ...
3
4worker.terminate(); // Terminate the Worker
- Kode ini menghentikan Worker dengan menggunakan metode
terminate
.
Penanganan Pengecualian di Worker
Jika terjadi kesalahan di dalam Worker
, Anda dapat menangani kesalahan tersebut menggunakan event onerror
.
1const worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });
2
3worker.onerror = (error) => {
4 console.error("Error in Worker:", error.message);
5};
- Kode ini menangkap dan menangani error yang terjadi di dalam Worker menggunakan event
onerror
.
Ringkasan
Dengan menggunakan Worker
di TypeScript, Anda dapat menjalankan tugas berat di latar belakang sambil menjaga kelancaran thread utama. Dengan memanfaatkan definisi tipe, pertukaran pesan juga dapat dilakukan secara aman tipe. Dengan memperhatikan pertukaran data dan manajemen thread, Anda dapat mencapai peningkatan kinerja dan concurrency yang efisien.
Anda dapat mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Silakan periksa juga saluran YouTube kami.