js并行加载,顺序执行

<script>运行脚本或加载外部文件时,会阻塞页面渲染,阻塞其他资源的加载。如果页面中需要加载多个js文件,在古老浏览器中性能会比较糟糕。 因此有了最原始的优化原则:把脚本放在底部

如何实现js非阻塞、并行加载,甚至能保持执行顺序呢?各浏览器表现如何?站在巨人的肩膀上,Kyle SimpsonNicholas C. ZakasSteve Souders对此有过总结和方案。

背景

1. Script DOM Element。 动态插入<script>,不会阻塞,但无法保持执行顺序。但唯有Firefox可以保持执行顺序,但也差点在Firefox 4 nightly的版本中去掉这个特性。

2. HTML5 async 非阻塞,加载完后立即执行,不保证顺序。这个属性不管有没有值、值为true或false,都是等同的效果(由于Kyle的推进,不能保证执行顺序与其值无关了)。

Google Analytics的新版嵌入代码就结合使用了上面两个方案,如:


1

2

3

4

5

6

7

8


var ga = document.createElement('script');

ga.type = 'text/javascript';

ga.async = true;

ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www')

          + '.google-analytics.com/ga.js';

 

var s = document.getElementsByTagName('script')[0];

s.parentNode.insertBefore(ga, s);

3. IE partsandspares.co.za defer属性。不阻塞,可以保证顺序,在DOM加载完成后执行(在DOMContentLoaded之前)。

4. <script>的type属性设为”script/cache” 非标准的type属性,使js文件只会被加载而不会执行。需要执行时,创建一个type属性为”text/javascript”的正常<script>元素,src设为前面已经加载的js地址即可,执行顺序开发者可控(执行时机也完全可控)。类似的方式也有通过<img>来做预加载的。

5. document.write。文档流关闭后执行会清空整个页面。

6. XHR 并行加载,执行顺序可控,但有同域限制。

基本需求

Steve Souders 和 Nicholas C. Zakas 一起总结了下,认为js加载方案必须解决以下问题

  1. 支持特性检测
  2. 不会重复加载
  3. 支持并行加载

开发者的美好愿望

Nicholas C. Zakas 几经周折,有了以下的提案,分离js的加载和执行,方便开发者自由控制js的执行时间。


1

2

3

4

5

6

7

8

9

10

11

12

13


var script = document.createElement("script");

 

// 此属性仅可由js动态写入,在HTML标签中直接写入无效

script.preload = true;

 

// src赋值后,立即触发加载(仅加载,不会执行js内容)

script.src = "foo.js";

 

// onpreload是需要新支持的事件,加载完成后触发此事件

script.onpreload = function(){

    // 在需要时,将加载的js插入到DOM中,即可运行生效

    document.body.appendChild(script);

};

基于特性检测feature detection(区别于特性推测feature inference)

var isPreloadSupported = (typeof script.preload == “boolean”);

这一特性只有在Javascript中动态赋值时生效,直接写到HTML标签上时是无效的。

但这只是一个提案,开发者们的美好愿望,而非被浏览器支持的标准。目前这一提案已在LABjs中支持,Zakas本人也在积极推进此提案的标准化。

而Kyle在推进另外一种方式,即要求对含有属性async=false的<script>保持执行顺序。如果async=true,则一旦加载完则会马上执行脚本,不会严格保持顺序。默认地,页面中的<script>的async属性为false,即保持执行顺序;js创建的<script>的async属性为true,即加载完立即执行,不保证顺序。

为了支持特性检测,一个由js创建的<script>标签默认具有async=true的属性。

Kyle的这一提案已被HTML5小组接受放入草案,在Firefox 4 nightly版本中的也已实现。

Firefox 4为了更向HTML5标准看齐,一度在开发者版本中去掉了对动态创建<script>来加载js文件的执行顺序支持

<script> elements created using document.createElement() and inserted into a document now behave according to the HTML5 specification by default. Scripts with the src attribute execute as soon as available (without maintaining ordering) and scripts without the src attribute execute synchronously.

为此,Kyle向WebKit开发团队抗议,提了一个bug,最终得到了如他所愿的支持:

To make script-inserted scripts that have the src attribute execute in the insertion order, set .async=false on them.

Zakas很欣赏Kyle的方案,Kyle在LABjs中也支持了Zakas的提议,各浏览器们也这么和谐就好了。

转自:http://www.impng.com/web-dev/parallel-download-ordered-execute.html

特别说明:尊重作者的劳动成果,转载请注明出处哦~~~http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp64

