各种Worker
web worker
JS是单线程没有多线程,当JS在页面中运行长耗时同步任务的时候就会导致页面假死。为了解决这个问题,HTML5提供了新的APIweb worker
,可以通开启一个独立的 JS 线程来运行这些高耗时的 JS 代码。
特点
-
独立运行环境
-
一个独立于JavaScript主线程的线程,在里面执行需要消耗大量资源的操作不会堵塞主线程。
-
worker一旦新建,就会一直运行,不会被主线程的活动打断。
-
-
作用域在本Tab页内。
-
只能服务于新建它的页面,不同页面之间不能共享同一个 Web Worker。
-
当页面关闭时,该页面新建的 Web Worker 也会随之关闭,不会常驻在浏览器中。
-
-
一个页面可以创建多个web worker。
限制
-
同源限制 worker线程执行的脚本文件必须和主线程的脚本文件同源。
-
不能读取本地文件 为了安全,worker线程无法读取本地文件,它所加载的脚本必须来自网络,且需要与主线程的脚本同源。
-
不能访问DOM
worker线程在与主线程的window不同的另一个全局上下文中运行,其中无法读取主线程所在网页的DOM对象,也不能获取
document
、window
等对象,但是可以获取navigator
、location(只读)
、XMLHttpRequest
、setTimeout族
等浏览器API。 -
通信限制 worker线程与主线程不在同一个上下文,不能直接通信,需要通过
postMessage
方法来通信。 -
脚本限制 worker线程不能执行
alert
、confirm
,但可以使用发送请求
service worker
基于web worker,通过注册之后,可以独立于浏览器在后台运行,控制我们的一个或者多个页面。如果我们的页面在多个窗口中打开,Service Worker不会重复创建。
一般作为 Web 应用程序、浏览器和网络之间的代理服务。他们旨在创建有效的离线体验,拦截网络请求,以及根据网络是否可用采取合适的行动,更新驻留在服务器上的资源。他们还将允许访问推送通知和后台同步 API。
特性
-
在页面中注册并安装成功后,运行于浏览器后台,不受页面刷新的影响,
-
在web worker的基础上增加了离线缓存的能力
-
其生命周期与页面无关(关联页面未关闭时,它也可以退出,没有关联页面,它也可以启动)
-
由事件驱动的,具有生命周期
-
可以访问cache和indexDB
-
支持推送。
注意事项
- 不能访问DOM
- 它设计为完全异步,同步API(如XHR和localStorage)不能在service worker中使用。可以使用fetch替代
XMLHttpRequest
实现异步请求(ajax)。 - 网站必须使用 HTTPS。除了使用本地开发环境调试时(如域名使用
localhost
)
生命周期
install -> installed -> actvating -> Active -> Activated -> Redundant
安装中、安装后、激活中、激活、激活后、我废了。
应用场景
- 监控页面的卡顿、崩溃,通过心跳
- mock数据
- PWA
Shared Worker
由同源的所有页面共享。
与普通 Worker 区别
1、 同一个js脚本只会创建一个 sharedWorker,其他页面再使用同样的脚本创建sharedWorker,会复用已创建的 worker,这个worker由几个页面共享。
2、 sharedWorker通过port来发送和接收消息
应用场景
- 同源的多页面通信