javascript异步加载方式方法及思考

本文详细总结了JavaScript加载方式,包括同步加载、使用defer和async属性、动态创建script元素、以及利用Labjs库实现异步加载。重点讨论了如何避免网页加载过程中的白屏现象,提供了解决方案并推荐了最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有没有发现,很多网站加载前都有一段时间是空白的,(或加了一个加载的gif动画)。
自己也知道是一些资源的加载问题,今天就这问题,对javascript的加载方式进行一些总结(个人观点,有错勿喷,欢迎纠正!)

浏览器默认的加载方式是同步的(即阻塞式),如:

<span style="font-size:18px;"><script src="a.js"></script> 
<script src="b.js"></script>
<script src="c.js"></script></span>
它是先依次加载3个js文件后,在加载body里的内容,如果js较多,期间就会有一段时间白屏。

解决方法:

1.js文件放在</body>前(都懂的)

2.加上defer属性. (效果与1.相同)如:

<span style="font-size:18px;"><script src="a.js" defer="defer"></script> </span>

  3.加上async属性

<span style="font-size:18px;"><script src="a.js" async ="async"></script>
<script src="b.js" async ="async"></script></span>
<span style="font-size:18px;"><script src="c.js" async ="async"></script></span>
这个方法实现了异步加载,但有问题。3个js与后面body里的内容同时加载,但其加载顺序不保证,(如果b依赖a,就可能出错)。
一般用于独立的js(如广告)。

4.动态创建script(既保证了异步,又能解决顺序问题)

<span style="font-size:18px;">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: Firefox, Safari, Chrome, and Opera 
 		script.onload = function(){ 
			 callback(); 
		 }; 
       } 
 	script.src = url; 
	document.body.appendChild(script); 
	};</span>
:以上代码参考自一个自己感觉比较好的blog:http://www.jb51.net/article/34491.htm

5.Labjs库http://labjs.com/

      <span style="font-size:18px;">例1:
             $LAB.script("script1.js")
            .script("script2.js")
            .script("script3.js")
            .wait(function(){		// 等待所有script加载完再执行这个代码块
                script1Func();
                script2Func();
                script3Func();
    		});</span>
<span style="font-size:18px;">       例2:
             $LAB.script("script1.js","script2.js","script3.js")
            .wait(function(){		// 等待所有script加载完再执行这个代码块
                script1Func();
                script2Func();
                script3Func();
            });</span></span>
<span style="font-size:18px;">      例3:
             $LAB.script("script1.js")
            .wait()    			// 空的wait()只是确保script1在其他代码之前被执行
            .script("script2.js")       // script2 和 script3 依赖于 script1
            .script("script3.js")
            .wait()   			// 但是script2 和 script3 并不互相依赖,可以并行下载
            .script("script4.js")       
           //script4 依赖于 script1, script2 及 script3 .wait(function(){script4Func();});</span>

推荐方法4和5

当然还有很多方法(如:XHR Eval 、XHR Injection 、Script in Iframe ),这里不一一列举了。

个人观点,欢迎补充、纠正^_^!





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值