`
davidxiaozhi
  • 浏览: 240009 次
  • 性别: 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效果略逊且不太流行

 

分享到:
评论

相关推荐

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

    无阻塞加载脚本是一种优化网页性能的技术,旨在减少页面加载时间,提高用户体验。这是因为传统的`&lt;script&gt;`标签会阻塞浏览器的解析过程,导致页面的其他资源下载和渲染暂停,直到脚本下载并执行完毕。为了克服这个...

    LABjs无阻塞脚本加载工具

    1. **无阻塞加载**:LABjs允许在不阻塞页面渲染的情况下加载脚本,通过将脚本加载与页面解析解耦,提升了页面的初始加载速度。 2. **动态加载**:你可以随时添加新的脚本到加载队列中,无论何时何地,只要需要,就...

    高性能网站建设进阶

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

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

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

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

    总之,`async`和`defer`属性为优化网页性能提供了有效手段,通过非阻塞加载脚本,可以在不牺牲用户体验的前提下提升页面加载速度。正确理解和使用这两个属性,对于构建高性能的Web应用程序至关重要。

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

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

    动态加载JS脚本的4种方法.doc

    在Web开发中,动态加载JavaScript脚本是一种常见的优化策略,它允许在页面加载后根据需要按需加载脚本,从而提高页面性能和用户体验。本文将详细介绍四种动态加载JS脚本的方法,并探讨它们的工作原理和应用场景。 1...

    Javascript无阻塞加载具体方式

    ### JavaScript无阻塞加载具体方式 #### 概述 JavaScript是一种广泛使用的编程语言,尤其在网页开发中扮演着至关重要的角色。然而,随着网站功能的不断丰富与复杂化,JavaScript文件的数量与大小也在逐渐增加,这...

    loadScript异步加载脚本函数

    ### LoadScript 异步加载脚本函数 在前端开发中,动态加载JavaScript脚本是非常常见的需求之一。`loadScript`函数提供了一种简单且高效的方式来实现这一目标。它支持异步加载,允许开发者指定是否缓存脚本以及加载...

    无阻塞加载js,防止因js加载不了影响页面显示的问题

    本文主要讲述的是如何实现无阻塞加载JavaScript,以避免JavaScript文件加载失败对页面显示造成影响。该内容主要涉及浏览器加载资源的方式、动态创建script元素以及一个无阻塞加载JavaScript的函数封装。 首先,...

    js防阻塞加载的实现方法

    这种方式可以通过监听滚动事件或用户操作事件,在适当的时候加载脚本,从而避免页面初始加载时的阻塞。 4. 分离JavaScript文件: 将JavaScript文件分为两个或多个文件,某些关键的脚本文件可以立即加载,而一些非...

    how-to-load-dynamic-script, 加载动态脚本的正确方法.zip

    - 延迟加载:只在用户需要时加载脚本,减少初始页面加载时间。 - 分离依赖:避免因某个脚本阻塞整个页面渲染。 - 灵活性:动态加载便于更新或替换脚本,无需刷新整个页面。 2. 使用`&lt;script&gt;`标签: HTML的`...

    用js的[removed]输出的广告无阻塞加载的方法

    同时,执行广告脚本的script元素是动态创建并添加到head中的,这样可以控制脚本加载的时机,避免在页面渲染时立即执行,从而实现无阻塞加载。 总结一下,本文的核心知识点包括: - 第三方广告加载机制及其对页面...

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

    其中,无阻塞加载JavaScript是一种常见的优化技术,它能够避免JavaScript文件对页面渲染造成延迟,从而提高页面性能。特别是对于包含富媒体内容的广告JS文件,无阻塞加载更为必要,因为这些文件可能会成为页面加载...

    ControlJS - 让脚本加载的更快

    传统的脚本加载方式通常是阻塞的,即浏览器会等待一个脚本加载和执行完毕后才继续处理下一个资源。ControlJS 允许脚本以异步方式加载,这意味着浏览器可以同时处理多个资源,进一步提高了加载效率。通过异步加载,...

Global site tag (gtag.js) - Google Analytics