javascript - 異步模塊的理解
問題描述
對于同步模塊,模塊必須提前加載進(jìn)內(nèi)存中。對于異步模塊,比如說他的實(shí)現(xiàn)requirejs,依賴前置,且提前執(zhí)行,這不也是提前加載進(jìn)內(nèi)存了嗎,那為什么說是異步的?看了很多AMD和CMD的知識,就是不太明白同步模塊加載和異步模塊加載的區(qū)別。
問題解答
回答1:這個(gè)機(jī)制和【內(nèi)存】關(guān)系并不大,更多可以理解為【腳本的下載時(shí)機(jī)】。
前端的特殊性在于,腳本文件的體積和下載時(shí)間,會(huì)直接影響頁面性能。同步加載的規(guī)范中,所有依賴必須下載好后,腳本才能執(zhí)行。
而異步加載的規(guī)范中,只有代碼運(yùn)行到需要的位置時(shí),才會(huì)加載所需要的腳本。例如一個(gè)巨大的單頁應(yīng)用,首頁部分的腳本可以特別輕,而進(jìn)入某個(gè)功能頁時(shí),再異步加載需要的模塊,這樣對性能有很大的幫助。
回答2:requirejs的異步加載本質(zhì)上是在<head>里append需要異步加載的<script>,這些<script>元素都有async屬性來實(shí)現(xiàn)非阻塞異步加載。然后通過onload監(jiān)聽各個(gè)腳本加載完成狀態(tài),來實(shí)現(xiàn)多個(gè)存在依賴關(guān)系的腳本先后加載次序。可以自己用async和onload實(shí)現(xiàn)簡單的異步加載功能,但要實(shí)現(xiàn)requirejs這樣的功能,還是要花不少心思的。
相關(guān)文章:
1. docker網(wǎng)絡(luò)端口映射,沒有方便點(diǎn)的操作方法么?2. mysql - 在不允許改動(dòng)數(shù)據(jù)表的情況下,如何優(yōu)化以varchar格式存儲的時(shí)間的比較?3. javascript - 網(wǎng)頁打印頁另存為pdf的代碼一個(gè)問題4. vim - docker中新的ubuntu12.04鏡像,運(yùn)行vi提示,找不到命名.5. java中返回一個(gè)對象,和輸出對像的值,意義在哪兒6. css - chrome下a標(biāo)簽嵌套img 顯示會(huì)多個(gè)小箭頭?7. javascript - 關(guān)于apply()與call()的問題8. docker start -a dockername 老是卡住,什么情況?9. css3 - 純css實(shí)現(xiàn)點(diǎn)擊特效10. javascript - 有適合開發(fā)手機(jī)端Html5網(wǎng)頁小游戲的前端框架嗎?
