亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

淺析script標簽中的defer與async屬性

2019-11-19 18:45:41
字體:
來源:轉載
供稿:網友

一、前言

看到的前輩寫的代碼如下

<script src="#link("xxxx/xx/home/home.js")" type="text/javascript" async defer></script>

竟然同時有asyncdefer屬性,心想著肯定是前輩老司機的什么黑科技,兩個一塊兒肯定會發生什么神奇化學反應,于是趕緊懷著一顆崇敬的心去翻書翻文檔,先復習一下各自的定義。

二、調查一番

先看看asyncdefer各自的定義吧,翻開紅寶書望遠鏡,是這么介紹的

2.1 defer

這個屬性的用途是表明腳本在執行時不會影響頁面的構造。也就是說,腳本會被延遲到整個頁面都解析完畢后再運行。因此,在<script>元素中設置defer屬性,相當于告訴瀏覽器立即下載,但延遲執行。

HTML5規范要求腳本按照它們出現的先后順序執行,因此第一個延遲腳本會先于第二個延遲腳本執行,而這兩個腳本會先于DOMContentLoaded事件執行。在現實當中,延遲腳本并不一定會按照順序執行,也不一定會在DOMContentLoad時間觸發前執行,因此最好只包含一個延遲腳本。

2.2 async

這個屬性與defer類似,都用于改變處理腳本的行為。同樣與defer類似,async只適用于外部腳本文件,并告訴瀏覽器立即下載文件。但與defer不同的是,標記為async的腳本并不保證按照它們的先后順序執行。

第二個腳本文件可能會在第一個腳本文件之前執行。因此確保兩者之間互不依賴非常重要。指定async屬性的目的是不讓頁面等待兩個腳本下載和執行,從而異步加載頁面其他內容。

概括來講,就是這兩個屬性都會使script標簽異步加載,然而執行的時機是不一樣的。引用segmentfault上的一個回答中的一張圖

藍色線代表網絡讀取,紅色線代表執行時間,這倆都是針對腳本的;綠色線代表 HTML 解析。

也就是說async是亂序的,而defer是順序執行,這也就決定了async比較適用于百度分析或者谷歌分析這類不依賴其他腳本的庫。從圖中可以看到一個普通的<script>標簽的加載和解析都是同步的,會阻塞DOM的渲染,這也就是我們經常會把<script>寫在<body>底部的原因之一,為了防止加載資源而導致的長時間的白屏,另一個原因是js可能會進行DOM操作,所以要在DOM全部渲染完后再執行。

2.3 really?

然而,這張圖(幾乎是百度搜到的唯一答案)是不嚴謹的,這只是規范的情況,大多數瀏覽器在實現的時候會作出優化。

來看看chrome是怎么做的

《WebKit技術內幕》:

      1、當用戶輸入網頁URL的時候,WebKit調用其資源加載器加載該URL對應的網頁。

      2、加載器依賴網絡模塊建立連接,發送請求并接受答復。

      3、WebKit接收到各種網頁或者資源的數據,其中某些資源可能是同步或異步獲取的。

      4、網頁被交給HTML解釋器轉變成一系列的詞語(Token)。

      5、解釋器根據詞語構建節點(Node),形成DOM樹。

      6、如果節點是JavaScript代碼的話,調用JavaScript引擎解釋并執行。

      7、JavaScript代碼可能會修改DOM樹的結構。

      8、如果節點需要依賴其他資源,例如圖片、CSS、視頻等,調用資源加載器來加載他們,但是他們是異步的,不會阻礙當前DOM樹的繼續創建;如果是JavaScript資源URL(沒有標記異步方式),則需要停止當前DOM樹的創建,直到JavaScript的資源加載并被JavaScript引擎執行后才繼續DOM樹的創建。

所以,通俗來講,chrome瀏覽器首先會請求HTML文檔,然后對其中的各種資源調用相應的資源加載器進行異步網絡請求,同時進行DOM渲染,直到遇到<script>標簽的時候,主進程才會停止渲染等待此資源加載完畢然后調用V8引擎對js解析,繼而繼續進行DOM解析。我的理解如果加了async屬性就相當于單獨開了一個進程去獨立加載和執行,而defer是和將<script>放到<body>底部一樣的效果。

