当前位置: 首页 > news >正文

通过一次实验来了解HTML5的 Web Worker

web worker 是运行在后台的 JavaScript,不会影响页面的性能。

当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。

web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行。


  以上是W3School对WebWorker的定义,讲的非常明确。在这段解释中,我一眼就看到了一句话“执行脚本时,页面状态是不可响应的”,这让我想到了BOM的一些系统对话框,像alert之类的。大家都知道当有alert之类的消息窗口时,它是模态且同步的,整个HTML页面元素和脚本都会停止无法点击,直到点击了确定,脚本才会继续执行。如果按照HTML5的Web Worker的后台工作的性质,是否意味着可以不受限于对话框的限制,继续执行代码。本着实践出真知,下面一起来看看!

  1.  我们首先看看正常情况,一个自动累加器是如何运作的。

第一张图,附上HTML结构。我们是用一个非常常见的方法,也就是通过一个setTimeout定时器,不断重复调用自身,达到1S增加一次的效果。然后把累加的值,放到output标签内。然后我们让它跑起来吧!

我们可以发现,当我们点击alert按钮的时候,数字不再往上累加。这是我们非常常见的啦,因为对话框是同步执行的,意味着不点击就会造成线程阻塞。难不成用了Web Worker就可以继续运行?我们接下来继续看。

  2.  使用Web Worker的累加器。

在我们看运行的GIF之前,我们先看看如何构建一个Web Worker。

首先,我们需要检测一下浏览器是否支持Worker,毕竟是一个HTML5的新功能。然后直接通过new一个Worker,再把需要执行的脚本文件作为一个参数传进去。然后通过监听这个Web Worker的message事件,数据放在event.data进行实时的反馈。既然有一个message事件,那么那个需要执行的脚本自然会有一个发送message的操作,我们看一下是什么样子的。

也就是postMessage(data),通过这个API我们可以将Worker里的数据通过message传出去。然后外部再监听message事件,进行数据更新。那说了这么多,那真正的问题是否解决了呢?也就是那个,Worker里执行的脚本是独立于其它脚本,自行在后台运行的。废话不多说,直接看效果!

非常的牛逼!我忍不住打了几个字。我们可以清楚的看到,对于单线程的JavaScript来说,即使模态框阻塞了线程,计数器的数字依旧是在做改变的。(这里有些小疑问,既然消息框会让页面的脚本停止运行,但是为什么message事件监听触发的innerHTML依旧是可以运行?难道事件触发机制,也可以避免受模态框的影响?有知道的人可以帮忙解答一下,谢谢~!)从这里我们可以明显看到,确实在web worker的Js脚本是独立的,并不会和当前页面的脚本相冲突。当然,这里不得不提一句,Web Worker的Js脚本的作用域和当前页面Js脚本作用域并不能共享,换言之也就是,它们的全局作用域并不是同一个,Worker的全局作用域是它自己本身,所以Web Worker自然也就无法操作DOM元素。

  那我们可以用 Web Worker 做什么呢?因为Js的单线程,我们必须要防止过大的计算堵塞了用户页面,那通过这个HTML5最新的 Web Worker 技术,我们可以把一些非常耗时的计算都放在外部,以免影响了用户体验。

  最后,这里同样是抛砖引玉。希望可以通过这个可以帮助更多的人,了解到较新的HTML5技术,然后主动的去探寻更多的Web技术。


  有同学评论说,Chrome无法通过WebWorker加载本地的Js,这个确实是,本人调试的时候用的是Firefox。但是也是有解决方法的,我们可以通过用Node或者WAMP,快速搭建一个本地服务器,进行WebWorker测试。对于我们励志的前端工程师来说,用Node搭建简直飞快啊。这里我就不详细说了,我再次推荐一个前端工具框架——F.I.S,百度出品。我们通过npm全局装好后,直接进入demo的文件夹进行一下fis release,然后启动服务器fis server start。接着我们就可以在浏览器通过localhost访问我们这次的demo了!那我们看一下在Chrome中的运行情况吧。

 我们可以看到,Chrome也没报错,地址已经换成了本地地址了。但是我们可以看到Chrome下,并没有Firefox那么酷炫的实时渲染,而是和平常中一样的停止了。但是当我们点击确定,计数器已经跳过了许多数字,这说明Web Worker的的确确是独立于页面脚本,自己在后台运作的。

 

转载于:https://www.cnblogs.com/YikaJ/p/4176781.html

相关文章:

  • 小数在计算机中为什么会有误差?说明机器数、码制、浮点数、以及数制转换的一些问题...
  • BMap 自定义icon(小车)与点位置偏差
  • hibernate学习2_简单hibernate实现
  • linux文件acl权限简单设置
  • C#。4.1数组的应用
  • Luogu P1552 [APIO2012]派遣 主席树
  • 深入浅出设计模式——装饰模式(Decorator Pattern)
  • Centos 7.5安装Grafana5.3结合Zabbix3.4实现可视化图形
  • 部分金融常识
  • Python 调用 C 语言 so
  • vue.js 是如何做到数据响应的
  • 计算机科学论文写作5-写硕士论文
  • react native中使用echarts
  • JQuery中$.ajax()方法参数详解
  • 理解 JavaScript Mutation 突变和 PureFunction 纯函数
  • 【Linux系统编程】快速查找errno错误码信息
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • create-react-app做的留言板
  • ES6系列(二)变量的解构赋值
  • golang 发送GET和POST示例
  • GraphQL学习过程应该是这样的
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • spring boot下thymeleaf全局静态变量配置
  • Twitter赢在开放,三年创造奇迹
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Web Storage相关
  • webpack入门学习手记(二)
  • 阿里云购买磁盘后挂载
  • 基于游标的分页接口实现
  • 前言-如何学习区块链
  • 巧用 TypeScript (一)
  • 数据可视化之 Sankey 桑基图的实现
  • 我感觉这是史上最牛的防sql注入方法类
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ![CDATA[ ]] 是什么东东
  • #13 yum、编译安装与sed命令的使用
  • #if和#ifdef区别
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (LeetCode C++)盛最多水的容器
  • (pojstep1.3.1)1017(构造法模拟)
  • (pytorch进阶之路)扩散概率模型
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (免费分享)基于springboot,vue疗养中心管理系统
  • *上位机的定义
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET 动态调用WebService + WSE + UsernameToken