Pekerja Web dalam JavaScript
Artikel ini menerangkan tentang Pekerja Web dalam JavaScript.
YouTube Video
javascript-web-worker.html
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <title>JavaScript & HTML</title>
6 <style>
7 * {
8 box-sizing: border-box;
9 }
10
11 body {
12 margin: 0;
13 padding: 1em;
14 padding-bottom: 10em;
15 font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
16 background-color: #f7f9fc;
17 color: #333;
18 line-height: 1.6;
19 }
20
21 .container {
22 max-width: 800px;
23 margin: 0 auto;
24 padding: 1em;
25 background-color: #ffffff;
26 border: 1px solid #ccc;
27 border-radius: 10px;
28 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
29 }
30
31 .container-flex {
32 display: flex;
33 flex-wrap: wrap;
34 gap: 2em;
35 max-width: 1000px;
36 margin: 0 auto;
37 padding: 1em;
38 background-color: #ffffff;
39 border: 1px solid #ccc;
40 border-radius: 10px;
41 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
42 }
43
44 .left-column, .right-column {
45 flex: 1 1 200px;
46 min-width: 200px;
47 }
48
49 h1, h2 {
50 font-size: 1.2rem;
51 color: #007bff;
52 margin-top: 0.5em;
53 margin-bottom: 0.5em;
54 border-left: 5px solid #007bff;
55 padding-left: 0.6em;
56 background-color: #e9f2ff;
57 }
58
59 button {
60 display: block;
61 margin: 1em auto;
62 padding: 0.75em 1.5em;
63 font-size: 1rem;
64 background-color: #007bff;
65 color: white;
66 border: none;
67 border-radius: 6px;
68 cursor: pointer;
69 transition: background-color 0.3s ease;
70 }
71
72 button:hover {
73 background-color: #0056b3;
74 }
75
76 #output {
77 margin-top: 1em;
78 background-color: #1e1e1e;
79 color: #0f0;
80 padding: 1em;
81 border-radius: 8px;
82 min-height: 200px;
83 font-family: Consolas, monospace;
84 font-size: 0.95rem;
85 overflow-y: auto;
86 white-space: pre-wrap;
87 }
88
89 .highlight {
90 outline: 3px solid #ffc107; /* yellow border */
91 background-color: #fff8e1; /* soft yellow background */
92 transition: background-color 0.3s ease, outline 0.3s ease;
93 }
94
95 .active {
96 background-color: #28a745; /* green background */
97 color: #fff;
98 box-shadow: 0 0 10px rgba(40, 167, 69, 0.5);
99 transition: background-color 0.3s ease, box-shadow 0.3s ease;
100 }
101 </style>
102</head>
103<body>
104 <div class="container">
105 <h1>JavaScript Console</h1>
106 <button id="executeBtn">Execute</button>
107 <div id="output"></div>
108 </div>
109
110 <script>
111 // Override console.log to display messages in the #output element
112 (function () {
113 // Override console.log
114 const originalLog = console.log;
115 console.log = function (...args) {
116 originalLog.apply(console, args);
117 const message = document.createElement('div');
118 message.textContent = args.map(String).join(' ');
119 output.appendChild(message);
120 };
121
122 // Override console.error
123 const originalError = console.error;
124 console.error = function (...args) {
125 originalError.apply(console, args);
126 const message = document.createElement('div');
127 message.textContent = args.map(String).join(' ');
128 message.style.color = 'red'; // Color error messages red
129 output.appendChild(message);
130 };
131 })();
132
133 document.getElementById('executeBtn').addEventListener('click', () => {
134 // Prevent multiple loads
135 if (document.getElementById('externalScript')) return;
136
137 const script = document.createElement('script');
138 script.src = 'javascript-web-worker.js';
139 script.id = 'externalScript';
140 //script.onload = () => console.log('javascript-web-worker.js loaded and executed.');
141 //script.onerror = () => console.log('Failed to load javascript-web-worker.js.');
142 document.body.appendChild(script);
143 });
144 </script>
145</body>
146</html>Web Worker dalam JavaScript
Web Worker dalam JavaScript ialah satu mekanisme yang membolehkan kod dijalankan dalam benang (thread) yang berasingan daripada benang utama. Ini membolehkan pengiraan berat dan operasi jangka panjang dilakukan secara asinkron, mengelakkan thread utama daripada terhalang. Dengan menggunakan Web Worker, responsif antara muka pengguna bertambah baik dan prestasi aplikasi meningkat.
Penggunaan asas Web Worker
Mari kita lihat penggunaan asas Web Worker.
Web Worker baharu dicipta dengan menentukan fail JavaScript.
1// worker.js (created as a separate file)
2onmessage = function(event) {
3 // Receive a message
4 const data = event.data;
5 // Perform heavy computation or processing
6 const result = data * 2;
7 // Return the result to the main thread
8 postMessage(result);
9}; 1// Main thread (main.js)
2const worker = new Worker('worker.js');
3
4// Send a message to the worker
5worker.postMessage(10);
6
7// Receive a message from the worker
8worker.onmessage = function(event) {
9 console.log('Result from Worker: ', event.data); // Result: 20
10};
11
12// Error handling
13worker.onerror = function(error) {
14 console.error('Worker error: ', error);
15};- Kod ini menunjukkan mekanisme asas penggunaan
Web Workeruntuk meminta pengiraan daripada benang utama dan menerima hasilnya secara asinkron. Ia menghantar10sebagai mesej kepadaWeb Workerdan menerima20sebagai mesej hasil. Benang utama danWeb Workerberkomunikasi dengan menghantar dan menerima mesej untuk meminta dan menerima hasil pemprosesan.
Fungsi asas
Web Worker menyediakan ciri-ciri asas berikut.
postMessagedanonmessageDigunakan untuk menghantar dan menerima mesej antara benang utama danWeb Worker. Hantar data denganpostMessagedan terima denganonmessage.- Kebebasan Benang (Thread Independence)
Web Workerberoperasi sepenuhnya secara bebas daripada benang utama. Oleh itu, pembolehubah dan fungsi yang ditakrif dalam thread utama tidak dapat diakses. Data yang diperlukan perlu dihantar melaluipostMessage. - Import Skrip
Untuk memuatkan skrip luaran dalam
Web Worker, gunakanimportScripts().
1// mathUtils.js
2function double(n) {
3 return n * 2;
4}1// worker.js
2importScripts('mathUtils.js');
3
4onmessage = function(event) {
5 const input = event.data;
6 const result = double(input); // mathUtils.jsの関数を使用
7 postMessage(result);
8}; 1// Main thread (main.js)
2const worker = new Worker('worker.js');
3
4// Send a message to the worker
5worker.postMessage(10);
6
7// Receive a message from the worker
8worker.onmessage = function(event) {
9 console.log('Result from Worker: ', event.data); // Result: 20
10};
11
12// Error handling
13worker.onerror = function(error) {
14 console.error('Worker error: ', error);
15};Sebagai alternatif, anda juga boleh menggunakan import seperti yang ditunjukkan di bawah.
1// lib.js
2
3// Simulated CPU-intensive task
4export function doHeavyWork(n) {
5 return n * 2;
6}1// worker.js
2import { doHeavyWork } from './lib.js';
3
4self.onmessage = (event) => {
5 const data = event.data;
6 const result = doHeavyWork(data);
7 self.postMessage(result);
8}; 1// Main thread (main.js)
2const worker = new Worker('worker.js', { type: 'module' });
3
4// Send a message to the worker
5worker.postMessage(10);
6
7// Receive a message from the worker
8worker.onmessage = function(event) {
9 console.log('Result from Worker: ', event.data); // Result: 20
10};
11
12// Error handling
13worker.onerror = function(error) {
14 console.error('Worker error: ', error);
15};- Dengan menetapkan
type: 'module'dalam argumennew Worker, anda boleh menganggap worker itu sebagai modul ES dan menggunakan sintaksimport.
Perbezaan antara Web Worker dan fungsi async
Web Worker
Ciri-ciri
- Pengasingan Benang (Thread Isolation)
Web Workermelaksanakan kod JavaScript dalam benang yang berasingan. Ini membolehkan pemprosesan pengiraan berat dilakukan tanpa menghalang benang utama (benang UI). - Pemprosesan Serentak (Concurrent Processing)
Menggunakan
Web Workermembolehkan program JavaScript melaksanakan pemprosesan serentak dalam berbilang benang. - Komunikasi Mesej
Web Workerdan benang utama tidak berkongsi data secara langsung dan bertukar mesej menggunakanpostMessagedanonmessage. - Tidak Boleh Akses UI
Web Workertidak boleh mengakses DOM, jadi ia tidak boleh memanipulasi UI secara langsung.
Kes penggunaan
- Ia sesuai untuk proses pengiraan berat seperti pemprosesan imej, analisis data, dan penyulitan.
- Ia boleh digunakan apabila anda tidak mahu menghalang benang utama.
async
Ciri-ciri
- Memudahkan Pemprosesan Asinkron
Fungsi
asyncialah satu sintaks untuk menjadikan pemprosesan asinkron lebih mudah dibaca, secara dalaman menggunakanPromise. - Benang Tunggal
Semua fungsi
asyncdijalankan pada benang utama. Oleh itu, anda perlu mencari cara untuk mengelakkan menghalang benang UI. - Optimum untuk Operasi I/O Ia sesuai untuk tugas asinkron seperti komunikasi rangkaian dan pembacaan fail, tetapi tidak sesuai untuk pengiraan berat.
Kes penggunaan
- Ia sesuai untuk komunikasi rangkaian seperti panggilan API.
- Ia sesuai untuk pembacaan dan penulisan fail menggunakan API pelayar atau Node.js.
Perbezaan Utama
| Ciri-ciri | Web Worker | async |
|---|---|---|
| Persekitaran Pelaksanaan | Utas berasingan | Utas utama |
| Tujuan | Pemprosesan selari, pengalihan pengiraan berat | Penerangan ringkas mengenai operasi tak segerak |
| Akses DOM | Tidak mungkin | Mungkin |
| Kaedah Komunikasi | Penghantaran mesej (contoh, postMessage) |
Tidak diperlukan (dikendalikan melalui panggilan fungsi terus atau await) |
| Kes Penggunaan | Pengiraan yang memakan masa, analisis data | Operasi I/O, panggilan API |
Bila Untuk Menggunakan Setiap Satu
Untuk tugas yang intensif CPU, anda boleh menggunakan Web Worker untuk mengurangkan beban pada utas utama. Sebaliknya, untuk komunikasi rangkaian atau operasi I/O, anda boleh mempermudahkan kod anda menggunakan async/await.
Dengan menggabungkan kedua-duanya dengan sesuai, anda boleh mencapai pemprosesan tak segerak yang cekap.
Contoh Penggunaan Web Worker
Contoh melaksanakan pengiraan berat
Seterusnya ialah contoh memindahkan pengiraan berat.
1// worker.js
2onmessage = function(event) {
3 const num = event.data;
4 const result = fibonacci(num);
5 postMessage(result);
6};
7
8function fibonacci(n) {
9 if (n <= 1) return n;
10 return fibonacci(n - 1) + fibonacci(n - 2);
11}1// Main thread
2const worker = new Worker('worker.js');
3
4worker.onmessage = function(event) {
5 console.log('Fibonacci result: ', event.data);
6};
7
8worker.postMessage(40); // Delegate heavy computation to the worker
- Kod ini adalah contoh penggunaan Web Worker untuk mengasingkan dan melaksanakan tugas berat seperti pengiraan jujukan Fibonacci dari benang utama.
Contoh penetapan nama tugas
Seterusnya adalah contoh menghantar dan menerima mesej dengan menentukan nama tugas.
1// worker.js
2self.onmessage = function(event) {
3 switch (event.data.task) {
4 case 'add':
5 const result = event.data.a + event.data.b;
6 self.postMessage({ task: 'result', value: result });
7 break;
8 default:
9 self.postMessage({ task: 'error', message: 'Invalid Task' });
10 }
11}; 1// Main thread
2const worker = new Worker('worker.js');
3
4worker.onmessage = function(event) {
5 switch (event.data.task) {
6 case 'result':
7 console.log('Task result: ', event.data.value);
8 break;
9 case 'error':
10 console.error('Error: ', event.data.message);
11 break;
12 }
13};
14
15worker.postMessage({ task: 'add', a: 10, b: 20 });- Kod ini adalah contoh pemprosesan berdasarkan nama
taskdalam mesej, di manaWeb Workermemulangkan hasil pengiraan atau ralat ke benang utama bersama dengan nama tugas.
Nota
Apabila menggunakan Web Worker, ambil perhatian perkara-perkara berikut.
- Tidak Boleh Akses DOM
Web Workertidak boleh memanipulasi UI atau mengakses DOM. Manipulasi DOM perlu dilakukan dalam thread utama. - Overhead Komunikasi
Terdapat sedikit overhead semasa pertukaran data antara benang utama dan
Web Worker. Ini boleh menjejaskan prestasi, terutamanya apabila sering bertukar sejumlah besar data. - Polisi Asal-Sama (Same-Origin Policy)
Skrip
Web Workertertakluk kepada polisi asal-sama (same-origin policy). Skrip tidak boleh dimuat daripada domain yang berbeza.
Menggunakan Web Worker boleh meningkatkan prestasi dan responsif aplikasi anda, tetapi adalah penting untuk menggunakannya dengan sewajarnya dengan mempertimbangkan batasan seperti ketidakupayaan untuk memanipulasi DOM.
Anda boleh mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Sila lihat juga saluran YouTube kami.