三、實驗一發

3.1 demo

為了驗證上面的結論我們來測試一下

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <link  rel="stylesheet"> <link  rel="stylesheet"> <script src="http://lib.sinaapp.com/js/angular.js/angular-1.2.19/angular.js"></script> <script src="http://libs.baidu.com/backbone/0.9.2/backbone.js"></script> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script></head><body> ul>li{這是第$個節點}*1000</body></html>

一個簡單的demo,從各個CDN上引用了2個CSS3個JS,在body里面創建了1000個li。通過調整外部引用資源的位置和加入相關的屬性利用chrome的Timeline進行驗證。

3.2 放置在<head>內

異步加載資源,但會阻塞<body>的渲染會出現白屏,按照順序立即執行腳本

3.3 放置在<body>底部


異步加載資源,等<body>中的內容渲染完畢后且加載完按順序執行JS

3.3 放置在<head>頭部并使用async

異步加載資源,且加載完JS資源立即執行,并不會按順序,誰快誰先上

3.4 放置在<head>頭部并使用defer


異步加載資源,在DOM渲染后之后再按順序執行JS

3.5 放置在<head>頭部并同時使用async和defer


表現和async一致,開了個腦洞,把這兩個屬性交換一下位置,看會不會有覆蓋效果,結果發現是一致的 = =、

綜上,在webkit引擎下,建議的方式仍然是把<script>寫在<body>底部,如果需要使用百度谷歌分析或者不蒜子等獨立庫時可以使用async屬性,若你的<script>標簽必須寫在<head>頭部內可以使用defer屬性

四、 兼容性

那么,揣摩一下前輩的心理,同時寫上的原因是什么呢,兼容性?

上caniuse,async在IE<=9時不支持,其他瀏覽器OK;defer在IE<=9時支持但會有bug,其他瀏覽器OK;現象在這個issue里有描述,這也就是“望遠鏡”里建議只有一個defer的原因。所以兩個屬性都指定是為了在async不支持的時候啟用defer,但defer在某些情況下還是有bug。

The defer attribute may be specified even if the async attribute is specified, to cause legacy Web browsers that only support defer (and not async) to fall back to the defer behavior instead of the synchronous blocking behavior that is the default.

五、結論

其實這么講來,最穩妥的辦法還是把<script>寫在<body>底部,沒有兼容性問題,沒有白屏問題,沒有執行順序問題,高枕無憂,不要搞什么deferasync的花啦~

