第一章:加載和運(yùn)行

  • 1.javascript具有阻塞特征,<script>標(biāo)簽出現(xiàn),會(huì)停止頁(yè)面的下載和解析,等待腳本執(zhí)行,因?yàn)槟_本可能在運(yùn)行過(guò)程中修改頁(yè)面內(nèi)容。
  • 2.腳本位置
<html>
<head>     
     <title>Script Example</title>     
     <-- Example of inefficient script positioning -->     
     <script type="text/javascript" src="file1.js"></script>     
     <script type="text/javascript" src="file2.js"></script>     
     <script type="text/javascript" src="file3.js"></script>     
     <link rel="stylesheet" type="text/css" href="styles.css">
</head>   
<body>     
    <p>Hello world!</p>   
</body> 
</html> 

存在的性能問(wèn)題:
瀏覽器在遇到body之前,不會(huì)渲染頁(yè)面的任何部分,head部分加載了三個(gè)js文件,每個(gè)<script>標(biāo)簽阻塞了頁(yè)面的解析,直到它完整的下載并運(yùn)行了js代碼之后,頁(yè)面才會(huì)繼續(xù)進(jìn)行。這就會(huì)導(dǎo)致,頁(yè)面打開(kāi)時(shí),首先是一個(gè)空白的頁(yè)面。


推薦的方法:

  • 將所有script標(biāo)簽盡可能接近<body>標(biāo)簽底部,盡量減少對(duì)整個(gè)頁(yè)面下載的影響。

  • 下載一個(gè)100kb的文件比下載四個(gè)25kb的文件要快,減少引用外部文件的數(shù)量,將多個(gè)js文件整合成一個(gè),可以使用打包工具。

  • 3.defer屬性:
    指明元素中所包含的腳本不打算修改DOM,因此代碼可以稍后執(zhí)行。

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

帶有defer屬性的<script>標(biāo)簽可以放置在頁(yè)面任何位置,對(duì)應(yīng)的Javascript文件在<script>標(biāo)簽被解析時(shí)啟動(dòng)下載,它不會(huì)阻塞瀏覽器的其他處理過(guò)程,這些文件可以與頁(yè)面的其他資源一起并行下載。這些代碼的執(zhí)行時(shí)機(jī)在頁(yè)面解析完后,但在 DOMContentLoaded事件之前。

  • 4.async屬性
<script type="text/javascript" src="demo_async.js" async="async"></script>

async屬性同defer屬性相同的地方在于,可以被放到任何位置,當(dāng)遇到<script>標(biāo)簽時(shí)開(kāi)始啟動(dòng)下載,并且不會(huì)阻塞瀏覽器的其他處理過(guò)程。

不同的地方在于,帶有async標(biāo)簽的腳本一旦下載完成就開(kāi)始執(zhí)行(當(dāng)然是在window的onload之前),執(zhí)行也是異步的不會(huì)阻塞瀏覽器的其他處理過(guò)程。這意味著這些script 可能不會(huì)按它們出現(xiàn)在頁(yè)面中的順序來(lái)執(zhí)行,如果你的腳本互相依賴并和執(zhí)行順序相關(guān),就有很大的可能出問(wèn)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容