时间:2021-05-25
前言
javascript在浏览器中的性能,可以认为是开发者所面临的最严重的可用性问题,今天,自己看完高性能的javascript的加载和执行这一章,聊聊怎么解决js的加载顺序和执行的原理,下面话不多说了,来一起看看详细的介绍:
当浏览器遇到<script>标签的时候,浏览器必须先话时间下载外链的文件然后并执行,在这过程中,页面渲染和用户交互是完全被阻塞的。
脚本放在哪里比较好?
这种情况无疑是存在严重的性能问题的,由于脚本会阻塞页面的渲染,直到它们全部下载并执行完成后,页面渲染才会继续,下面的图就是代码的执行顺序
第一个js文件下载,要等到第一个js文件下载完全才会执行第二个js文件,不过现在IE8,Firefox3.5,Safari4和Chrome2都允许并行下载js文件,遗憾的是,js下载过程还是会阻塞其他资源的下载,例如:图片
所以提高性能的方法之一:将脚本放在body底部
组织脚本
由于每个<script>标签下载时都会阻塞页面的渲染,所以减少页面包含的<script>标签数量是必不可少的,解决方法:可以把多个js文件合并打包成一个js文件,这样子做的好处就是可以最小化延迟时间将会明显的改善页面的总体性能,除此之外,还可以减少HTTP的请求。
一般来说下载单个100KB的文件比下载4个25KB的文件快。
如果有多个外链的js文件,可以合并成一个js文件
无阻塞的脚本
尽管下载单个较大的js文件只产生一次HTTP的请求,但是会假死浏览器一大段时间,为了避免这种情况,你需要向页面中逐步加载js文件。
延迟的脚本
defer属性指明本元素所含的脚本可以延迟执行,但是只有IE4+和Firefox3.5+的浏览器支持
简单来说defer的机制就是知道DOM加载完成前才去下载js文件,不会阻塞浏览器的其他进程
在不支持defer属性的浏览器弹出的顺序是:defer,script,load
支持defer属性的浏览器弹出的顺序是:script,defer,load
所以说defer是在onload事件执行之前被调用
动态脚本
动态脚本的注入有两种方式,第一就是动态创建script标签,第二就是通过XMLHttpRequest注入页面
先说说第一种怎么使用:
这种技术的重点在于:无论在何时启动下载,文件的下载和执行过程不会阻塞页面其他进程,但是使用动态脚本节点下载js文件时,返回的代码会立即执行(除了Firefox和Opera,它们会等待此前所有动态脚本节点执行完毕)
在主流的浏览器会在<script>标签接收完成时触发一个load事件,但是ie浏览器没有,所以我们必须封装一个兼容所有的浏览器都可以使用的方法
这种方式的缺点就是要清楚文件的加载顺序,当js文件多了,依赖关系复杂的时候,很难管理加载的依赖顺序
就像这样子写的代码很难维护
第二种动态创建脚本方式
实际上相当于创建一个带有内联脚本的<script>标签,一旦新创建的<script>元素被添加到页面,代码就会立即执行然后准备就绪。
优点:就是下载的js代码但是不立即执行,这样子可以把脚本的执行推迟到你准备好的时候执行,这种方法还可以兼容所有的浏览器
缺点:js文件必须与所请求的页面处于相同的域,js文件不能从CDN下载,一般大型web应用都不会使用这种方式
推荐使用无阻塞模式:
先添加动态所需的代码,然后假装初始化页面的剩下的代码
[图片上传失败...(image-dd3f9-1515902024710)]
上面介绍了那么多,给大家推荐一些动态延迟加载的库
有YUI3,LazyLoad和LABjs等这些库,个人觉得LABjs库比较好用,但是没有用过,大家可以去了解一下,使用方法就不在这里说了。
总结:
提高js性能的几个方面
1.</body>闭合标签之前,将所有的<script>标签放到页面底部。这能确保在脚本执行前页面已经完成了渲染
2.合并脚本。页面中的<script>标签越少,加载也就越快,响应也更快。无论外链文件还是内嵌脚本都是如此
3.有多种无阻塞下载js的方法
3.1使用<script>标签的defer属性
3.2使用动态创建的<script>元素来下载并执行代码
3.3使用XHR对象下载js代码并注入页面中
通过以上策略,可以极大提高那些需要使用大量js的web应用的实际性能
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
看了《高性能JavaScript》的读书笔记几个原则:1、将脚本放在底部还是在head中,用以保证在js加载前,能加载出正常显示的页面。放在前。2、成组脚本由于
Javascript是执行顺序是至上而下的,除非你特别说明,Javascript代码不会等到页面加载完毕后才执行。比如一个网页里含有以下HTML代码:复制代码代
本文实例讲述了JavaScript享元模式原理与用法。分享给大家供大家参考,具体如下:通过两个例子的对比来凸显享元模式的特点:享元模式是一个为了提高性能(空间复
本文实例讲述了JS执行控制之节流模式。分享给大家供大家参考,具体如下:节流模式:对重复的业务逻辑进行控制,执行最后一次操作,并取消其他操作,以提高性能。重复的业
第一篇,我简略描述了一下我的cms标签所表示的含义。anCMS(c#版)第一篇绑定数据第二篇,我将展示了标签背后真正运行的代码。asp.net的cms原理篇好像