随着 Web2.0 技术的不断推广,越来越多的应用使用 javascript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题。而这个问题又因 JavaScript 的阻塞特性变的复杂,也就是说当浏览器在执行 JavaScript 代码时,不能同时做其他任何事情。本文详细介绍了如何正确的加载和执行 JavaScript 代码,从而提高其在浏览器中的性能。

1、概述

无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成。

JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长。浏览器在下载和执行脚本时出现阻塞的原因在于,脚本可能会改变页面或 JavaScript 的命名空间,它们对后面页面内容造成影响。一个典型的例子就是在页面中使用document.write()。

例1: JavaScript 代码内嵌示例

<!DOCTYPE html>
<html>
<head>
<title>Source Example</title>
</head>
<body>
<p>
<script type="text/javascript"> document.write("Today is " + (new Date()).toDateString());
</script>
</p>
</body>
</html>

当浏览器遇到<script>标签时,当前 html 页面无从获知 JavaScript 是否会向<p> 标签添加内容,或引入其他元素,或甚至移除该标签。

因此,这时浏览器会停止处理页面,先执行 JavaScript代码,然后再继续解析和渲染页面。同样的情况也发生在使用 src 属性加载 JavaScript的过程中,浏览器必须先花时间下载外链文件中的代码,然后解析并执行它。在这个过程中,页面渲染和用户交互完全被阻塞了。

2、脚本位置

HTML 4 规范指出 <script> 标签可以放在 HTML 文档的<head>或<body>中,并允许出现多次。

web 开发人员一般习惯在 <head> 中加载外链的 JavaScript,接着用 <link> 标签用来加载外链的 CSS 文件或者其他页面信息。

例2: 低效率脚本位置示例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript" src="script1.js"></script>
<script type="text/javascript" src="script2.js"></script>
<script type="text/javascript" src="script3.js"></script>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
...
</body>
</html>

然而这种常规的做法却隐藏着严重的性能问题。

在例2 的示例中,当浏览器解析到 <script> 标签时,浏览器会停止解析其后的内容,而优先下载脚本文件,并执行其中的代码,这意味着,其后的 styles.css 样式文件和<body>标签都无法被加载,由于<body>标签无法被加载,那么页面自然就无法渲染了。

因此在该 JavaScript 代码完全执行完之前,页面都是一片空白。图 1 描述了页面加载过程中脚本和样式文件的下载过程。

【图 1】 JavaScript 文件的加载和执行阻塞其他文件的下载

aaarticlea/jpeg;base64,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" alt="" />

我们可以发现一个有趣的现象:第一个 JavaScript 文件开始下载,与此同时阻塞了页面其他文件的下载。此外,从 script1.JS 下载完成到 script2.js 开始下载前存在一个延时,这段时间正好是 script1.js 文件的执行过程。每个文件必须等到前一个文件下载并执行完成才会开始下载。在这些文件逐个下载过程中,用户看到的是一片空白的页面。

从 IE 8、Firefox 3.5、Safari 4 和 Chrome 2 开始都允许并行下载 JavaScript 文件。这是个好消息,因为<script>标签在下载外部资源时不会阻塞其他<script>标签。

遗憾的是,JavaScript 下载过程仍然会阻塞其他资源的下载,比如样式文件和图片。尽管脚本的下载过程不会互相影响,但页面仍然必须等待所有 JavaScript 代码下载并执行完成才能继续。

因此,尽管最新的浏览器通过允许并行下载提高了性能,但问题尚未完全解决,脚本阻塞仍然是一个问题。

由于脚本会阻塞页面其他资源的下载,因此推荐将所有<script>标签尽可能放到<body>标签的底部,以尽量减少对整个页面下载的影响。

例3: 推荐的代码放置位置示例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>推荐的代码放置位置示例</title>
</head>
<body>
<p>Hello World!</p>
<script type="text/javascript" src="script1.js"></script>
<script type="text/javascript" src="script2.js"></script>
<script type="text/javascript" src="script3.js"></script>
</body>
</html>

这段代码展示了在 HTML 文档中放置<script>标签的推荐位置。尽管脚本下载会阻塞另一个脚本,但是页面的大部分内容都已经下载完成并显示给了用户,因此页面下载不会显得太慢。

这是优化 JavaScript 的首要规则:将脚本放在底部。

3、组织脚本