时间: 2024-11-02 18:33:44

js并行加载,顺序执行的相关文章

异步-require.js配置文件加载顺序?

问题描述 require.js配置文件加载顺序? require.jsdata-main=""../js/main""我想引入的是独立的配置文件,下面在写一行加载页面逻辑比如a.js但data的方式是异步加载,导致a比main先加载,有什么办法吗?我不用data的方式另起一行的话是可以 解决方案 require.js 配置文件研究 解决方案二: require(['a']function(){//先请求完a,再回调里面在请求湖区main,不用直接script加载,会

requirejs:性能优化-及早并行加载

为了提高页面的性能,通常情况下,我们希望资源尽可能地早地并行加载.这里有两个要点,首先是尽早,其次是并行. 通过data-main方式加载要尽可能地避免,因为它让requirejs.业务代码不必要地串行起来.下面就讲下如何尽可能地利用浏览器并行加载的能力来提高性能. 低效串行:想爱但却无力 最简单的优化,下面的例子中,通过两个并排的script标签加载require.js.main.js,这就达到了require.js.main.js并行加载的目的. 但这会有个问题,假设main.js依赖了jq

jquery与js动态加载js文件的例子

如果用jquery append直接加载script标签的话,会报错的.除了document.write外,还有没有其他的比较好的动态加载js文件的方法. 1,jquery方法 $.getScript("./test.js");   //加载js文件    $.getScript("./test.js",function(){   //加载test.js,成功后,并执行回调函数      console.log("加载js文件");  }); 

js加载js文件并行加载与顺序执行

javaScript文件(下面简称脚本文件)需要被HTML文件引用才能在浏览器中运行.在HTML文件中可以通过不同的方式来引用脚本文件,我们需要关注的是,这些方式的具体实现和这些方式可能会带来的性能问题. 当浏览器遇到(内嵌)<script>标签时,当前浏览器无从获知javaScript是否会修改页面内容.因此,这时浏览器会停止处理页面,先执行javaScript代码,然后再继续解析和渲染页面.同样的情况也发生在使用 src 属性加在javaScript的过程中(即外链 javaScript)

jsp页面中的代码执行加载顺序介绍

 本篇文章主要是对jsp页面中的代码执行加载顺序进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1. java是在服务器端运行的代码,jsp在服务器的servlet里运行,而javascript和html都是在浏览器端运行的代码.所以加载执行顺序是是java>jsp>js.   2. js在jsp中的加载顺序   页面上的js代码时html代码的一部分,所以页面加载的时候是由上而下加载.所以js加载的顺序也就是页面中<script>标签出现的顺序.<scrip

JS动态加载脚本并执行回调操作_javascript技巧

关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解怎么在js中加载其它js文件并在加载完成后执行回调函数.  我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行. 经过对网络上资源的搜索,我发现在 IE 浏览器中可以使用

jsp页面中的代码执行加载顺序介绍_JSP编程

1. java是在服务器端运行的代码,jsp在服务器的servlet里运行,而javascript和html都是在浏览器端运行的代码.所以加载执行顺序是是java>jsp>js. 2. js在jsp中的加载顺序 页面上的js代码时html代码的一部分,所以页面加载的时候是由上而下加载.所以js加载的顺序也就是页面中<script>标签出现的顺序.<script>标签里面的或者是引入的外部js文件的执行顺序都是其语句出现的顺序,其中js执行的过程也是页面装载的一部分. 2

cookie.js 加载顺序问题怎么才有效

在使用cookie.js时,只有在jquery.js文件后加载整体才有效,下面与大家分享下有效加载顺序,有此需求的朋友可以参考下   今天遇到一个问题,在使用cookie.js时,只有在jquery.js文件后加载整体才有效 有效加载顺序 复制代码 代码如下: <head> <script type="text/javascript" src="./Scripts/scripts/jquery.1.3.2.js"></script>

java中类的加载及执行顺序

类的加载顺序 什么时候类加载 第一次需要使用类信息时加载. 类加载的原则:延迟加载,能不加载就不加载.  触发类加载的几种情况: (1).调用静态成员时,会加载静态成员真正所在的类及其父类. 通过子类调用父类的静态成员时,只会加载父类而不会加载子类. (2).第一次 new 对象的时候 加载(第二次再 new 同一个类时,不需再加载). (3).加载子类会先加载父类.(覆盖父类方法时所抛出的异常不能超过父类定义的范围) 注:如果静态属性有 final 修饰时,则不会加载,当成常量使用. 例:pu