介紹async 和 defer的使用
在HTML中,<script>
標簽用于嵌入或引用JavaScript代碼。async
和defer
都是<script>
標簽的屬性,用于改變腳本的加載和執(zhí)行方式,以優(yōu)化頁面加載性能。
async屬性
定義:async
屬性表示異步地加載腳本。當瀏覽器遇到帶有async
屬性的<script>
標簽時,它會并行下載腳本,而不阻塞HTML文檔的解析。
行為:當腳本下載完成后,瀏覽器會暫停文檔的解析,執(zhí)行這個腳本,然后再繼續(xù)HTML文檔的解析。
使用場景:適用于那些與頁面其余部分相互獨立的腳本,比如廣告加載和數(shù)據追蹤腳本。因為async
腳本不保證按照指定的順序執(zhí)行,所以不適用于相互依賴的腳本。
defer屬性
定義:defer
屬性表示在文檔解析和顯示完成后,再延遲執(zhí)行腳本。
行為:帶有defer
屬性的腳本將被并行下載,但不會阻斷文檔的解析。這些腳本直到整個頁面都解析完成后,才會按照它們在文檔中出現(xiàn)的順序執(zhí)行。
使用場景:適用于那些需要等待DOM樹構建完成后才能執(zhí)行的腳本,比如操作DOM的腳本。defer
腳本保證了執(zhí)行順序,適用于有依賴關系的腳本。
async與defer的區(qū)別
使用示例
<!-- 異步加載腳本,不保證執(zhí)行順序 -->
<script async src="script1.js"></script>
<script async src="script2.js"></script>
<!-- 延遲執(zhí)行腳本,保證按照出現(xiàn)順序執(zhí)行 -->
<script defer src="script1.js"></script>
<script defer src="script2.js"></script>
在實際開發(fā)中,根據腳本的功能和依賴關系選擇使用async
或defer
,可以在不阻塞頁面渲染的同時,優(yōu)化用戶體驗。
如果用JS創(chuàng)建的script標簽,想創(chuàng)建一個async的script,應該怎么寫呢?
在JavaScript中動態(tài)創(chuàng)建并插入一個具有async
屬性的<script>
標簽,可以按照以下步驟進行:
使用document.createElement()
方法創(chuàng)建一個新的<script>
元素。
設置這個新創(chuàng)建的<script>
元素的src
屬性,指定需要加載的腳本URL。
設置async
屬性為true
,使其異步加載。
將這個<script>
元素添加到文檔中,通常是添加到<head>
或<body>
元素中。
以下是具體的代碼示例:
// 創(chuàng)建一個新的script元素
var script = document.createElement('script');
// 設置script元素的src屬性
script.src = 'https://example.com/some-script.js';
// 將async屬性設置為true
script.async = true;
// 將script元素添加到文檔的<head>部分
document.head.appendChild(script);
這段代碼將創(chuàng)建一個新的<script>
元素,將其src
屬性設置為指定的腳本URL,并通過設置async
屬性為true
來實現(xiàn)異步加載。最后,這個<script>
元素被添加到文檔的<head>
部分,從而開始異步加載并執(zhí)行指定的JavaScript文件。
通過這種方式動態(tài)添加的<script>
標簽,其行為與在HTML中直接使用<script async src="...">
標簽相同,即不會阻塞頁面的解析和渲染,提高了頁面加載的性能。
作者:Struggle_zhu
鏈接:https://juejin.cn/post/7362080157191651354
來源:稀土掘金
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。
該文章在 2024/4/28 10:25:37 編輯過