由于每个<script>标签初始下载时都会阻塞页面渲染,所以减少页面包含的<script>标签数量有助于改善这一情况。这不仅针对外链脚本,内嵌脚本的数量同样也要限制。浏览器在解析 HTML 页面的过程中每遇到一个<script>标签,都会因执行脚本而导致一定的延时,因此最小化延迟时间将会明显改善页面的总体性能。

这个问题在处理外链 JavaScript 文件时略有不同。考虑到 HTTP 请求会带来额外的性能开销,因此下载单个 100Kb 的文件将比下载 5 个 20Kb 的文件更快。也就是说,减少页面中外链脚本的数量将会改善性能。

通常一个大型网站或应用需要依赖数个 JavaScript 文件。您可以把多个文件合并成一个,这样只需要引用一个<script>标签,就可以减少性能消耗。文件合并的工作可通过离线的打包工具或者一些实时的在线服务来实现。

需要特别提醒的是,把一段内嵌脚本放在引用外链样式表的<link>之后会导致页面阻塞去等待样式表的下载。这样做是为了确保内嵌脚本在执行时能获得最精确的样式信息。因此,建议不要把内嵌脚本紧跟在<link>标签后面。

4、无阻塞的脚本

减少 JavaScript 文件大小并限制 HTTP 请求数在功能丰富的 Web 应用或大型网站上并不总是可行。Web 应用的功能越丰富,所需要的 JavaScript 代码就越多,尽管下载单个较大的 JavaScript 文件只产生一次 HTTP 请求,却会锁死浏览器的一大段时间。为避免这种情况,需要通过一些特定的技术向页面中逐步加载 JavaScript 文件,这样做在某种程度上来说不会阻塞浏览器。

无阻塞脚本的秘诀在于,在页面加载完成后才加载 JavaScript 代码。这就意味着在 window 对象的 onload事件触发后再下载脚本。有多种方式可以实现这一效果。

5、延迟加载脚本

HTML 4 为<script>标签定义了一个扩展属性:defer。Defer 属性指明本元素所含的脚本不会修改 DOM,因此代码能安全地延迟执行。defer 属性只被 IE 4 和 Firefox 3.5 更高版本的浏览器所支持,所以它不是一个理想的跨浏览器解决方案。在其他浏览器中,defer 属性会被直接忽略,因此<script>标签会以默认的方式处理,也就是说会造成阻塞。然而,如果您的目标浏览器支持的话,这仍然是个有用的解决方案。

例4:

<script type="text/javascript" src="script1.js" defer></script>

带有 defer 属性的<script>标签可以放置在文档的任何位置。对应的 JavaScript 文件将在页面解析到<script>标签时开始下载,但不会执行,直到 DOM 加载完成,即onload事件触发前才会被执行。当一个带有 defer 属性的 JavaScript 文件下载时,它不会阻塞浏览器的其他进程,因此这类文件可以与其他资源文件一起并行下载。

任何带有 defer 属性的<script>元素在 DOM 完成加载之前都不会被执行,无论内嵌或者是外链脚本都是如此。

例5:展示了defer属性如何影响脚本行为

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>推荐的代码放置位置示例</title>
</head>
<body>
<script type="text/javascript" defer>
alert("defer");
</script>
<script type="text/javascript">
alert("script");
</script>
<script type="text/javascript">
window.onload = function(){
alert("load");
};
</script>
</body>
</html>

这段代码在页面处理过程中弹出三次对话框。不支持 defer 属性的浏览器的弹出顺序是:“defer”、“script”、“load”。而在支持 defer 属性的浏览器上,弹出的顺序则是:“script”、“defer”、“load”。

请注意:带有 defer 属性的<script>元素不是跟在第二个后面执行,而是在 onload 事件被触发前被调用。

如果您的目标浏览器只包括 Internet Explorer 和 Firefox 3.5,那么 defer 脚本确实有用。如果您需要支持跨领域的多种浏览器,那么还有更一致的实现方式。

HTML 5 为<script>标签定义了一个新的扩展属性:async。它的作用和 defer 一样,能够异步地加载和执行脚本,不因为加载脚本而阻塞页面的加载。

但是有一点需要注意,在有 async 的情况下,JavaScript 脚本一旦下载好了就会执行,所以很有可能不是按照原本的顺序来执行的。如果 JavaScript 脚本前后有依赖性,使用 async 就很有可能出现错误。

