• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    JavaScript無阻塞加載和defer、async

    來源:懂視網 責編:小采 時間:2020-11-27 20:24:36
    文檔

    JavaScript無阻塞加載和defer、async

    JavaScript無阻塞加載和defer、async:無阻塞加載把js放在head里,瀏覽器是怎么去執行它的呢,是按順序加載還是并行加載呢?在舊的瀏覽器下,都是按照先后順序來加載的,這就保證了加載的js依賴不會發生問題。但是少部分新的瀏覽器已經開始允許并行加載js了,也就是說可以同時下載js文件,但是還是
    推薦度:
    導讀JavaScript無阻塞加載和defer、async:無阻塞加載把js放在head里,瀏覽器是怎么去執行它的呢,是按順序加載還是并行加載呢?在舊的瀏覽器下,都是按照先后順序來加載的,這就保證了加載的js依賴不會發生問題。但是少部分新的瀏覽器已經開始允許并行加載js了,也就是說可以同時下載js文件,但是還是
    無阻塞加載

    把js放在head里,瀏覽器是怎么去執行它的呢,是按順序加載還是并行加載呢?在舊的瀏覽器下,都是按照先后順序來加載的,這就保證了加載的js依賴不會發生問題。但是少部分新的瀏覽器已經開始允許并行加載js了,也就是說可以同時下載js文件,但是還是按先后順序執行文件的。

    下載是異步的沒問題,但是每個javascript執行的時候還是同步的,就是先出現的script標簽一定是先執行,即使是并行下載它是最后一個下載完成的,除非標有defer的script標簽。任何javascript在執行的時候都會中斷當前html文檔解析,自然會阻止頁面渲染。

    javascript加載是不會影響已經渲染的頁面,但是會中斷html文檔解析,瀏覽器會在javascript執行以后決定當前文檔是否需要進行重新渲染或者文檔重排。所以即使javascript放到最后面也會使瀏覽器暫停,但不影響之前已經解析出來的dom文檔,此時對于用戶來說是可操作的。

    javascript下載完畢之后會立即執行,所有的javascript執行都會阻塞瀏覽器的其他行為,例如阻塞其他javascript的執行、其他的http請求的執行以及頁面的解析和渲染。(html文檔中外部js的下載也會阻塞瀏覽器的行為,但通過創建script元素動態js的下載不會,可能是認為動態的js不會改變頁面效果,所以允許資源并行下載。)

    JavaScript無阻塞加載和defer、async

    圖示動態腳本的下載

    UI線程會根據頁面里資源(資源是指css文件,圖片等等)書寫的先后順序來加載資源,加載資源也就是使用http請求獲取資源,像css外部文件,html文件以及圖片等資源http請求處理完畢也就意味著資源加載結束,但是像外部的javascript文件的加載則不同,它的加載過程被分為兩步,第一步和加載css文件和圖片一樣,就是執行一個http請求下載外部的js文件,但是javascript完成http操作后并不意味操作完畢,UI線程接著會執行它。js腳本的下載和執行必須是一個完整的操作,是不能被割裂的。動態js的下載不會阻塞,但執行一定會會。

    瀏覽器為了提升用戶體驗,加快UI線程的執行是一個無法回避的問題,但是拆分js的下載和執行是不可行的,如是乎瀏覽器換了種方式,這個方式也就是在同一個時間能下載多個資源。

    將常用的,穩定的靜態資源統一放在一個靜態資源服務器上,由統一的域名對外提供,這個域名要和主體請求的域名不一樣,原理是因為瀏覽器只通過域名來限制連接的個數,如果一個頁面里有兩個不同的域的,那么并行的http請求個數也會變成兩倍。有度,對DNS解析要開銷,所以2個最佳。

    將所有外部js代碼分為UI初始化代碼和其他代碼,UI初始化代碼是在頁面加載時候執行的代碼。讓那些不會用于頁面初始化展示的js代碼的加載和執行操作通過onload事件在瀏覽器忙指示結束后觸發,即讓那些和頁面加載無關的js腳本在onload方法里執行

    無阻塞加載腳本的核心技術就是動態的創建script的dom節點,而且可以跨域訪問。

    動態腳本元素,就是說 <script> 標簽不是寫死在HTML中的,而是由現有的腳本生成的,因為 <script> 標簽也是DOM元素的一種,而JavaScript是可以通過DOM API操作DOM的。動態腳本只有在新建的script元素被添加到html文檔時開始下載,下載完立即執行。

    無阻塞腳本的好處就是不會阻塞UI的執行,也不會影響其他同步js代碼的執行,不無阻塞腳本改變了腳本的加載順序,所以在使用無阻塞腳本時候一定要更加注意腳本之間的依賴關系,保證整個頁面的腳本都能正常執行。

    使用無阻塞腳本了,代碼置于head標簽還是html文檔底部也就無關緊要了。

    頁面加載的總時間不是衡量頁面加載快捷的標準,頁面同步阻塞加載的時間才是衡量頁面加載效率的準確標準,非阻塞腳本加載可能會增加整個頁面加載的時間,但是它可以減少頁面阻塞加載的時間。

    腳本的異步執行,會產生前后依賴的問題。在腳本加載執行完畢后,非ie瀏覽器會觸發該 <script> 元素的 onload 事件,ie瀏覽器下有onreadystatechange事件,我們可以將回調放到這個事件中處理。

    每當瀏覽器解析到<script>標簽(無論內嵌還是外鏈)時,瀏覽器會優先下載、解析并執行該標簽中的javaScript代碼,而阻塞其后所有頁面內容的下載和渲染。(也就是說外部js的下載也會阻塞別的線程,目前有少部分瀏覽器支持并行下載js)

    無阻塞加載腳本技術的核心就是:動態下載js腳本的時候,不會阻塞UI線程的執行。動態腳本為什么不阻塞ui線程?可能是因為瀏覽器認為動態資源不會影響頁面渲染。

    讓script延遲和異步的兩個屬性:defer和async

    js腳本會改變文檔輸入流的內容,所以執行js時會暫停頁面的渲染。對于內聯腳本沒什么問題,因為腳本和html文檔被同時加載了。但對于外部引入的腳本,腳本的下載(取決于網速)也會阻塞瀏覽器文檔的解析和渲染,甚至會阻塞有些瀏覽器下載別的資源(目前有些瀏覽器已經實現并行下載)。所以出現defer和async屬性,優化頁面的顯示。

    defer(延遲)是html4.0中定義的,該屬性使得瀏覽器能延遲腳本的下載,等document文檔載入和解析完成后,按照他們在文檔中出現順序再去下載解析。也就是說defer屬性的<script>就類似于將<script>放在body底部的效果,會在document的DOMContentLoaded事件之前執行。

    將腳本放在body底部比給腳本增加defer屬性讓腳本延遲加載更好。

    async(異步)是HTML5新增的屬性,該屬性的作用是讓瀏覽器能并行下載腳本且不阻塞瀏覽器的文檔解析和渲染,下載完成后腳本立即執行,可能無序執行,取決于下載完成的時間)

    若瀏覽器同時支持上述兩種屬性且script標簽同時具有這兩種屬性,則async屬性會優于defer生效。

    在不支持async屬性的瀏覽器里,可以通過動態創建script元素并插入文檔中,實現腳本的異步載入和執行:

    JavaScript無阻塞加載和defer、async

    requirejs就是使用這個方法實現的。

    更多JavaScript無阻塞加載和defer、async相關文章請關注PHP中文網!

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    JavaScript無阻塞加載和defer、async

    JavaScript無阻塞加載和defer、async:無阻塞加載把js放在head里,瀏覽器是怎么去執行它的呢,是按順序加載還是并行加載呢?在舊的瀏覽器下,都是按照先后順序來加載的,這就保證了加載的js依賴不會發生問題。但是少部分新的瀏覽器已經開始允許并行加載js了,也就是說可以同時下載js文件,但是還是
    推薦度:
    標簽: 加載 js 阻塞
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品永久免费视频| 亚洲国产精品一区二区九九 | 精品国产品香蕉在线观看75| 精品日本一区二区三区在线观看| 99热亚洲色精品国产88| 欧美成人精品网站播放| 在线人成精品免费视频| 国产精品高清一区二区三区 | 97久久精品无码一区二区天美| 午夜福利麻豆国产精品| 91亚洲精品自在在线观看| 91精品一区国产高清在线| 精品一区二区三区波多野结衣| 亚洲国产91精品无码专区| 精品熟女少妇aⅴ免费久久 | 青春草无码精品视频在线观| 国产精品免费久久久久久久久 | 中文精品99久久国产| 精品久久久久久无码免费| 中文字幕亚洲精品| 国产午夜精品视频| 97久久超碰国产精品2021| 日韩精品内射视频免费观看| 亚洲精品无码专区久久同性男| 精品无码久久久久久久动漫| 国产成人精品久久综合| 久久久久久久99精品免费观看| 国产麻豆精品久久一二三| 无码人妻精品一区二区三区久久久 | 国产2021精品视频免费播放| 国产精品无码久久久久久| 久久99精品国产自在现线小黄鸭| 少妇人妻偷人精品免费视频| 少妇人妻无码精品视频| 在线观看国产精品日韩av| 亚洲日韩一页精品发布| 亚洲日韩精品无码专区网址 | 免费国产在线精品一区| 日本精品自产拍在线观看中文| 久久精品国产亚洲AV不卡| 日本一区二区三区精品国产 |