前端优化过程当中常提到js的加载方式,下面说下几种经常使用的加载方式:javascript
1:head标签内插入<script>标签css
<script type="text/javaScript" src="test.js"></script>前端
这是最多见的方法,可是这个方法有个最大的问题,就是当浏览器解析到<script>标签时,浏览器会中止解析其后的内容,而优先下载脚本文件,并执行其中的代码,是个阻塞的过程,这意味着,其后的test.css样式文件和<body>标签都没法被加载,因为<body>标签和样式等资源没法被加载,那么页面天然就没法渲染了,所以经常页面打开会出现页面内容空白或者样式丢失问题,这都是在头部引入了过多的js文件阻塞加载形成的,虽然高版本的浏览器已经能够对脚本并行加载,但是还有些浏览器脚本依旧是一个接一个加载的,所以优化的话能够把js放在body标签最底部,这样页面能够先快速显示出来,提升了体验友好度。java
2:建立动态脚本浏览器
var script=document.createElement('script'); script.type='text/javaScript'; script.src='test.js'; document.getElementsByTagName('head')[0].appendChild(script);
上述代码动态建立了一个<script>标签,并添加在<head>标签内,不管在什么时候启动下载,文件的下载和执行过程不会阻塞页面其余内容的加载执行。此方法比较常见,咱们经常使用的一些第三方库中,不少都采用这种方式。然而这种方式有个最大的问题就是没法保证多个脚本之间的加载顺序,好比我写了一个代码,这个代码要依赖于jQuery,可是若是我这个文件优先于jQuery脚本先下载完并当即执行,这时浏览器会报错——‘jQuery未定义’之类的,由于此时jQuery库还未下载完成。app
3:LABjs前端优化
能够帮咱们完成脚本的并行加载和按顺序执行,这也是咱们公司目前用的主要方式,想要看详细的用法去官网看看。函数
常见用法:优化
1,spa
$LAB.script("script1.js") .script("script2.js") .script("script3.js") .wait(function(){// 等待全部script加载完再执行这个代码块
script1Func(); script2Func(); script3Func(); });
2,
$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();});
3,
$LAB.script("script1.js") // script1, script2, and script3 之间没有依赖关系,
.script("script2.js") // 因此能够任意顺序执行
.script("script3.js") .wait(function(){ // 若是须要,这里固然能够执行javascript函数
alert("Scripts 1-3 are loaded!"); }) .script("script4.js") // 依赖于 script1, script2 及 script3
.wait(function(){script4Func();});
上面实例中,前面三个脚本并行加载,任意顺序执行,若是有依赖而且脚本不少的话,没一个script函数后面接个wait就闲的代码很臃肿麻烦,因此labjs库提供了个参数能够确保下载完后顺序执行
$LAB.setOptions({AlwaysPreserveOrder:true})// 设置每一个脚本之间等待
.script("script1.js")// script1, script2, script3, script4 互相依赖
.script("script2.js")// 而且并行下载后循序执行
.script("script3.js") .script("script4.js") .wait(function(){ script4Func(); });
这样写代码精炼了不少,推荐
4,
$LAB.script(function(){ // `_is_IE`的值ie为true ,非ie为false
if(_is_IE){ return"ie.js"; // 若是是ie则这个js会被加载
}else{ return null; //若是不是ie这个代码就会被略过
} }) .script("script1.js") .wait();