Appearance
实时与并发
元信息
- 目标:理解浏览器 JS 单线程事件循环的两类束缚各用什么解——WebSocket 让服务器能主动推(实时通讯),Web Worker 让重计算不卡界面(并发执行)
- 关键概念:WebSocket、全双工、轮询、Web Worker、postMessage、SharedWorker
- 关联阶段:cp4
- 常见误区:以为 HTTP 也能让服务器主动推送(普通 HTTP 只能客户端先开口,靠轮询模拟推送低效且延迟高);以为 Worker 里能操作 DOM(Worker 不共享 DOM,两端只能靠消息传递数据副本);以为异步就是并发(Promise/事件循环解决"等待不卡",Worker 才解决"计算不卡")
主线程之外的世界
浏览器的 JS 运行在一个单线程的事件循环上——实时通讯的长连接与重计算都必须避免阻塞它。两类技术各解一题:
- 实时通讯:页面与服务器如何"随时互发消息"——WebSocket
- 并发执行:页面内如何"多干活不卡界面"——Web Worker
WebSocket:从"一问一答"到"双向对话"
HTTP 的请求-响应模型里,永远是客户端先开口。聊天室、协同编辑、行情推送这类"服务器主动推"的场景,靠 HTTP 只能轮询(不断发问"有新的吗?"),低效且延迟高。
- WebSocket 通过一次 HTTP 握手升级为持久的全双工 TCP 连接,此后两端随时互发消息
- API 即事件风格:
onopen / onmessage / onclose
Web Worker:把重活搬出主线程
Worker 是真正的并行线程:把重计算(大文件解析、图像处理、复杂数学)交给它,主线程保持响应。约束是不共享 DOM——两端靠消息传递(postMessage)通信,数据被复制(或 Transferable 转移)。
- 变体:SharedWorker(多标签页共享一个 worker)、Service Worker(PWA 的网络代理,见PWA)
- 呼应异步:Promise/事件循环解决"等待不卡",Worker 解决"计算不卡"
素材
- 为什么有 HTTP 协议,还要有 WebSocket 协议 https://mp.weixin.qq.com/s/0-9k5u--zW9PaYaKeHlDzw
- Web Worker 入门 https://mp.weixin.qq.com/s/pcEN0jXnY0vYo6hCl-RUfA
- MDN:WebSocket / Web Workers API