<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Service Worker on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/service-worker/</link><description>Recent content in Service Worker on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 08 Nov 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/service-worker/index.xml" rel="self" type="application/rss+xml"/><item><title>Service Worker</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/javascript/service-worker/</link><pubDate>Fri, 08 Nov 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/javascript/service-worker/</guid><description>&lt;h2 id="引言"&gt;引言&lt;/h2&gt;
&lt;p&gt;我们经常可以听到 &lt;strong&gt;Worker&lt;/strong&gt; 这个名词，比如本文要介绍的 &lt;strong&gt;ServiceWorker&lt;/strong&gt; 后面就带着一个 &lt;strong&gt;Worker&lt;/strong&gt; 的单词，那么 &lt;strong&gt;Worker&lt;/strong&gt; 实际上指的是什么呢？&lt;/p&gt;
&lt;p&gt;在介绍 &lt;strong&gt;Worker&lt;/strong&gt; 的定义之前，先来回忆一下浏览器的渲染原理。&lt;/p&gt;
&lt;p&gt;在一个 tab 打开的时候，浏览器会给这个 tab 创建一个新的渲染进程（renderer process），如下图：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/javascript/service-worker/image-01.webp"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;图1：Chrome 浏览器的多进程架构&lt;/p&gt;
&lt;p&gt;图片来源：&lt;a href="https://developer.chrome.com/blog/inside-browser-part1/"&gt;developer.chrome.com/blog/inside…&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在每一个渲染进程中，都会有一个主线程（Main Thread），负责 JavaScript 的执行以及浏览器的渲染（JavaScript 的执行与 UI 渲染是一个互相阻塞的流程）。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/javascript/service-worker/image-02.webp"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;图2：浏览器一帧的剖析&lt;/p&gt;
&lt;p&gt;图片来源：&lt;a href="https://aerotwist.com/blog/the-anatomy-of-a-frame/"&gt;aerotwist.com/blog/the-an…&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果 JavaScript 执行时间过久（比如超过 33.33 ms），那么一帧内留给 UI 渲染的时间不多，如果这时候网页有正在执行的动画，那么用户就会感受到卡顿。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;10 FPS：能够达成基本的视觉残留（参考：定格动画至少需要 12 帧每秒以上）&lt;/p&gt;
&lt;p&gt;30 FPS以下：让人感觉到明显的卡顿和不适感&lt;/p&gt;
&lt;p&gt;30-50 FPS：因人而异&lt;/p&gt;
&lt;p&gt;50-60 FPS：流畅&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一个 Worker，指的是一个可以在后台独立执行 JavaScript 脚本。它存在于一个单独的 worker 线程，即使执行一些长任务也不会阻塞主线程响应用户操作（如鼠标点击、动画等）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;另外 Worker 也指使用 &lt;code&gt;new Worker()&lt;/code&gt; 构造函数创建的一个对象，可以用在主线程与 worker 线程的通信&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/javascript/service-worker/image-03.webp"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;图3：worker 线程独立于主线程之外&lt;/p&gt;
&lt;p&gt;图片来源：&lt;a href="https://developer.chrome.com/blog/inside-browser-part3/"&gt;developer.chrome.com/blog/inside…&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Worker 与 主线程之间可以通过 &lt;code&gt;postMessage&lt;/code&gt; 进行通信：&lt;/p&gt;</description></item></channel></rss>