script标签的阻塞行为会对页面性能产生负面影响,大多数浏览器在下载或执行脚本的同时,会阻塞下载位于它之后的资源,也会阻塞渲染位于它之后的元素。由于浏览器是单线程的,因此脚本在载的时候会阻塞下载其它资源;虽然在现在浏览器已经有所改善,但仍然有待改进。很显然,脚本必须按顺序执行,但没有必要按顺序下载,解决方法
在一个页面中,每一个外部JavaScript
及CSS文件都会导致一个额外的HTTP请求。所以,如何合理的合并JavaScript 文件及CSS文件也是前端工程师应该考虑的。
尤其是JavaScript 文件,在下载它时,并行下载实际上是被禁用的,并且还会阻塞页面的呈现!
关于JavaScript
的下载
在下载JavaScript 脚本文件时,浏览器不会并行启动其它下载,而是让JavaScript
脚本文件单独下载完毕后,再继续其它请求。这将对页面的整体性能是一个很大的问题,解决方案如下:
解决方案1:将JavaScript 脚本内联在页面中,即直接将JavaScript 脚本写在HTML标签中。
优点:速度最快。在大型网站的首页中,可以合理的将JavaScript
脚本的一部分直接内联在HTML标签中。
缺点:JavaScript
脚本不被单独缓存,其它页面不能共享该JavaScript 脚本(不能重用)。
解决方案2:将JavaScript 脚本标签的链接(link)放在HTML文件标签的底部。
要求:脚本中不包含document.write() 方法改写页面。
解决方案3:使用延迟(Defferred) 脚本。即在link标签中添加defer 属性表明JS脚本中不包含document.write()
方法。
缺陷:在Firefox
中使用延迟(Defferred ) 脚本后,JavaScript 脚本还是会阻塞呈现、阻塞并行下载。
而在IE中,效果也不明显。
总结:如果一个脚本可以使用延迟(Defferred ) 脚本技术,那么它一定可以移到页面的底部!
即“解决方案3”完全可以用“解决方案2”替代。
解决方案4:使用加载后下载。即JavaScript 脚本在页面加载完毕后,通过onload 事件动态下载。(CSS也通用 )
优点:既不阻塞HTML页面的呈现,又能实现JavaScript 脚本的重用(脚本将被缓存在浏览器中)。
缺点:产生额外的JavaScript
代码用于实现该功能,增加了程序复杂度。
问题:可能加载两次(内联一次,外部加载一次)。
可以使用IFrame嵌套一个页面并加载JavaScript 脚本来解决。
示例:http://stevesouders.com/hpws/post-onload.php
解决方案5:动态内联。根据cookie做指示器,用代码进行判断,实现将外部JS内联到页面当中。
动态内联是对“加载后下载”的进一步完善。也再次增加了程序复杂度。
虽然JavaScript 脚本推荐放在页面底部,但CSS样式表则应该放在页面的顶部!
关于JavaScript
的精简
精简(Minification)是从代码中移除不必要的字符、注释、空白以减小JavaScript
代码的大小,进而改善JavaScript的下载长度和加载速度。
精简工具:JSMin http://crockford.com/javascript/jsmin
JSMin 用于去除javascript
文件中所有不必要的字符、注释、空白。
cmd 使用方法:C:\Documents and Settings\xugang>jsmin
<openWin.js> js_rerurn.js
1. 先指定到 jsmin.exe 文件夹
2. openWin.js为源文件
3. js_rerurn.js为目标文件
精简工具:ShrinkSafe( 原名:Dojo Compressor
) http://dojotoolkit.org/docs/shrinksafe
ShrinkSafe 用于移除javascript
文件中的空白,同时还通过替换的方式缩短了变量名。
cmd 使用方法:java -jar
shrinksafe.jar infile.js > outfile.js
shrinksafe.jar是工具名
infile.js为源文件
outfile.js为目标文件
注意:在控制台运行时,要保证shrinksafe.jar和js.jar是在同一个目录,并且输入的JS源文件和输出的JS目标文件也会在同一个目录。(默认在C盘根目录)
一般可以对你的JavaScrip文件同时使用JSMin 和 ShrinkSafe
这两个工具进行精简。
压缩组件
同时,不要忘记通过HTTP的头部声明,压缩脚本、样式表和HTML文档来减少响应时间。
浏览器客户端的请求: Accept-Encoding: gzip,
deflate
Web服务器端的响应:Content-Encoding:
gzip
gzip是目前流行和理想有效压缩方法,deflate效果略逊且不太流行
分享到:
相关推荐
无阻塞加载脚本是一种优化网页性能的技术,旨在减少页面加载时间,提高用户体验。这是因为传统的`<script>`标签会阻塞浏览器的解析过程,导致页面的其他资源下载和渲染暂停,直到脚本下载并执行完毕。为了克服这个...
1. **无阻塞加载**:LABjs允许在不阻塞页面渲染的情况下加载脚本,通过将脚本加载与页面解析解耦,提升了页面的初始加载速度。 2. **动态加载**:你可以随时添加新的脚本到加载队列中,无论何时何地,只要需要,就...
在本书中Souders与8位专家分享了提升网站性能的实践和实用建议,主要包括:理解Ajax性能,编写高效的,创建快速响应的应用程序和无阻塞加载脚本,跨域共享资源,无损压缩图片大小,使用块编码加快网页渲染,避免或...
主要介绍了JavaScript中的无阻塞加载性能优化方案,本文讲解了Deferred Scripts 延期脚本、Dynamic Script Elements 动态脚本元素、XMLHttpRequest Script Injection XHR脚本注入等内容,需要的朋友可以参考下
总之,`async`和`defer`属性为优化网页性能提供了有效手段,通过非阻塞加载脚本,可以在不牺牲用户体验的前提下提升页面加载速度。正确理解和使用这两个属性,对于构建高性能的Web应用程序至关重要。
• JavaScript——你将获得忠告:理解Ajax性能、编写高效的JavaScript、创建快速响应的应用程序、无阻塞加载脚本等。 • 网络——你将学到:跨域共享资源、无损压缩图片大小,以及使用块编码加快网页渲染。 •...
在Web开发中,动态加载JavaScript脚本是一种常见的优化策略,它允许在页面加载后根据需要按需加载脚本,从而提高页面性能和用户体验。本文将详细介绍四种动态加载JS脚本的方法,并探讨它们的工作原理和应用场景。 1...
### JavaScript无阻塞加载具体方式 #### 概述 JavaScript是一种广泛使用的编程语言,尤其在网页开发中扮演着至关重要的角色。然而,随着网站功能的不断丰富与复杂化,JavaScript文件的数量与大小也在逐渐增加,这...
### LoadScript 异步加载脚本函数 在前端开发中,动态加载JavaScript脚本是非常常见的需求之一。`loadScript`函数提供了一种简单且高效的方式来实现这一目标。它支持异步加载,允许开发者指定是否缓存脚本以及加载...
本文主要讲述的是如何实现无阻塞加载JavaScript,以避免JavaScript文件加载失败对页面显示造成影响。该内容主要涉及浏览器加载资源的方式、动态创建script元素以及一个无阻塞加载JavaScript的函数封装。 首先,...
这种方式可以通过监听滚动事件或用户操作事件,在适当的时候加载脚本,从而避免页面初始加载时的阻塞。 4. 分离JavaScript文件: 将JavaScript文件分为两个或多个文件,某些关键的脚本文件可以立即加载,而一些非...
- 延迟加载:只在用户需要时加载脚本,减少初始页面加载时间。 - 分离依赖:避免因某个脚本阻塞整个页面渲染。 - 灵活性:动态加载便于更新或替换脚本,无需刷新整个页面。 2. 使用`<script>`标签: HTML的`...
同时,执行广告脚本的script元素是动态创建并添加到head中的,这样可以控制脚本加载的时机,避免在页面渲染时立即执行,从而实现无阻塞加载。 总结一下,本文的核心知识点包括: - 第三方广告加载机制及其对页面...
其中,无阻塞加载JavaScript是一种常见的优化技术,它能够避免JavaScript文件对页面渲染造成延迟,从而提高页面性能。特别是对于包含富媒体内容的广告JS文件,无阻塞加载更为必要,因为这些文件可能会成为页面加载...
传统的脚本加载方式通常是阻塞的,即浏览器会等待一个脚本加载和执行完毕后才继续处理下一个资源。ControlJS 允许脚本以异步方式加载,这意味着浏览器可以同时处理多个资源,进一步提高了加载效率。通过异步加载,...