Service Worker
引言 我们经常可以听到 Worker 这个名词,比如本文要介绍的 ServiceWorker 后面就带着一个 Worker 的单词,那么 Worker 实际上指的是什么呢? 在介绍 Worker 的定义之前,先来回忆一下浏览器的渲染原理。 在一个 tab 打开的时候,浏览器会给这个 tab 创建一个新的渲染进程(renderer process),如下图: 图1:Chrome 浏览器的多进程架构 图片来源:developer.chrome.com/blog/inside… 在每一个渲染进程中,都会有一个主线程(Main Thread),负责 JavaScript 的执行以及浏览器的渲染(JavaScript 的执行与 UI 渲染是一个互相阻塞的流程)。 图2:浏览器一帧的剖析 图片来源:aerotwist.com/blog/the-an… 如果 JavaScript 执行时间过久(比如超过 33.33 ms),那么一帧内留给 UI 渲染的时间不多,如果这时候网页有正在执行的动画,那么用户就会感受到卡顿。 10 FPS:能够达成基本的视觉残留(参考:定格动画至少需要 12 帧每秒以上) 30 FPS以下:让人感觉到明显的卡顿和不适感 30-50 FPS:因人而异 50-60 FPS:流畅 一个 Worker,指的是一个可以在后台独立执行 JavaScript 脚本。它存在于一个单独的 worker 线程,即使执行一些长任务也不会阻塞主线程响应用户操作(如鼠标点击、动画等)。 另外 Worker 也指使用 new Worker() 构造函数创建的一个对象,可以用在主线程与 worker 线程的通信 图3:worker 线程独立于主线程之外 图片来源:developer.chrome.com/blog/inside… Worker 与 主线程之间可以通过 postMessage 进行通信: ...