Web Worker: Shared Worker的使用


参考资料:

一、概述

​ 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就能看到控制台内容

三、多页面通信

来源:https://zhuanlan.zhihu.com/p/38380765

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);

另外一个案例,请参考:

https://blog.51cto.com/u_11711012/4919513

Web Worker: Shared Worker的使用的更多相关文章

  1. Web Workers - (Worker(专有) and SharedWorker(共享))

    Web Worker为Web内容在后台线程中运行脚本提供了一种简单的方法 线程可以执行任务而不干扰用户界面 可以使用XMLHttpRequest执行 I/O (尽管responseXML和channe ...

  2. 已知有一个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 ...

  3. Content Security Policy (CSP) 介绍

    当我不经意间在 Twitter 页面 view source 后,发现了惊喜. <!DOCTYPE html> <html lang="en"> <h ...

  4. Web Worker javascript多线程编程(一)

    什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...

  5. Web Worker javascript多线程编程(二)

    Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...

  6. 深入HTML5 Web Worker应用实践:多线程编程

    HTML5 中工作线程(Web Worker)简介 至 2008 年 W3C 制定出第一个 HTML5 草案开始,HTML5 承载了越来越多崭新的特性和功能.它不但强化了 Web 系统或网页的表现性能 ...

  7. 关于Web Worker你必须知道的7件事

    介绍 通过使用Web Worker, 我们可以在浏览器后台运行Javascript, 而不占用浏览器自身线程.Web Worker可以提高应用的总体性能,并且提升用户体验.如果你想在自己的Web应用中 ...

  8. 【转向Javascript系列】深入理解Web Worker

    本文首发在alloyteam团队博客,链接地址http://www.alloyteam.com/2015/11/deep-in-web-worker/ 上一篇文章<从setTimeout说事件循 ...

  9. web worker 扫盲篇

    什么是woker 官方的解释是这样的: worker是一个对象,通过构造函数Worker创建,参数就是一个js文件的路径:文件中的js代码将运行在主线程之外的worker线程: var jsFileU ...

随机推荐

  1. java实现空心金字塔

    前言 最近在学习java,遇到了一个经典打印题目,空心金字塔,初学者记录,根据网上教程,有一句话感觉很好,就是先把麻烦的问题转换成很多的简单问题,最后一一解决就可以了,然后先死后活,先把程序写死,后面 ...

  2. dnf常用参数

    dnf常用命令 检查并升级可用软件包: $ dnf update 删除缓存: $dnf clean all 列出可用的软件源: $ dnf repolist 搜索软件: $ dnf search $p ...

  3. c# 读取所有磁盘的剩余空间

    介绍: 有一个控制台命令是创建指定大小的空文件,因此我想制作一个一键填充剩余磁盘空间的坑人小程序. 想要填充剩余容量,就要先获取所有本地磁盘的剩余空间,这个程序就是用来做这个的. 项目类型为c#控制台 ...

  4. MyBatisPlus详解

    1.MyBatisPlus概述 需要的基础:MyBatis.Spring.SpringMVC 为什么要学习?MyBatisPlus可以节省我们大量工作时间,所有的CRUD代码它都可以自动化完成! 简介 ...

  5. 推荐一款新框架PyScript:在 HTML 嵌入 Python 代码!

    一.介绍 网页浏览器是目前世界上最普遍,最可携的计算机环境.几乎所有人都可以在计算机或是手机上使用网页浏览器,以没有基础设施障碍的方式访问程序. 在 PyCon US 2022 上,知名 Python ...

  6. MongoDB 常用启动参数

    每日一句 Once you choose your way of life, be brave to stick it out and never return. 生活的道路一旦选定,就要勇敢地走到底 ...

  7. Python趣味入门9:函数是你走过的套路,详解函数、调用、参数及返回值

    1.概念 琼恩·雪诺当上守夜人的司令后,为训练士兵对付僵尸兵团,把成功斩杀僵尸的一系列动作编排成了"葵花宝典剑法",这就是函数.相似,在计算机世界,一系列前后连续的计算机语句组合在 ...

  8. 如何安装TypeScript编译器?

    首先需要nodejs和npm工具.如果没有点击这里下载node(默认会附带安装npm工具):https://nodejs.org/en/ npm安装TypeScript npm install -g ...

  9. 六、LVM和从磁盘配额

    一.LVM概述 Logical Volume Manager,逻辑卷管理 优点:能够保证在现有数据不变的情况下,动态调整磁盘容量,从而提高磁盘管理的灵活性 /boot分区用于存放引导文件,不能基于LV ...

  10. vue.js中英文api

    全局配置 Vue.config is an object containing Vue's global configurations. You can modify its properties l ...