Web Worker: Shared Worker的使用
Web Worker: Shared Worker的使用
参考资料:
- JavaScript高级程序第四版
- https://juejin.cn/post/7064486575916187656
- https://juejin.cn/post/6844904198639714311 [你不知道的Service Worker]
- https://juejin.cn/post/6963519363492085790 [sharedWorker 实现多页面通信]
一、概述
shared worker,是一种共享的工作者线程,也就是说可以在不同的页面之间(iframe,tab页等场景)访问同一个工作者线程(前提仍然是必须同源,即协议、主机、端口号必须一致)。
shared Worker的一些特点:
同标识符的实例只会创建一个 sharedWorker,其他页面再使用同样的脚本创建sharedWorker,会复用已创建的 worker,这个worker由几个页面共享。这里的相同标识符指的是共享者线程会解析来自脚本的URL,工作者线程名称和文档源,只有这三个属性保持一致才会认定是同一个工作者线程。
// 实例化一个共享工作者线程
// - 全部基于同源调用构造函数
// - 所有脚本解析为相同的 URL
// - 所有线程都有相同的名称
new SharedWorker('./sharedWorker.js');
new SharedWorker('./sharedWorker.js');
new SharedWorker('./sharedWorker.js');
下面这种情况也只会实例化一个共享工作者线程
// 实例化一个共享工作者线程
// - 全部基于同源调用构造函数
// - 所有脚本解析为相同的 URL
// - 所有线程都有相同的名称
new SharedWorker('./sharedWorker.js');
new SharedWorker('sharedWorker.js');
new SharedWorker('https://www.example.com/sharedWorker.js');
如果指定不同的名字,则会产生不同的共享工作者线程
// 实例化两个共享工作者线程
// - 一个线程名称为'foo',一个线程名称为'bar'
new SharedWorker('./sharedWorker.js', {name: 'foo'});
new SharedWorker('./sharedWorker.js', {name: 'foo'});
new SharedWorker('./sharedWorker.js', {name: 'bar'});
使用MessagePort进行通信,方便管理多个端口
SharedWorkerGlobalScope
在共享线程内部,全局作用域是 SharedWorkerGlobalScope 的实例,有以下属性和方法
属性 | 说明 |
---|---|
name | 给Worker起的名字 |
importScripts | 于向工作者线程中导入任意数量的脚本 |
close() | 内部自我关闭线程方法,与 worker.terminate()对应 |
onconnect | 监听共享线程连接,也可以通过使用 sharedWorker.addEventListener('connect', handler) |
二、用法
创建一个Worker语法如下:
const worker = new SharedWorker('./test.js')
// 通过worker.port发送消息
worker.port.postMessage("xxx");
下面看一个简单的点赞小例子:
sharedworker.html
<body>
<h3>共享线程 Shared Worker</h3>
<button id="likeBtn">点赞</button>
<p>一共收获了<span id="likedCount">0</span>个</p>
<script>
let likeBtn = document.querySelector("#likeBtn");
let likedCountEl = document.querySelector("#likedCount");
let worker = new SharedWorker("./shared-worker.js",{ name: 'test_shared_worker' });
worker.port.start();
likeBtn.addEventListener("click", function () {
worker.port.postMessage("2");
});
worker.port.onmessage = function (val) {
likedCountEl.innerHTML = val.data;
};
</script>
</body>
点击页面上的按钮,每次+2个点赞数量
worker.js内容如下:
let a = 0;
console.log('shared worker is working...');
self.onconnect = function (event) {
console.log(event);
const port_0 = event.ports[0];
port_0.onmessage = function (e) {
const incr = Number(e.data);
a = a+ incr;
port_0.postMessage(a);
}
}
每次点击按钮都会向worker通信一次,worker内部记住点赞数量,然后再返回给主程序,界面就能显示点赞了多少次。
console.log不见了?
F12打开控制台发现,并没有输出任何内容,那是因为SharedWorker必须通过
chrome://inspect
命令才能看到输出的内容,尝试在地址栏输入试试看
可以看出,确实存在了我们的共享工作者线程,点击inspect就能看到控制台内容
三、多页面通信
ShareWorker.js
var clients = [];
onconnect = function(e) {
var port = e.ports[0];
clients.push(port);
port.addEventListener('message', function(e) {
for (var i = 0; i < clients.length; i++) {
var eElement = clients[i];
eElement.postMessage(e.data)
}
});
port.start();
}
在需要推送的页面里面添加开启共享线程的代码,shareworker-message.js
myWorker = new SharedWorker("script/scenesetting/ShareWorker.js");
myWorker.port.onmessage=function(e) {
var result=e.data;//此处就是共享现成推送过来的数据可以是字符串、数组、json
/***********上面拿到数据后,就可以在下面做一些你想造做的事************/
};
引用第二步的shareworker-message.js文件
myWorker.port.postMessage(newData);
另外一个案例,请参考:
Web Worker: Shared Worker的使用的更多相关文章
- Web Workers - (Worker(专有) and SharedWorker(共享))
Web Worker为Web内容在后台线程中运行脚本提供了一种简单的方法 线程可以执行任务而不干扰用户界面 可以使用XMLHttpRequest执行 I/O (尽管responseXML和channe ...
- 已知有一个Worker 类如下: public class Worker { private int age; private String name; private double salary; public Worker (){} public Worker (String nam
package homework006; public class Worker { private int age; private String name; private double sala ...
- Content Security Policy (CSP) 介绍
当我不经意间在 Twitter 页面 view source 后,发现了惊喜. <!DOCTYPE html> <html lang="en"> <h ...
- Web Worker javascript多线程编程(一)
什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...
- Web Worker javascript多线程编程(二)
Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...
- 深入HTML5 Web Worker应用实践:多线程编程
HTML5 中工作线程(Web Worker)简介 至 2008 年 W3C 制定出第一个 HTML5 草案开始,HTML5 承载了越来越多崭新的特性和功能.它不但强化了 Web 系统或网页的表现性能 ...
- 关于Web Worker你必须知道的7件事
介绍 通过使用Web Worker, 我们可以在浏览器后台运行Javascript, 而不占用浏览器自身线程.Web Worker可以提高应用的总体性能,并且提升用户体验.如果你想在自己的Web应用中 ...
- 【转向Javascript系列】深入理解Web Worker
本文首发在alloyteam团队博客,链接地址http://www.alloyteam.com/2015/11/deep-in-web-worker/ 上一篇文章<从setTimeout说事件循 ...
- web worker 扫盲篇
什么是woker 官方的解释是这样的: worker是一个对象,通过构造函数Worker创建,参数就是一个js文件的路径:文件中的js代码将运行在主线程之外的worker线程: var jsFileU ...
随机推荐
- linux下运行crm
linux下运行crm 1.从windows把crm代码拷贝到linux服务器上 2.学习virtualenvwrapper工具升级版 1.安装 pip3 install virtualenvwrap ...
- 【DIY】【CSAPP-LAB】深入理解计算机系统--datalab笔记
title: 前言 <深入理解计算机系统>一书是入门计算机系统的极好选择,从其第三版的豆瓣评分9.8分可见一斑.该书的起源是卡耐基梅龙大学 计算机系统入门课(Introduction to ...
- 虚拟机中CentOS-7.9的硬盘空间扩容(EXSI)
目录 一.增加虚机容量 二.创建新的分区 三.格式化新分区 四.lvm实现卷扩容 五.文件系统的扩容 大家好,我是LSF,发现一台虚机上 /dev/mapper/centos-root Use%已经快 ...
- Tutorial 3_软件工作量估计和编码规范
软件过程与管理实验 实验3:编码规范 本次实验内容是个人软件过程部分,通过本次实验,学生将掌握以下内容: 1.建立自己的编码规范和代码审查表. 2.会用COCOMO II模型对软件工作量进行估计. [ ...
- 从rocketmq入手,解析各种零拷贝的jvm层原理
在上一篇文章中,主要介绍了rocketmq消息的存储流程.其主要使用了mmap的零拷贝技术实现了硬盘和内存的映射,从而提高了读写性能.在流程中有一个非常有意思的预热方法并没有详细分析,因为其中涉及到了 ...
- Hbase数据库安装部署
Hbase单机版安装 hbase介绍 HBase – Hadoop Database是一个分布式的.面向列的开源数据库,该技术来源于Chang et al所撰写的Google论文"Bigta ...
- WSL2-CentOS7固定IP
WSL2-CentOS7固定IP WSL2 采用 Hyper-V 的 Internal Virtual Switch,这个虚拟交换机本身是可以设置静态 IP 地址的,但是 WSL2 却自作聪明,在每次 ...
- 好客租房57-props深入(4props的默认值)
1给props设置默认值 //导入react import React from 'react' import ReactDOM from 'react-dom' import ...
- C# settings 文件基础用法
原文 自定义设置项类型 Serializable 修饰的枚举,可作为设置项类型 [Serializable] public enum DeviceBrand { None = 0, [Descript ...
- 每天一个 HTTP 状态码 204
204 No Content 204 No Content 表示服务器成功地处理了客户端的请求,但是没有任何要响应的内容.API 设计上,在用 PUT 请求更新某个资源成功后,后端可以在 HTTP 响 ...