搞清楚 Worker 家族

246 阅读2分钟

分类

workers.png

Web Workers

背景

JS 单线程限制,执行大量计算时会阻塞渲染。于是通过 Web Worker 来减轻主线程中计算密集型工作。

原理

同在主浏览器进程下,存在 JS 主线程,而一旦创建了 Web Worker,它就会在 JS 主线程之外创建的 Worker 线程中执行相应的脚本代码。

特点

  • Worker 和 JS 主线程之间传递数据:发送端使用 postMessage() 发送数据,接收端使用事件监听器 onmessage 监听
  • 每个 Worker 线程中都有一个独立的全局环境,该环境不能够访问到 DOM、BOM,只能基于事件触发来传输数据

应用

典型场景:通常用于计算密集型操作,或者在一个不可预知的时间访问到数据

  • 预加载并缓存数据供以后使用
  • 轮询和处理来自服务端的数据
  • 大数据集的计算和处理
  • 游戏中与移动相关的计算
  • 图像、视频、音频的处理和过滤
  • 处理文本数据(代码语法、拼写检查、字数)

Service Worker

背景

sw 最大的意义就是提供了离线打开网页的功能。如果需要实现 Offline App,浏览器和服务器之间需要有一个服务器代理网络请求,这个服务器代理就叫 service worker。即使不是离线情况下使用,也能够优先使用缓存内容,减少对服务器请求。

原理

  • 基于 web worker(一个独立于 JS 主线程的独立线程,在里面执行需要消耗大量资源的操作不会阻塞主线程)
  • 在 web worker 的基础上增加了离线缓存的能力
  • 本质上充当 Web 应用程序服务器与浏览器之间的代理服务器(可以拦截全站的请求,并作出相应的动作->由开发者指定的动作)

特点

  • 创建有效的离线体验(将一些不常更新的内容缓存在浏览器,提高访问体验)
  • 完全异步,由事件驱动,具有生命周期
  • 可以访问 cache 和 indexDB
  • 支持推送
  • 并且可以让开发者自己控制缓存的内容和版本

注意事项

  • 出于安全性考虑,只有 https 可以承载 serviceWorker
  • 其生命周期完全独立于页面