`
davidxiaozhi
  • 浏览: 237065 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

无阻塞加载脚本

阅读更多

 

 

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文件同时使用JSMinShrinkSafe 这两个工具进行精简。

 

压缩组件

同时,不要忘记通过HTTP的头部声明,压缩脚本、样式表和HTML文档来减少响应时间。

浏览器客户端的请求: Accept-Encoding: gzip, deflate

Web服务器端的响应:Content-Encoding: gzip

gzip是目前流行和理想有效压缩方法,deflate效果略逊且不太流行

 

分享到:
评论

相关推荐

    无阻塞加载脚本分析[全]

    script标签的阻塞行为会对页面性能产生负面影响,大多数浏览器在下载或执行脚本的同时,会阻塞下载位于它之后的资源,也会阻塞渲染位于它之后的元素。

    LABjs无阻塞脚本加载工具

    开源无阻塞脚本加载工具LABjs。该工具提供了对加载过程更精细的控制,并试图同时下载尽可能多的代码。

    高性能网站建设进阶

    在本书中Souders与8位专家分享了提升网站性能的实践和实用建议,主要包括:理解Ajax性能,编写高效的,创建快速响应的应用程序和无阻塞加载脚本,跨域共享资源,无损压缩图片大小,使用块编码加快网页渲染,避免或...

    Even Faster Web Sites: Performance Best Practices for Web Developers (PDF 电子书)

     • JavaScript——你将获得忠告:理解Ajax性能、编写高效的JavaScript、创建快速响应的应用程序、无阻塞加载脚本等。  • 网络——你将学到:跨域共享资源、无损压缩图片大小,以及使用块编码加快网页渲染。  •...

    Javascript无阻塞加载具体方式

    3、非阻塞脚本 等页面完成加载后,再加载js代码。也就是,在window.load事件发出后开始下载代码。 (1)defer属性:支持IE4和fierfox3.5更高版本浏览器 [removed]…[removed] 内联和外部文件 带defer属性

    script的async属性以非阻塞的模式加载脚本

    HTML5实现了script的async属性,这个新的属性可以让js在浏览器中以非阻塞的模式加载,接下来介绍如何应用此属性,感兴趣的朋友可以了解下

    高性能Javascript--脚本的无阻塞加载策略

    Javascript在浏览器中的性能,可以说是前端开发者... 从基本层面说,这意味着[removed]标签的出现使整个页面因脚本解析、运行而出现等待。不论实际的 JavaScript代码是内联的还是包含在一个不相干的外部文件中,页面下载

    完美解决JS文件页面加载时的阻塞问题

    2.iframe注入:加载一个iframe框架,通过使用iframe框架中的脚本来避免src方式加载脚本的阻塞,但是iframe元素开销较大,不推荐。 3.DOM注入:就是创建script元素,通过制定该元素的src并放入DOM树中,根据该语句...

    JavaScript无阻塞加载和defer、async详解

    无阻塞加载 把js放在head里,浏览器是怎么去执行它的呢,是按顺序加载还是并行加载呢?在旧的浏览器下,都是按照先后顺序来加载的,这就保证了加载的js依赖不会发生问题。但是少部分新的浏览器已经开始允许并行加载...

    JavaScript中的无阻塞加载性能优化方案

    主要介绍了JavaScript中的无阻塞加载性能优化方案,本文讲解了Deferred Scripts 延期脚本、Dynamic Script Elements 动态脚本元素、XMLHttpRequest Script Injection XHR脚本注入等内容,需要的朋友可以参考下

    重写[removed]实现无阻塞加载js广告(补充)

    无阻塞加载javascript,对于页面性能优化有很大的作用,这样能有效的减少js对页面加载的阻塞。特别是一些广告js文件,由于广告内容有可能是富媒体,更是很可能成为你页面加载提速的瓶颈,高性能javascript告诉我们,...

    JS的引入及阻塞加载 + 数据类型 + 函数三大特性 (知识小结)

    文章目录一,JS引入及阻塞加载引入js的方式js的加载方式延时加载 和 异步加载 的特点二,JS的...阻塞加载:先从上往下解析,到了js脚本时,要执行完js脚本才能解析接下来的部分 延时加载:表示脚本可以延迟到文档完全被

    让浏览器非阻塞加载javascript的几种方法小结

    通常我们也会在wondow对象的onload事件处理函数中做一些事情,但由于脚本阻塞加载和呈现的特性这一方面增加了页面载入时间推迟了onload事件的触发,另一方面也延迟了用户所期待的反馈。这就需要我们使用一些方法来让...

    浏览器环境下JavaScript脚本加载与执行探析之defer与async特性

    defer和async特性相信是很多JavaScript开发者”熟悉而又不熟悉”的两个特性,从字面上来看,二者的功能很好理解,分别是”延迟脚本”和”异步脚本”的作用。...在《浏览器环境下JavaScript脚本加载与执行探

    浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入

    而除了defer和async特性,动态脚本和Ajax脚本注入也是两种常用的创建无阻塞脚本的方法。总的来看,这两种方法都能达到脚本加载不影响页面解析和渲染的作用,但是在不同的浏览器中,这两种技术所创建的脚本的执行时机...

    5种JavaScript脚本加载的方式

    javaScript文件(下面简称脚本文件)需要被HTML文件引用才能在浏览器中运行。在HTML文件中可以通过不同的方式来引用脚本文件,我们需要关注的是,这些方式的具体实现和...在这个过程中,页面渲染和用户交互完全被阻塞

    stan-loader:一个非常简单的非渲染阻塞 javascript 加载器,它将按顺序加载一组库,然后在加载或错误时执行回调函数

    一个非常简单的非渲染阻塞 javascript 加载器,它将按顺序加载一组库,然后在加载或错误时执行回调函数。 将允许在 、 、 和上获得更高的分数。 它是什么/它是如何工作的 STAN Loader 是一个接受四个参数的函数; ...

Global site tag (gtag.js) - Google Analytics