美文网首页
js大量数据计算导致页面假死

js大量数据计算导致页面假死

作者: 南漪钓隐 | 来源:发表于2020-03-14 11:39 被阅读0次

为什么页面会卡顿呢,以60Hz为例,即一秒钟的动画就是由60张静态图片连在一起。60fps是动画播放比较理想、比较基础的要求,windows系统有个刷新频率也是这个意思。60fps就要求一帧的时间为1s/60=16.67ms。浏览器显示页面的时候,要处理js逻辑,还要做渲染,每个执行片段的时间不能超过16.67ms。实际上,浏览器内核自身支撑体系运行也需要消耗一些时间,所以留给我们的时间差不多只有10ms。并且在处理js计算时,浏览器不会响应用户的操作,所以就造成了页面“假死”。

Web Worker

什么是Web Worker

Web Work,就是为JavaScript创造多线程环境,允许主线程创建Web Worker线程,将一些任务分配给后台运行。在主线程运行的同事,Work线程在后台运行,两者互不干扰。等到Work线程完成计算任务再把结果返回给主线程。这样的好处是,一些密集或者高延迟的计算任务,被Work线程给分担了,这样主线程就会很流程。
Worker线程一旦创建成功,就会始终运行,不会被主线程上的活动打断取消。这样有利于随时响应主线程的通信。但是,这也造成了Worker比较耗费资源,不应该过度使用,所以一旦使用完毕,就应该关闭。

注意点:

1.同源限制:分配给Worker线程运行的脚本文件,必须与主线程的脚本文件同源。
2.DOM限制:Work线程所在的全局对象和主线程不一样,所以无法读取主线程所在网页的DOM对象,也无法使用document,window,parent这些对象。但是可以使用navigator和location。
3.通信联系:Worker线程和主线程不在同一个上下文环境,他们不能直接通信,必须通过消息完成。
4.脚本限制:Worker线程不能执行alert和confirm方法,但是可以使用XMLHttpRequest对象发出的AJAX请求。
5.文件限制:Work线程不能读取本地文件,它所加载的脚本必须来自网络。

用法
  • 创建
var worker = new Worker(“work.js”)
  • 主线程通过postMessage向Work线程发送消息
//postMessage()参数就是传送的数据,支持各种数据类型
worker.postMessage('Hello World'); 
worker.postMessage({method: 'echo', args: ['Work']});
  • 主线程通过onmessage()指定监听函数,接收子线程发回来的消息
worker.onmessage = function (event) {
  console.log('Received message ' + event.data);
}
  • 主线程关闭Work线程
worker.terminate();
  • Worker 线程内部需要有一个监听函数,监听message事件。
self.addEventListener('message', function (e) {
  self.postMessage('You said: ' + e.data);
}, false);
//上面代码中,self代表子线程自身,即子线程的全局对象。因此,等同于下面两种写法
// 写法一
this.addEventListener('message', function (e) {
  this.postMessage('You said: ' + e.data);
}, false);

// 写法二
addEventListener('message', function (e) {
  postMessage('You said: ' + e.data);
}, false);
  • Work线程内部关闭
self.close();

相关文章

  • js大量数据计算导致页面假死

    为什么页面会卡顿呢,以60Hz为例,即一秒钟的动画就是由60张静态图片连在一起。60fps是动画播放比较理想、比较...

  • Web Worker

    js运行是单线程,每当页面中运行长时间的同步任务,会导致页面假死(卡顿),从而影响用户体验。 HTML5提出了We...

  • webWorker解决的问题与应用场景

    webWorker解决的是js中数据处理导致的UI线程阻塞所以webWorker的应用场景一般为需要大量计算的时候...

  • Hive个人笔记

    一.数据倾斜 在计算数据的时候,数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些数据的计算...

  • 小程序如何做全局重新加载

    背景: 随着业务的增加,我们服务器需要计算大量的用户数据,导致用户跟客服反应页面不能正常展示。反馈给开发后,我们一...

  • 【iOS】界面跳转性能优化

    iOS界面跳转卡顿延迟的原因:1.A页面跳到B页面,B页面加载大量数据,导致卡顿延迟;2.A页面跳到B页面,B页面...

  • eCharts加载大量数据导致页面卡顿

    一、不要把chart实例放在data里 参考:https://tieba.baidu.com/p/55820287...

  • 使用webpack的动机

    页面中越来越多的js 现在浏览器提供更多接口 更少的页面重载刷新,页面中有更多的代码 这些导致浏览器端存在大量的代...

  • #每日一记#前端与后端交互 数据状态设计 最佳实践

    在前端页面开发中,大部分的时间都是在与后端进行数据交互:获取数据、计算并渲染。而页面上又有大量的元素状态需要维护,...

  • Web Worker

    Web Workers可以让JS运行到后台,来解决JS线程可能会冻结页面的问题。我们可以将大量数据的处理交给wor...

网友评论

      本文标题:js大量数据计算导致页面假死

      本文链接:https://www.haomeiwen.com/subject/ohclshtx.html