1. 起源:
因為一般情況下script.js的加載是 立即且單線程的倘要,它會馬上加載,而且阻塞其他元素(如文件十拣、圖片封拧、html標(biāo)簽等)的加載。若js文件過大夭问,加載時間過長泽西,就會造成css樣式、圖片缰趋、html標(biāo)簽等沒有加載捧杉,此時會產(chǎn)生諸如白屏等現(xiàn)象。
2. 常見處理方式:
通常將script.js寫在頁面底部秘血,是引入script.js的代碼最后執(zhí)行味抖。
3. 引入async和defer
也可以引入異步加載async,或者延遲加載defer來解決灰粮。
1. async:html5中新增的屬性仔涩,它的作用是能夠異步的加載和執(zhí)行腳本,不因為加載腳本而阻塞頁面的加載粘舟。
2. defer:一個script加了defer屬性熔脂,即使放在head里面,它也會在html頁面解析完畢之后再去執(zhí)行蓖乘,也就是類似于把這個script放在了頁面底部锤悄。
4. 異同點
- 相同點:
- 加載文件時不阻塞頁面渲染。
- 對于inline的script無效嘉抒。
- 使用這兩個屬性的腳本中不能調(diào)用document.write方法零聚。
- 有腳本的onload的事件回調(diào)。
- 不同點:
- html4.0中定義了defer巫财,html5.0中定義了async宋下。
- defer有順序,async無順序:
async屬性的腳本會在下載結(jié)束后立刻執(zhí)行满俗,同時會在window的load事件之前執(zhí)行蚂会,所以就會出現(xiàn)順序被打亂的情況淋样;defer屬性的腳本是在頁面解析完成后,按照順序執(zhí)行胁住,同時會在document的DOMContentLoaded之前執(zhí)行趁猴。