六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

script標簽中的async與defer用法

[摘要]script標簽用于加載腳本與執行腳本,在前端開發中可以說是非常重要的標簽了。直接使用script腳本的話,html會按照順序來加載并執行腳本,在腳本加載&執行的過程中,會阻塞后續的DOM渲染,F在大家習慣于在頁面中引用各種的第三方腳本,如果第三方服務商出現了一些小問題,比如延遲之類的,就...

script標簽用于加載腳本與執行腳本,在前端開發中可以說是非常重要的標簽了。
直接使用script腳本的話,html會按照順序來加載并執行腳本,在腳本加載&執行的過程中,會阻塞后續的DOM渲染。

現在大家習慣于在頁面中引用各種的第三方腳本,如果第三方服務商出現了一些小問題,比如延遲之類的,就會使得頁面白屏。
好在script提供了兩種方式來解決上述問題,asyncdefer,這兩個屬性使得script都不會阻塞DOM的渲染。
但既然會存在兩個屬性,那么就說明,這兩個屬性之間肯定是有差異的。

defer

如果script標簽設置了該屬性,則瀏覽器會異步的下載該文件并且不會影響到后續DOM的渲染;
如果有多個設置了deferscript標簽存在,則會按照順序執行所有的script;
defer腳本會在文檔渲染完畢后,DOMContentLoaded事件調用前執行。

我們做了一個測試頁面,頁面中包含了兩個script標簽的加載,給他們都加上defer標識。
P.S. 為了更直觀,我們給script1.js添加了1s的延遲,給script2.js添加了2s的延遲。
image
下圖是頁面加載的過程&script腳本的輸出順序。
不難看出,雖然script1加載用時雖然比script2短,但因為defer的限制,所以Ta只能等前邊的腳本執行完畢后才能執行。
image
image

async

async的設置,會使得script腳本異步的加載并在允許的情況下執行
async的執行,并不會按著script在頁面中的順序來執行,而是誰先加載完誰執行。

我們修改測試頁面如下:
image
遂得到了如下的結果,頁面加載時長上,并沒有什么變化,畢竟都是異步加載的腳本。
但是我們可以看到一個小細節,DOMContentLoaded事件的觸發并不受async腳本加載的影響,在腳本加載完之前,就已經觸發了DOMContentLoaded。
image
image
image
image

我們接著修改測試頁面。加載一個沒有延遲的script腳本,使得腳本可以即時的加載完畢。
我們要測試一下,如果async腳本加載的足夠快,是否會在DOMContentLoaded之前就執行(這個實驗是基于對async的描述“在允許的情況下執行”的論證)。
同時為了保證測試的穩定性,我們在script腳本引入的后邊添加了數千個空的p節點,用來延長文檔的渲染時間。
image
執行結果不出所料,如果給async一定的時間,是有可能在DOMContentLoaded事件之前就執行的。
image
P.S. 從上圖中左上角的火焰圖中,我們也能看到,出現了多段的藍色(更新:晚上寫的時候懵了,紫色的才是渲染,藍色的是解析)文檔渲染。以及下邊Console的順序。
說明的確,async的執行是加載完成就會去執行,而不像defer那樣要等待所有的腳本加載完后按照順序執行。

畫幾張圖簡要說明

網上有了不少這種類似的圖,但是基本都是拿一個script就舉例的
未免太過寒酸,so咱們來一個豪華版,來畫一下多個腳本加載時的甘特圖
就像近年來各大手機廠商,出新機都喜歡來一個X+X plus

拿四個不同的顏色來標明各自代表的含義
image

普通script

文檔解析的過程中,如果遇到script腳本,就會停止頁面的渲染進行下載(但是并不會影響后續的解析,解析和渲染是兩碼事兒)。
資源的下載是在解析過程中進行的,雖說script1腳本會很快的加載完畢,但是他前邊的script2并沒有加載&執行,所以他只能處于一個掛起的狀態,等待script2執行完畢后再執行。
當這兩個腳本都執行完畢后,才會繼續渲染頁面。
image

defer

文檔解析時,遇到設置了defer的腳本,就會在后臺進行下載,但是并不會阻止文檔的渲染,當頁面解析&渲染完畢后。
會等到所有的defer腳本加載完畢并按照順序執行,執行完畢后會觸發DOMContentLoaded事件。
image

async

async腳本會在加載完畢后執行。
async腳本的加載不計入DOMContentLoaded事件統計,也就是說下圖兩種情況都是有可能發生的

image
image

推薦的應用場景

defer

如果你的腳本代碼依賴于頁面中的DOM元素(文檔是否渲染完畢),或者被其他腳本文件依賴。
例:

  1. 評論框

  2. 代碼語法高亮

  3. polyfill.js

async

如果你的腳本并不關心頁面中的DOM元素(文檔是否渲染完畢),并且也不會產生其他腳本需要的數據

以上就是script標簽中的async和defer用法的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。




主站蜘蛛池模板: 亚洲男男在线 | 青娱乐在线免费视频 | 婷婷激情五月网 | 日韩中文字幕网 | 伊人精品久久久大香线蕉99 | 三级黄色在线播放 | 婷婷综合在线观看丁香 | 中文成人在线视频 | 日本卡一卡2卡3卡4精品卡无人区 | 在线观看亚洲网站 | 日本韩国欧美三级 | 天堂中文资源在线地址 | 伊人久久大香线蕉综合影 | 手机在线成人精品视频网 | 日韩经典欧美一区二区三区 | 综合 欧美 亚洲日本 | 色无极在线观看 | 一区小说二区另类小说三区图 | 日本视频高清 | 日韩1页| 日本乱码一卡二卡三卡永久 | 色播欧美| 日韩小视频在线播放 | 欧美一级久久久久久久大片 | 最近更新免费中文字幕大全 | 欧美一级美片在线观看免费 | 日本一卡2卡3卡四卡精品 | 中文学幕专区 | 日日干干夜夜 | 在线免费观看韩国a视频 | 最新中文字幕免费视频 | 日韩a在线观看免费观看 | 日本高清www视频在线观看 | 亚洲最新在线视频 | 日韩中文字幕在线观看 | 日日人人 | 五月婷婷导航 | 性生生活三级视频观看 | 人人做人人看 | 一级黄色片免费播放 | 日韩成人在线观看视频 |