6、动态脚本元素

文档对象模型(DOM)允许您使用 JavaScript 动态创建 HTML 的几乎全部文档内容。<script>元素与页面其他元素一样,可以非常容易地通过标准 DOM 函数创建:

例6:通过标准 DOM 函数创建<script>元素

var script = document.createElement ("script");
script.type = "text/javascript";
script.src = "script1.js";
document.getElementsByTagName("head")[0].appendChild(script);

新的<script>元素加载 script1.js 源文件。此文件当元素添加到页面之后立刻开始下载。

此技术的重点在于:无论在何处启动下载,文件的下载和运行都不会阻塞其他页面处理过程。您甚至可以将这些代码放在<head>部分而不会对其余部分的页面代码造成影响(除了用于下载文件的 HTTP 连接)。

当文件使用动态脚本节点下载时,返回的代码通常立即执行(除了 Firefox 和 Opera,他们将等待此前的所有动态脚本节点执行完毕)。当脚本是“自运行”类型时,这一机制运行正常,但是如果脚本只包含供页面其他脚本调用调用的接口,则会带来问题。这种情况下,您需要跟踪脚本下载完成并是否准备妥善。可以使用动态 <script> 节点发出事件得到相关信息。

Firefox、Opera, Chorme 和 Safari 3+会在<script>节点接收完成之后发出一个 onload 事件。您可以监听这一事件,以得到脚本准备好的通知:

例7: 通过监听 onload 事件加载 JavaScript 脚本

var script = document.createElement ("script")
script.type = "text/javascript"; //Firefox, Opera, Chrome, Safari 3+
script.onload = function(){
alert("Script loaded!");
};
script.src = "script1.js";
document.getElementsByTagName("head")[0].appendChild(script);

Internet Explorer 支持另一种实现方式,它发出一个 readystatechange 事件。<script>元素有一个 readyState 属性,它的值随着下载外部文件的过程而改变。

readyState 有五种取值:

  • “uninitialized”:默认状态
  • “loading”:下载开始
  • “loaded”:下载完成
  • “interactive”:下载完成但尚不可用
  • “complete”:所有数据已经准备好

微软文档上说,在<script>元素的生命周期中,readyState 的这些取值不一定全部出现,但并没有指出哪些取值总会被用到。实践中,我们最感兴趣的是“loaded”和“complete”状态。

Internet Explorer 对这两个 readyState 值所表示的最终状态并不一致,有时<script>元素会得到“loader”却从不出现“complete”,但另外一些情况下出现“complete”而用不到“loaded”。最安全的办法就是在 readystatechange 事件中检查这两种状态,并且当其中一种状态出现时,删除 readystatechange 事件句柄(保证事件不会被处理两次):

例8: 通过检查 readyState 状态加载 JavaScript 脚本

var script = document.createElement("script")
script.type = "text/javascript"; //Internet Explorer
script.onreadystatechange = function(){
if (script.readyState == "loaded" || script.readyState == "complete"){
script.onreadystatechange = null; alert("Script loaded.");
}
};
script.src = "script1.js";
document.getElementsByTagName("head")[0].appendChild(script);

大多数情况下,您希望调用一个函数就可以实现 JavaScript 文件的动态加载。下面的函数封装了标准实现和 IE 实现所需的功能:

原文链接:http://caibaojian.com/jsload.html
清单 8 通过检查 readyState 状态加载 JavaScript 脚本

例9: 通过函数进行封装

function loadScript(url, callback){
var script = document.createElement ("script");
script.type = "text/javascript";
if (script.readyState){ //IE
script.onreadystatechange = function(){
if (script.readyState == "loaded" || script.readyState == "complete"){
script.onreadystatechange = null;
callback();
}
};
} else { //Others
script.onload = function(){
callback();
};
}
script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);
}

此函数接收两个参数:JavaScript 文件的 URL,和一个当 JavaScript 接收完成时触发的回调函数。

属性检查用于决定监视哪种事件。最后一步,设置 src 属性,并将<script>元素添加至页面。此 loadScript() 函数使用方法如下:

例10: loadScript()函数使用方法

loadScript("script1.js", function(){
alert("File is loaded!");
});

