Web Worker 是 JavaScript 的一个重要特性。它允许开发者在浏览器中创建多线程的环境,以便在后台执行 JavaScript 代码,而不会阻塞主线程(通常是用户界面线程)
main.js
// 创建一个新的 Web Worker,使用 ES 模块
const worker = new Worker(new URL('worker.js', import.meta.url), {
type: 'module'
});
// 监听 Worker 发送的消息
worker.onmessage = function(event) {
console.log('Message from worker:', event.data);
};
// 发送消息到 Worker
worker.postMessage('Hello, Worker!');
// 关闭 Worker(可选)
setTimeout(() => {
worker.terminate();
console.log('Worker terminated.');
}, 5000);
worker.js
// 监听主线程发送的消息
onmessage = function(event) {
console.log('Message from main thread:', event.data);
// 处理接收到的消息并发送响应
const response = `Received your message: "${event.data}"`;
// 发送响应回主线程
postMessage(response);
};
为何要用这样创建呢?
const worker = new Worker(new URL(‘worker.js’, import.meta.url), {
type: ‘module’
});
这种创建方式 支持ES 和 动态URL.
支持ES模块,也就是(如 import 和 export),而不需要传统CommonJS 或 全局变量
这里插入一个知识点 ES模块和CommonJS对比
const worker = new Worker(new URL('dataWorker.js', import.meta.url), { type: 'module' });
worker.onmessage = function(event) {
console.log('Analysis result:', event.data);
};
// 假设我们有大量数据
const largeDataSet = Array.from({ length: 1000000 }, () => Math.random() * 100);
// 发送数据到 Worker
worker.postMessage(largeDataSet);
Worker 代码(dataWorker.js):
onmessage = function(event) {
const data = event.data;
const average = data.reduce((sum, value) => sum + value, 0) / data.length;
postMessage(average);
};
const worker = new Worker(new URL('imageWorker.js', import.meta.url), { type: 'module' });
worker.onmessage = function(event) {
const processedImageData = event.data;
// 更新图像显示
const imgElement = document.getElementById('processedImage');
imgElement.src = processedImageData; // 假设是 Base64 编码的图像
};
// 假设我们有图像数据
const imageData = /* 获取图像数据 */;
worker.postMessage(imageData);
Worker 代码(imageWorker.js):
onmessage = function(event) {
const imageData = event.data;
// 进行图像处理(例如应用滤镜)
const processedData = applyFilter(imageData); // 假设有一个 applyFilter 函数
postMessage(processedData);
};
const worker = new Worker(new URL('stockWorker.js', import.meta.url), { type: 'module' });
worker.onmessage = function(event) {
const stockData = event.data;
// 更新股票行情显示
updateStockDisplay(stockData);
};
// 模拟实时数据流
setInterval(() => {
const newStockData = fetchStockData(); // 假设有一个函数获取最新股票数据
worker.postMessage(newStockData);
}, 1000);
Worker 代码(stockWorker.js):
onmessage = function(event) {
const stockData = event.data;
// 处理股票数据(例如计算涨跌幅)
const processedData = processStockData(stockData); // 假设有一个 processStockData 函数
postMessage(processedData);
};
const worker = new Worker(new URL('physicsWorker.js', import.meta.url), { type: 'module' });
worker.onmessage = function(event) {
const collisionData = event.data;
// 处理碰撞结果
handleCollision(collisionData);
};
// 模拟游戏循环
function gameLoop() {
const gameObjects = getGameObjects(); // 获取当前游戏对象
worker.postMessage(gameObjects);
requestAnimationFrame(gameLoop);
}
gameLoop();
Worker 代码(physicsWorker.js):
onmessage = function(event) {
const gameObjects = event.data;
const collisionData = detectCollisions(gameObjects); // 假设有一个 detectCollisions 函数
postMessage(collisionData);
};
Web Worker 在以下四个场景中发挥了重要作用: