别让主线程累成狗!——带你 10 分钟撸一个 Web Worker,让浏览器偷偷开外挂

🐶 开场白:主线程的悲惨日常

想象一下,你正在快乐地刷着网页,突然点了个「生成年度账单」按钮,页面瞬间卡成 PPT,连滚动条都开始跳机械舞。

罪魁祸首就是:JavaScript 主线程被一堆计算活埋了

这时候,你需要一个影子分身------Web Worker!它能在浏览器后台悄悄干活,不抢主线程的饭碗,让页面永远丝滑得像德芙广告。


🧬 什么是 Web Worker?

一句话:

Web Worker 是浏览器提供的「后台线程 API」,让你把重计算、加密、大文件处理等脏活累活丢给它,主线程继续专心伺候用户。

特点

  • 运行在独立线程,不阻塞 UI
  • 无法操作 DOM(防止你乱来)
  • 通过消息机制与主线程通信(像异地恋,靠微信传情)

🔥 实战:用 Worker 算 1 亿个数之和

1️⃣ 主线程(index.html)

html 复制代码
<!DOCTYPE html>
<html>
<body>
  <button onclick="startWorker()">开始计算!</button>
  <p id="result">结果会出现在这里</p>

  <script>
    function startWorker() {
      // 1. 创建 Worker(注意同源限制)
      const worker = new Worker('./worker.js');

      // 2. 发消息:把活丢给 Worker
      worker.postMessage({ count: 1e8 });

      // 3. 收结果:Worker 算完会回传
      worker.onmessage = (e) => {
        document.getElementById('result').textContent = `总和:${e.data}`;
        worker.terminate(); // 干完活就让它下班
      };

      // 4. 监听错误(防止背锅)
      worker.onerror = (err) => console.error('Worker 崩溃:', err);
    }
  </script>
</body>
</html>

2️⃣ Worker 线程(worker.js)

javascript 复制代码
// 偷偷在后台算 1 亿个数之和
self.onmessage = function (e) {
  const { count } = e.data;
  let sum = 0;

  // 故意算慢点,让你看清主线程不卡
  for (let i = 0; i < count; i++) {
    sum += i;
  }

  // 把结果传回主线程
  self.postMessage(sum);
};

3️⃣ 效果对比

  • 不用 Worker:页面卡死 3 秒,鼠标转圈
  • 用 Worker:页面秒开,进度条优雅加载(甚至能边算边刷抖音)

🎪 进阶玩法:SharedArrayBuffer + Atomics(多线程抢红包)

如果你想让多个 Worker 同时读写同一块内存(比如多人协作画板),可以用 SharedArrayBuffer + Atomics 实现「无锁并发」。

(PS:需要开启跨域隔离,生产环境需 HTTPS)

javascript 复制代码
// 主线程创建共享内存
const sharedBuffer = new SharedArrayBuffer(4); // 4 字节
const sharedArray = new Int32Array(sharedBuffer);

// Worker 里原子加 1
Atomics.add(sharedArray, 0, 1);

🐱‍🏍 彩蛋:Worker 也能玩花样

类型 用途 示例代码片段
Inline Worker 直接写在 <script> 标签里,无需文件 const blob = new Blob([code], {type: 'application/javascript'});
Service Worker 离线缓存、PWA 黑科技 navigator.serviceWorker.register('sw.js')
Audio Worklet 音频线程(实时处理麦克风) 用于 Web Audio API 的音频线程

🌈 结语:把重活交给 Worker,主线程只负责貌美如花

下次遇到:

  • 前端 Excel 导入导出(几十万行数据)
  • 图片压缩/滤镜(Canvas 像素级计算)
  • 加密解密(比如 Web3 钱包)

第一反应:上 Worker!

毕竟,狗都能累吐舌头,但浏览器主线程不能。

"Worker 不是银弹,但它是主线程的呼吸机。"

------ 某位不想加班的前端


📦 源码仓库GitHub Demo 点这里

💬 评论区提问:你准备用 Worker 优化哪个功能?

相关推荐
533_3 分钟前
[echarts] 更新数据
前端·javascript·echarts
excel3 分钟前
理解 JavaScript 中的迭代器协议与中断行为:for...of vs for...in
前端
幻雨様5 分钟前
UE5多人MOBA+GAS 番外篇:同时造成多种类型伤害,以各种属性值的百分比来应用伤害(版本二)
java·前端·ue5
种子q_q6 分钟前
组合索引、覆盖索引、聚集索引、非聚集索引的区别
后端·面试
讨厌吃蛋黄酥10 分钟前
利用Mock实现前后端联调的解决方案
前端·javascript·后端
zzywxc78731 分钟前
在处理大数据列表渲染时,React 虚拟列表是提升性能的关键技术,但在实际实现中常遇到渲染抖动和滚动定位偏移等问题。
前端·javascript·人工智能·深度学习·react.js·重构·ecmascript
Hello.Reader1 小时前
Rust → WebAssembly 的性能剖析全指南
前端·rust·wasm
前端小巷子1 小时前
Vue 2 Diff 算法
前端·vue.js·面试
奕辰杰5 小时前
关于npm前端项目编译时栈溢出 Maximum call stack size exceeded的处理方案
前端·npm·node.js
JiaLin_Denny7 小时前
如何在NPM上发布自己的React组件(包)
前端·react.js·npm·npm包·npm发布组件·npm发布包