您可以在页面中动态加载很多 JavaScript 文件,但要注意,浏览器不保证文件加载的顺序。所有主流浏览器之中,只有 Firefox 和 Opera 保证脚本按照您指定的顺序执行。其他浏览器将按照服务器返回它们的次序下载并运行不同的代码文件。您可以将下载操作串联在一起以保证他们的次序,如下:

例11: 通过 loadScript()函数加载多个 JavaScript 脚本

loadScript("script1.js", function(){
loadScript("script2.js", function(){
loadScript("script3.js", function(){
alert("All files are loaded!");
});
});
});

此代码等待 script1.js 可用之后才开始加载 script2.js,等 script2.js 可用之后才开始加载 script3.js。虽然此方法可行,但如果要下载和执行的文件很多,还是有些麻烦。如果多个文件的次序十分重要,更好的办法是将这些文件按照正确的次序连接成一个文件。独立文件可以一次性下载所有代码(由于这是异步进行的,使用一个大文件并没有什么损失)。

动态脚本加载是非阻塞 JavaScript 下载中最常用的模式,因为它可以跨浏览器,而且简单易用。

9、使用 XMLHttpRequest(XHR)对象

此技术首先创建一个 XHR 对象,然后下载 JavaScript 文件,接着用一个动态 <script> 元素将 JavaScript 代码注入页面。例12 是一个简单的例子:

例12: 通过 XHR 对象加载 JavaScript 脚本

var xhr = new XMLHttpRequest();
xhr.open("get", "script1.js", true);
xhr.onreadystatechange = function(){
if (xhr.readyState == 4){
if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
var script = document.createElement ("script");
script.type = "text/javascript";
script.text = xhr.responseText; document.body.appendChild(script);
}
}
};
xhr.send(null);

此代码向服务器发送一个获取 script1.js 文件的 GET 请求。onreadystatechange 事件处理函数检查 readyState 是不是 4,然后检查 HTTP 状态码是不是有效(2XX 表示有效的回应,304 表示一个缓存响应)。

如果收到了一个有效的响应,那么就创建一个新的<script>元素,将它的文本属性设置为从服务器接收到的 responseText 字符串。这样做实际上会创建一个带有内联代码的<script>元素。一旦新<script>元素被添加到文档,代码将被执行,并准备使用。

这种方法的主要优点是,您可以下载不立即执行的 JavaScript 代码。由于代码返回在<script>标签之外(换句话说不受<script>标签约束),它下载后不会自动执行,这使得您可以推迟执行,直到一切都准备好了。另一个优点是,同样的代码在所有现代浏览器中都不会引发异常。

