Javascript 由于它的单线程特性,任何“重量”操作都会阻塞主线程,让我们的应用变得卡顿、看起来没有响应。为了提升性能和体验,现代浏览器允许我们将一些工作交给 Worker,把原本的单线程应用变成多线程运行。

浏览器中提供了 3 种 Worker,分别是:

  1. Web worker—— 包含专用 worker共享 worker
  2. Service worker
  3. Worklet—— 包含PaintWorklet、AudioWorklet、AnimationWorklet、LayoutWorklet。

Worklet 似乎是专为媒体之类的应用设计,且仍处于试验状态。因此,本篇内容将只探讨更通用的 Web worker 及 Service worker。

Web worker

Web worker 特别适用于后台跑脚本。现在的网页都可以注册多个 Worker,让不同的任务在各自独立的环境中完成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SmWroyUz-1666585948825)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4d9439fa4d074d5f85b8389ea839360a~tplv-k3u1fbpfcp-zoom-1.image)]

(图片来自Workers Overview)

用Worker API 创建一个页面专属线程的方法如下:

const myWorker = new Worker("worker.js");

如果同源的不同标签想共享一个线程,则可以用SharedWorker API:

const mySharedWorker = new SharedWorker("sharedWorker.js");

这两种 Worker 的用法近似,但在页面和 Worker 的连接上,共享 Worker 是通过端口来通信的。因此在注册共享 Worker 的时候必须指定一个可用的端口。然后在主线程中可以如下发送和接收消息:

mySharedWorker.port.postMessage("哈喽Worker!");
mySharedWorker.port.onmessage = (e) => {console.log("收到消息:", e.data);
};

在共享 Worker 跑的脚本中可以如下处理消息:

onconnect = (e) => {const port = e.ports[0];port.onmessage = (e) => {port.postMessage('收到消息 "${e.data}"`);};
}

专属 Worker 的通信则比共享 Worker 的更直观简洁。在主线程中可以如下发送和接收消息:

myWorker.postMessage('哈喽Worker!');
myWorker.onMessage = (e) => {console.log('收到消息:', e.data);
};

在专属 Worker 中可以如下处理消息:

onmessage = (e) => {postMessage('收到消息:"${e.data}"`);
};

此外,你可能还注意到一个区别是专属 Worker 与页面绑定在一起,因此页面关闭的话专属 Worker 也会被终止。

Service worker

Service worker 相当于是浏览器在网页和服务器通信中插入的一个“中间层”。因此它可以操作服务器请求,但由于安全和隐私性的考虑,浏览器对可以操作的范围有非常大的限制。

(图片来自Workers Overview)

不同于 Web worker,它有一个更复杂的生命周期:

  1. 在主线程中用navigator.serviceWorker.register()注册 Service worker,然后浏览器异步下载 worker 用的脚本;
  2. 如果这个 Service worker 是新注册的,安装下载脚本。否则就更新已存在的脚本;
  3. 如果在这个 Service worker 声明管辖的范围内没有其他旧 worker 正在控制客户端,激活 worker;
  4. 如果脚本已有新版本替代,弃置旧脚本。

Service worker 拥有一些列API 及事件来做如下的事情:

  • 缓存数据
  • 拦截请求
  • 管理浏览器通知

基于这些能力,我们可以做很多有意思的事情。容我待会再聊。

他们的限制

Web worker 和 Service worker 功能强大,但也有不少限制。其中包括:

无权访问 DOM、window 对象和其它一些可能涉及隐私的 API,如 localStorage。这带来的有点事 Worker 的运行环境与页面的运行环境各自独立,互不打扰。然而这也意味着如果你想让 Worker 帮忙干些 DOM 相关的费力活是很麻烦的。

主线程和 Worker 之间通信的信息是个副本。这个副本用了一个算法叫the structured clone algorithm。这算法有点类似于JSON.stringify()JSON.parse(),有很多数据类型在克隆的过程中被抹掉。且不同于 JSON 的接口,这个算法会直接让不支持的数据 key 都消失,甚至有时候抛出异常。

仅提供对 ES 模块的有限支持。虽说现代浏览器已大部分支持直接运行 ES 模块,但在 Worker 里它还是试验中的状态,支持的浏览器也很少。

As of Mar 1, 2019, only Chrome 80+ supports this feature, while Firefox has an open feature request. No other browsers are known to have support for production usage of worker scripts written as modules.

在支持的浏览器中,你可以如下打开一个有 ES 模块支持的 Worker:

new Worker("worker.js", {type: "module",
});

但含有关键字importexport的脚本并不能很好地工作,甚至会报错终止 Worker 的运行。

还有一个槽点是在 Worker 里打开一个新 Worker 这个在文档中有所提及的功能几乎没法用。有些第三方库比如esbuild-wasm内置了打开 Worker 运行的逻辑,那由这些库提供的功能都无法在 Worker 中调用的话,组织代码起来比较费力,需要让主线程帮忙转发消息。

浅谈Web Worker和Service worker相关推荐

  1. 浅谈web api和Webservice

    浅谈web api和Webservice webapi用的是http协议,webservice用的是soap协议 webapi无状态,相对webservice更轻量级.webapi支持如get,pos ...

  2. 浅谈web应用的负载均衡、集群、高可用(HA)解决方案

    浅谈web应用的负载均衡.集群.高可用(HA)解决方案 转载于:https://www.cnblogs.com/hfultrastrong/p/7887420.html

  3. 浅谈web开发以及django的安装和入门

    浅谈web开发 1.B/S和C/S结构 B/S:浏览器与服务器进行的交互模式(不需要官方下载的,一夫多妻制) C/S:客户机与服务器进项的交互模式(必须官方下载的,一夫一妻制 2.MVC和MVT MV ...

  4. 浅谈 Web 3.0

    这篇文章的目的就是简单解释一下这个「Web 3.0」新概念. 为了更好地理解「Web 3.0」,我们可能需要从 「Web 1.0」和「Web 2.0」说起. 浅谈 Web 3.0 「Web 1.0」 ...

  5. Web API之service worker

    一.参考链接 https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API http://www.alloyteam.com/ ...

  6. Web Worker,Service Worker,Web Worker

    Web Worker.Worker Service和Service Worker Web Worker.Worker Service和Service Worker Service Worker.Wor ...

  7. 浅谈Web中前后端模板引擎的使用

    前言 这篇文章本来不打算写的,实话说楼主对前端模板的认识还处在非常初级的阶段,但是为了整个 源码解读系列 的完整性,在深入 Underscore _.template 方法源码后,觉得还是有必要记下此 ...

  8. 拒绝平庸--浅谈WEB登录页面设计

    用户活跃度是检验产品成功与否的重要指标之一,传统行业的商家极为重视门面的装潢,因为一个好的门面可以聚集人气,招揽更多的顾客.古时候的大户人家院子门口的石狮子或其他的摆件的摆放极为讲究,有一定的风水学说 ...

  9. 浅谈Web前端安全策略xss和csrf,及又该如何预防?

    Web前端安全策略xss和csrf的攻击和防御 一.XSS跨站请求攻击 1.什么是XSS 2.场景模拟 3.XSS的攻击类型 4.如何防御XSS 二.XSRF跨站请求伪造 1.什么是csrf 2.场景 ...

  10. css中如何实现帧布局_浅谈web前端中的表格布局与CSS盒子布局

    在web前端设计排版时我们可能会用到表格布局和div+CSS布局,但现在主要使用后者,为何?今天我们来谈一谈两者之间的发展和原理. 话不多说下面来干货 发展过程 上个世纪Web开发人员流行使用表格进行 ...

最新文章

  1. 为什么工厂模式可以解耦?(一)
  2. Kendall’s tau-b,pearson、spearman三种相关性的区别(有空整理信息检索评价指标)
  3. Linux Bash终端支持中文显示
  4. 阿里腾讯今日头条纷纷选择的工具,ClickHouse到底有什么本事?
  5. 100 计算机网络概述小结
  6. cookie mapping
  7. postgresql 备份_等保涉及的PostgreSQL数据库
  8. frida hook java层常用模板
  9. HTTP 数据包头解析
  10. linux中查看某个进程打开的文件数
  11. DIV+CSS如何让文字垂直居中
  12. 微服务架构实战篇(四):Spring boot2.0 + Mybatis +Druid监控数据库访问性能
  13. 监狱视频探视(会见)系统
  14. c语言(随机数rand)
  15. 计算机win10无法打开小键盘,win10数字小键盘开机不启动解决方法
  16. 羽毛球 - 正手高球(杀球、吊球、高远球)
  17. 《Head First 设计模式》例子的C++实现(4 单件模式)
  18. oracle 给表授权grant
  19. PPPOE和pppd的流程详解
  20. 告别windows、拥抱linux,ThinkPad E485安装XUbuntu实录

热门文章

  1. win7重装的那些事儿
  2. Minimum supported Gradle version is 5.1.1. Current version is 4.8
  3. html视频自动播放播放器,支持弹字幕HTML5视频播放器DPlayer
  4. IE浏览器js 中http请求,中文传参报400错误-解决方法
  5. 编写程序将电子邮件EmailAddressBook.txt和电话簿TeleAddressBook.txt合并为一个完整的通讯录AddressBook.txt(Address.py)
  6. 如何使用命令行从图像中提取文本
  7. 添加用户-查看用户列表-禁止默认root登陆
  8. 如何调换手机桌面位置_手机桌面很乱怎么整理?简单七招让你效率更高!
  9. 到了2017还在苦等房价下跌的人,你们可以醒醒了!
  10. 迷你西游最新服务器是哪个,《迷你西游》公测增开服务器公告