目前只研究了chrome的webkit的渲染機制,Firefox和IE的有待繼續研究,圖片和CSS以及其他外部資源的渲染有待研究。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色一情一乱一区二区| 成人做爽爽免费视频| 亚洲国产精品久久91精品| 亚洲欧美成人在线| 国产97人人超碰caoprom| 色综合色综合网色综合| 亚洲欧美国产日韩天堂区| 亚洲精品中文字幕av| 国产99久久精品一区二区| 亚洲香蕉av在线一区二区三区| www.久久久久| 欧美日韩国产精品一区| 精品久久久一区| 亚洲精品久久久久中文字幕二区| 亚洲第一视频网站| 日韩欧美在线观看视频| 国产999精品视频| 亚洲欧美日韩直播| 欧美日韩亚洲一区二| 久久久精品一区二区三区| 日韩专区中文字幕| 中文欧美在线视频| 亚洲国产高清福利视频| 欧美老女人在线视频| 国产女人18毛片水18精品| 欧美一区二区三区图| 国产视频欧美视频| 91视频九色网站| 亚洲视频一区二区| 美日韩精品免费观看视频| 亚洲第一二三四五区| 欧美xxxx综合视频| 日韩美女视频在线观看| 欧美日韩性视频| 欧美亚洲国产视频| 国产精品青青在线观看爽香蕉| 97国产精品免费视频| 伊人成人开心激情综合网| 成人精品视频久久久久| 久久99久国产精品黄毛片入口| 欧美国产日产韩国视频| 久久久久久91| 精品国产91久久久久久老师| 中国china体内裑精亚洲片| 狠狠躁18三区二区一区| 国内精品小视频在线观看| 日韩av成人在线观看| 欧美激情在线狂野欧美精品| 久久亚洲一区二区三区四区五区高| 国产精品成人观看视频国产奇米| 精品视频久久久久久久| 精品一区电影国产| 亚洲视频欧洲视频| 亚洲精品久久7777777| 日韩中文字幕视频在线观看| 国产在线观看精品一区二区三区| 97视频在线播放| 97久久超碰福利国产精品…| 国产国语videosex另类| 国产欧美一区二区三区久久人妖| 日韩在线观看免费高清| 国产有码一区二区| 国产偷亚洲偷欧美偷精品| 国产中文字幕91| 亚洲精品suv精品一区二区| 伊人久久精品视频| 精品久久久久久久久久久久| 国产精品午夜国产小视频| 欧美最顶级丰满的aⅴ艳星| 久久久在线视频| 亚洲 日韩 国产第一| 欧美精品videosex极品1| 欧美成人手机在线| 中文字幕亚洲一区在线观看| 亚洲精品久久视频| 欧美视频二区36p| 欧美大片在线看免费观看| 欧美成人自拍视频| 日韩69视频在线观看| 亚洲精品综合久久中文字幕| 日韩欧美精品免费在线| 色综合色综合网色综合| 欧美日韩在线一区| 黑人与娇小精品av专区| 国产精品久久二区| 欧美在线视频免费观看| 精品美女国产在线| 日本成人免费在线| 2020欧美日韩在线视频| 久久成人免费视频| 午夜剧场成人观在线视频免费观看| 欧美国产日产韩国视频| 在线精品国产欧美| 亚洲一区二区三区成人在线视频精品| 亚洲欧美日韩国产成人| 欧美在线日韩在线| 国产免费一区视频观看免费| 久久精品国产91精品亚洲| 91久久嫩草影院一区二区| 久久久久久国产精品三级玉女聊斋| 久久全国免费视频| 国产精品88a∨| 久久久久久国产| 国产日韩av在线播放| 国产精品久久一区主播| 国产视频亚洲视频| 久久视频免费观看| 色一情一乱一区二区| 啪一啪鲁一鲁2019在线视频| 国产成人一区二区三区电影| 91香蕉嫩草神马影院在线观看| 欧洲成人免费aa| 成年无码av片在线| 日韩欧美国产高清91| 亚洲r级在线观看| 成人欧美一区二区三区在线| 日本一区二三区好的精华液| 51色欧美片视频在线观看| 91免费看片网站| 欧美性高跟鞋xxxxhd| 精品无人区太爽高潮在线播放| 日韩69视频在线观看| 波霸ol色综合久久| 日韩禁在线播放| 日韩在线欧美在线| 欧美激情视频在线免费观看 欧美视频免费一| 久久亚洲精品中文字幕冲田杏梨| 国产性猛交xxxx免费看久久| 91在线观看免费高清| 97热在线精品视频在线观看| 亚洲最大成人免费视频| 中文字幕亚洲欧美在线| 久久男人的天堂| 色无极亚洲影院| 国产精品h片在线播放| 日韩国产一区三区| 欧美激情视频在线观看| 日韩在线观看免费网站| 欧美天堂在线观看| 日韩精品电影网| 久久精品99久久久久久久久| 亚洲成人av在线播放| 亚洲大胆人体视频| 国产精品一区二区性色av| 国产精品久久久91| 3344国产精品免费看| 青青a在线精品免费观看| 欧美三级免费观看| 欧美午夜片欧美片在线观看| 精品国产1区2区| 亚洲欧美一区二区三区四区| 日韩av在线影视| 欧美又大又硬又粗bbbbb| 欧美色道久久88综合亚洲精品| 欧美精品一二区| 懂色av影视一区二区三区| 久久久精品免费视频| 日韩精品视频免费在线观看| 91久热免费在线视频| 欧美巨猛xxxx猛交黑人97人| 91精品国产综合久久香蕉922| 九九热精品视频在线播放| 国产精品入口免费视频一| 久久69精品久久久久久国产越南|