JavaScript 不容错过的八大优化建议,来自Google Chrome 工程师
摘要:本文为 Google Chrome 团队的开发项目工程师 Addy Osmani 在PerfMatters 2019 网页性能大会发表的“JavaScript性能优化”(https: medium com @addyosmani the-cost-of-javascript-in-2018-7d8950fbb5d4)的演讲
视频地址:https://youtu.be/X9eRLElSW1c(需科学上网)
在过去几年中,由于改进了脚本解析和浏览器的编译速度,Javascript的成本结构发生了巨大变化。 到2019年,处理Javascript的开销主要体现在脚本下载时间和CPU执行时间上。
如果浏览器的主线程忙于执行Javascript脚本,则可能会影响用户交互体验,因此优化脚本执行时间和消除网络瓶颈会对用户体验产生积极影响。
高级实用指南
这对Web开发人员意味着什么? 这意味着Parse和Compile不再像我们想象的那么慢。 因此,在优化Javascript包时,开发人员应该关注以下三个方面:
减少下载时间
确保Javascript包尽可能小,特别是对于移动设备。 较小的软件包可以提高下载速度,减少内存使用并降低CPU开销。
避免只使用一个大型Javascript包; 如果包大小超过50-100 KB,则将其拆分为几个小包。 (使用HTTP / 2协议多路复用机制,可以同时传输多个请求和响应消息,从而减少额外请求的开销。)
移动设备上使用的Javascript包应尽可能小。 另一方面,由于网络带宽的限制,另一方面,必须最小化存储器的使用。
缩短执行时间
避免长期任务继续占用主线程并影响页面响应时间。 现在脚本下载后的执行时间成为主要的成本开销。
避免使用大型内联脚本(因为它们仍然需要在主线程上进行解析和编译)。
建议参考经验法则:如果脚本超过1KB,请不要内联它(因为当外部脚本大小超过1KB时会触发代码缓存)。
为什么下载和执行时间很重要?
为什么优化下载和执行时间很重要? 因为对于低端网络,下载时间的影响非常大。 虽然4G(甚至5G)在全球迅速发展,但大多数人的有效连接速度仍然远低于网络的标称速度。 有时当我们外出时,我们觉得网络的速度只下降到3G(甚至更差)。
JavaScript的执行时间对于CPU速度慢的低端手机也非常重要。 由于CPU,GPU和散热限制的差异,高端和低端手机之间的性能差距巨大。 这对JavaScript的性能有重大影响,因为它的执行受CPU性能的限制。
实际上,在Chrome等浏览器上,JavaScript占用的总页面加载时间可能高达30%。 下图是在高端台式PC上具有典型工作负载(Reddit.com)的网站的页面加载分析:
V8引擎下的Javascript处理时间占整个页面加载时间的10-30%
对于移动设备,在中端手机(如Moto G4)上实施Reddit的Javascript脚本需要比在高端手机(如Pixel 3)上长3-4倍,而在低端手机上(价格低于100美元)实施 Reddit在Alcatel 1X上的Javascript脚本需要花费6倍的时间:
Reddit的Javascript脚本在几个不同设备(低,中,高)上的执行时间。
注意:Reddit对桌面和移动网络有不同的体验,因此无法将MacBook Pro执行结果与其他结果进行比较。
当您努力优化JavaScript执行时,您需要了解可能长期主宰UI线程的长期任务。 即使页面似乎已加载,这些长期任务也可能会拖累关键任务的执行。 将长期任务分解为较小的任务。 通过拆分代码并确定加载顺序,您可以更快地实现页面交互,并可能减少输入延迟。
应该分割垄断主线程的长期任务。
V8引擎如何提高Javascript解析/编译的速度?
自Chrome版本60以来,V8引擎的原始JS的分辨率提高了两倍。 与此同时,Chrome还做了其他工作来并行化解析和编译,这使得这部分成本开销对用户体验的影响不那么显着和关键。
通过将解析和编译工作转移到工作线程,V8引擎将主线程上的解析和编译工作量平均减少了40%。 例如,Facebook下降了46%,Pinterest下降了62%,最大的改善是YouTube,下降了81%。 这是基于现有的非主线程流解析/编译性能改进的进一步改进。
不同版本V8发动机的分析时间比较
我们还可以说明不同V8引擎对CPU处理时间的不同CPU版本的影响。 如您所见,Chrome 61解析Facebook的JS脚本所需的时间允许Chrome 75解析相同的Facebook JS脚本和六个Twitter JS脚本。
Chrome 61解析Facebook的JS脚本所需的时间允许Chrome 75解析相同的Facebook JS脚本和六个Twitter JS脚本。
让我们仔细看看如何实现这些改进。 通常,脚本资源可以在工作线程上进行流式处理和编译,这意味着:
V8引擎可以在不阻塞主线程的情况下解析和编译JavaScript。
当整个HTML解析器遇到
相关热词搜索:JavaScript JavaScript优化 Google Chrome工程师
上一篇:Vue.js为什么能击败了Angular和React,成为最受欢迎的JavaScript前端框架
下一篇:Jquery为什么越来越多的人选择逃离?
人机验证(Captcha)绕过方法:使用Chrome开发者工具在目标网站登录页面上执行简单的元素编辑,以实现Captcha绕过
牛创网络: " 人机身份验证(Captcha)通常显示在网站的注册,登录名和密码重置页面上。 以下是目标网站在登录页面中排列的验证码机制。 从上图可以
2020-01-26 12:44:09 )8872( 亮了
自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数
牛创网络: "自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数
2020-01-30 14:04:47 )6288( 亮了
Grafana CVE-2020-13379漏洞分析:重定向和URL参数注入漏洞的综合利用可以在任何Grafana产品实例中实现未经授权的服务器端请求伪造攻击SSRF
牛创网络: "在Grafana产品实例中,综合利用重定向和URL参数注入漏洞可以实现未经授权的服务器端请求伪造攻击(SSRF)。该漏洞影响Grafana 3 0 1至7 0 1版本。
2020-08-12 14:26:44 )4301( 亮了
Nginx反向代理配置及反向代理泛目录,目录,全站方法
牛创网络: "使用nginx代理dan(sui)是http响应消息写入服务地址或Web绝对路径的情况。 写一个死的服务地址是很少见的,但它偶尔也会发生。 最棘手的是写入web绝对路径,特别是如果绝对路径没有公共前缀
2019-06-17 10:08:58 )3858( 亮了
fortify sca自定义代码安全扫描工具扫描规则(源代码编写、规则定义和扫描结果展示)
牛创网络: "一般安全问题(例如代码注入漏洞),当前fortify sca规则具有很多误报,可通过规则优化来减少误报。自带的扫描规则不能检测到这些问题。 需要自定义扫描规则,合规性角度展示安全风险。
2020-02-12 10:49:07 )3505( 亮了
整理几款2020年流行的漏洞扫描工具
牛创网络: "漏洞扫描器就是确保可以及时准确地检测信息平台基础架构的安全性,确保业务的平稳发展,业务的高效快速发展以及公司,企业和国家 地区的所有信息资产的维护安全。
2020-08-05 14:36:26 )2536( 亮了
微擎安装使用技巧-微擎安装的时候页面显示空白是怎么回事?
牛创网络: "我们在公众号开发中,有时候会用到微擎,那我们来看一下微擎安装的时候页面显示空白是怎么回事吧
2019-06-08 15:34:16 )2261( 亮了
渗透测试:利用前端断点拦截和JS脚本替换对前端加密数据的修改
牛创网络: " 本文介绍的两种方法,虽然断点调试比JS脚本代码替换更容易,但是JS脚本代码替换方法可以实现更强大的功能,测试人员可以根据实际需要选择适当的测试方法
2020-01-07 09:34:42 )1995( 亮了
从工业界到学界盘点SAS与R优缺点比较
牛创网络: "虽然它在业界仍然由SAS主导,但R在学术界广泛使用,因为它的免费开源属性允许用户编写和共享他们自己的应用程序 然而,由于缺乏SAS经验,许多获得数据分析学位的学生很难找到工作。
2019-07-13 22:25:29 )1842( 亮了
41款APP侵犯用户隐私权:QQ,小米,搜狐,新浪,人人均被通报
牛创网络: "随着互联网的不断发展,我们进入了一个时代,每个人都离不开手机。 但是,APP越来越侵犯了用户隐私权。12月19日,工业和信息化部发布了《关于侵犯用户权益的APP(第一批)》的通知。
2019-12-20 11:28:14 )1775( 亮了