此方法最主要的限制是:JavaScript 文件必须与页面放置在同一个域内,不能从 CDN 下载(CDN 指"内容投递网络(Content Delivery Network)",所以大型网页通常不采用 XHR 脚本注入技术。

10、总结

减少 JavaScript 对性能的影响有以下几种方法:

  • 将所有的<script>标签放到页面底部,也就是</body>闭合标签之前,这能确保在脚本执行前页面已经完成了渲染。
  • 尽可能地合并脚本。页面中的<script>标签越少,加载也就越快,响应也越迅速。无论是外链脚本还是内嵌脚本都是如此。
  • 采用无阻塞下载 JavaScript 脚本的方法:
  • 使用<script>标签的 defer 属性(仅适用于 IE 和 Firefox 3.5 以上版本);
  • 使用动态创建的<script>元素来下载并执行代码;
  • 使用 XHR 对象下载 JavaScript 代码并注入页面中。

通过以上策略,可以在很大程度上提高那些需要使用大量 JavaScript 的 Web 网站和应用的实际性能。

原文来自:https://www.ibm.com/developerworks/cn/web/1308_caiys_jsload/

JavaScript的性能优化:加载和执行的更多相关文章

  1. JS性能优化——加载和执行

    JavaScript 在浏览器中的性能,可以认为是开发者所面临得最严重的可用性问题.这个问题因JavaScript的阻塞特性变得复杂, 也就是说当浏览器在执行JavaScript代码时,不能同时做其他 ...

  2. 高性能JavaScript笔记一(加载和执行、数据访问、DOM编程)

    写在前面 好的书,可能你第一遍并不能领会里面的精魂,当再次细细品评的时候,发现领悟的又是一层新的含义 (这段时间,工作上也不会像从前一样做起来毫不费力,开始有了新的挑战,现在的老大让我既佩服又嫉妒,但 ...

  3. JavaScript 的性能优化:加载和执行

    随着 Web2.0 技术的不断推广,越来越多的应用使用 javascript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题.而这个问题又因 ...

  4. [转]JavaScript 的性能优化:加载和执行

    原文链接:http://www.ibm.com/developerworks/cn/web/1308_caiys_jsload/index.html?ca=drs- JavaScript 的性能优化: ...

  5. 【转】js JavaScript 的性能优化:加载和执行

    JavaScript 的性能优化:加载和执行 转自:https://www.ibm.com/developerworks/cn/web/1308_caiys_jsload/ 随着 Web2.0 技术的 ...

  6. 前端性能优化:细说JavaScript的加载与执行

    本文主要是从性能优化的角度来探讨JavaScript在加载与执行过程中的优化思路与实践方法,既是细说,文中在涉及原理性的地方,不免会多说几句,还望各位读者保持耐心,仔细理解,请相信,您的耐心付出一定会 ...

  7. 【摘要】JavaScript 的性能优化:加载和执行

    1.浏览器遇到js代码会暂停页面的下载和渲染,谁晓得js代码会不会把html给强奸(改变)了: 2.延迟脚本加载:defer 属性 <html> <head> <titl ...

  8. 性能优化-css,js的加载与执行

    前端性能优化 css,js的加载与执行 javascript是单线程的 一个网站在浏览器是如何进行渲染的呢? html页面加载渲染的过程 html渲染过程的一些特点 顺序执行,并发加载 词法分析 并发 ...

  9. 高性能JavaScript-JS脚本加载与执行对性能的影响

    在web产品优化准则中,很重要的一条是针对js脚本的加载和执行方式的优化.本篇文章简单描述一下其中的优化准则. 1. 脚本加载优化 1.1 脚本位置对性能的影响 优化页面加载性能的原则之一是将scri ...

随机推荐

  1. android4.3 Bluetooth分析之扫描分析

    android4.3中引入了蓝牙低能耗le(low energy),相应的也有一些方法/类.不过代码里,并没有找到初始调用的地方.所以这里还是先只分析下bt普通的扫描流程(类似android 4.2) ...

  2. 《Linux编程大作业》

    一.要求 作业题目 Linux下的多进程/线程网络通信 作业目标 要求学生熟练掌握<Linux编程>课程中的知识点,包括Linux常用命令.bash脚本.编译和调试环境.读写文件.进程间通 ...

  3. 给你的WP应用加上帮助文档

    背景 这算是Windows Phone编程回顾续篇, 接着给大家聊WP开发经验. 在开发了数个WP应用并发布后, 陆续收到很多反馈邮件, 其中接近一半的邮件是在问"某某功能有没有?" ...

  4. 20162328蔡文琛week03

    学号 2006-2007-2 <程序设计与数据结构>第X周学习总结 教材学习内容总结 在第三章,我学习到了更多有关于java.util包的知识.了解了多个引用变量可以指向同一个对象.而且J ...

  5. android在程序崩溃时Catch异常并处理

    Android系统的"程序异常退出",给应用的用户体验造成不良影响.为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理.通过Th ...

  6. lintcode-186-最多有多少个点在一条直线上

    186-最多有多少个点在一条直线上 给出二维平面上的n个点,求最多有多少点在同一条直线上. 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3). 一条直线上的点最多有3个. ...

  7. iOS 出现错误reason: image not found的解决方案

    在制作framework时遇到真机运行时导致的reason: image not found允许崩溃的问题,下面是我的解决方案: 首先我们分析一下出现这种情况的原因,原因就是framework找不到镜 ...

  8. week1技术随笔

    2016-09-06 2016年9月3日 类别c 内容c 开始时间s 结束时间e 被打断时间I 总计(min) 读书 读构建之法  8:40  10:00  11  69 读书 构建之法-个人能力 , ...

  9. 原生js移动端可拖动进度条插件

    该插件最初的想法来自网上的一篇文章,直达链接:https://www.cnblogs.com/libin-1/p/6220056.html 笔者因为业务需要寻找到这个插件,然后拿来用之,发现各种不方便 ...

  10. Dojo初探

    Dojo 是一个由 Dojo 基金会开发的 Javascript 工具包, 据说受到 IBM 的永久支持,其包括四个部分: dojo, dijit, dojox, util dojo: 有时也被称作 ...