最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

script標(biāo)簽的異步加載async、defer、type="module"全面解析

 更新時(shí)間:2026年03月08日 15:31:00   作者:FarmerLiusun  
script標(biāo)簽用來(lái)在網(wǎng)頁(yè)中執(zhí)行JavaScript,它可以直接包含JavaScript代碼,也可以直接通過(guò)src指向一個(gè)同域或者不同域的外鏈,這篇文章主要介紹了script標(biāo)簽異步加載async、defer、type="module"的相關(guān)資料,需要的朋友可以參考下

本文主要是分享一下,關(guān)于加載script多種方式及區(qū)別

  • 1.同步加載:<script src="index.js"></script>
  • 2.defer 異步加載:<script defer src="index.js"></script>
  • 3.async 異步加載:<script async src="index.js"></script>
  • 4.module 異步加載:<script type="module" src="index.js"></script>
  • 5.module async 異步加載:<script type="module" src="index.js" async></script>

眾農(nóng)周知,瀏覽器解析html時(shí),如果遇到使用 <script src="index.js"></script> 加載js時(shí),html的解析會(huì)被阻塞,這個(gè)時(shí)候會(huì)先去下載index.js,等待下載完并執(zhí)行完js之后,然后再繼續(xù)解析html。這樣的話,如果js下載時(shí)間過(guò)長(zhǎng),無(wú)疑會(huì)增加頁(yè)面的渲染時(shí)間,那么,有沒有啥辦法可以讓解析html與下載js并行執(zhí)行呢?有的,并且提供了多種。

1.五種加載方式深度解析

1.1 同步加載<script src="index.js"></script>

特點(diǎn)

  • 阻塞解析html
  • 須等加載完js并執(zhí)行完之后才能繼續(xù)解析html
  • 增加首屏渲染時(shí)間

不推薦使用

適用場(chǎng)景

  1. 傳統(tǒng)的加載script方式,需要兼容低版本瀏覽器
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- 同步加載且阻塞解析html -->
   <script src="index.js"></script>
  </head>
  <body>
  </body>
</html>

1.2 異步加載,使用defer屬性

特點(diǎn)

  • 并行下載js
  • 不阻塞解析html,解析html與下載并行
  • 在html解析完成后,DOMContentLoaded事件觸發(fā)前執(zhí)行
  • 多個(gè)script時(shí),異步加載,按順序執(zhí)行

適用場(chǎng)景

  1. 加載的js存在依賴關(guān)系,須按順序執(zhí)行
  2. 加載的js需要操作DOM
  3. 常見vue、react項(xiàng)目中,構(gòu)建工具已自動(dòng)處理,編譯后自動(dòng)添加defer屬性
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link rel="icon" href="/test/favicon.ico" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  />
    <title>xxxxx管理系統(tǒng)</title>
    
    <!-- 異步加載,優(yōu)先執(zhí)行第三方依賴 -->
    <script defer="defer" src="/test/js/chunk-vendors.0821bbb1.js"></script>
    <!-- 異步加載,上面的js執(zhí)行完再執(zhí)行 -->
    <script defer="defer" src="/test/js/app.566a7ad5.js"></script>
    
    <link href="/test/css/chunk-vendors.ff7db5f3.css" rel="external nofollow"  rel="stylesheet" />
    <link href="/test/css/app.0d1bd94e.css" rel="external nofollow"  rel="stylesheet" />
  </head>

  <body>
    <noscript
      ><strong
        >System doesn't work properly without JavaScript enabled. Please enable
        it to continue.</strong
      ></noscript
    >
    <div id="app"></div>
  </body>
</html>

1.3 異步加載,使用async屬性

特點(diǎn)

  • 并行下載js
  • 下載階段,不阻塞解析html,解析html與下載并行
  • 下載完成后馬上執(zhí)行
  • 多個(gè)script時(shí),異步加載,誰(shuí)先下載完誰(shuí)就執(zhí)行
  • 可能阻塞解析html,如果解析html完成前就已經(jīng)下載完了,那就會(huì)執(zhí)行js,阻塞解析html
  • 可能會(huì)阻塞 DOMContentLoaded 事件的觸發(fā)時(shí)機(jī)

    當(dāng)js在 DOMContentLoaded 事件觸發(fā)前完成下載并執(zhí)行,就會(huì)延長(zhǎng) DOMContentLoaded的觸發(fā)時(shí)間,js的執(zhí)行會(huì)阻塞主線程,執(zhí)行完才會(huì)觸發(fā) DOMContentLoaded事件

適用場(chǎng)景

  1. 加載的js沒有賴關(guān)系,單獨(dú)執(zhí)行
  2. 加載的js無(wú)需操作DOM
  3. 常用于分析、廣告、埋點(diǎn)腳本加載
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link rel="icon" href="/test/favicon.ico" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  />
    <title>xxxxxx官網(wǎng)</title>
    
    <!-- 異步加載,獨(dú)立運(yùn)行,無(wú)腳本依賴 -->
    <script async src="https://www.guanggao.com/gg/js?id=GG_1"></script>
    <script async src="https://www.guanggao.com/gg/js?id=GG_2"></script>
  </head>

  <body>
    <noscript
      ><strong
        >System doesn't work properly without JavaScript enabled. Please enable
        it to continue.</strong
      ></noscript
    >
    <div id="app"></div>
  </body>
</html>

1.4 異步加載,使用type="module"屬性

特點(diǎn)與defer差不多

  • 不阻塞解析html,解析html與下載并行
  • 在html解析完成后,DOMContentLoaded事件觸發(fā)前執(zhí)行
  • 多個(gè)script時(shí),異步加載,按順序執(zhí)行
  • defer主要差異是,使用esm模塊化,且默認(rèn)開啟嚴(yán)格模式

適用場(chǎng)景 與defer差不多

  1. 加載的js存在依賴關(guān)系,須按順序執(zhí)行
  2. 加載的js需要操作DOM
  3. 使用esm開發(fā)的腳本
  4. 常見使用vite構(gòu)建的vue、react項(xiàng)目中,編譯后自動(dòng)添加type="module"屬性
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link rel="icon" href="/test/favicon.ico" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  />
    <title>xxxxxx系統(tǒng)</title>
    
    <!-- 異步加載,使用esm開發(fā) -->
    <script type="module" crossorigin src="/assets/index-BmxZ5FsG.js"></script>
  </head>

  <body>
    <noscript
      ><strong
        >System doesn't work properly without JavaScript enabled. Please enable
        it to continue.</strong
      ></noscript
    >
    <div id="app"></div>
  </body>
</html>

1.5 異步加載,使用type="module" async屬性

特點(diǎn)與async差不多

  • 并行下載js
  • 下載階段,不阻塞解析html,解析html與下載并行
  • 下載完成后馬上執(zhí)行
  • 多個(gè)script時(shí),異步加載,誰(shuí)先下載完誰(shuí)就執(zhí)行
  • 可能阻塞解析html,如果解析html完成前就已經(jīng)下載完了,那就會(huì)執(zhí)行js,阻塞解析html
  • 可能會(huì)阻塞 DOMContentLoaded 事件的觸發(fā)時(shí)機(jī)

    當(dāng)js在 DOMContentLoaded 事件觸發(fā)前完成下載并執(zhí)行,就會(huì)延長(zhǎng) DOMContentLoaded的觸發(fā)時(shí)間,js的執(zhí)行會(huì)阻塞主線程,執(zhí)行完才會(huì)觸發(fā) DOMContentLoaded事件

  • 與async主要差異是,使用esm模塊化,且默認(rèn)開啟嚴(yán)格模式``

適用場(chǎng)景 與async差不多

  1. 加載的js沒有賴關(guān)系,單獨(dú)執(zhí)行
  2. 加載的js無(wú)需操作DOM
  3. 常用于分析、廣告、埋點(diǎn)腳本加載
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link rel="icon" href="/test/favicon.ico" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  />
    <title>xxxxxx官網(wǎng)</title>
    
    <!-- 異步加載,使用esm開發(fā),獨(dú)立運(yùn)行,無(wú)腳本依賴 -->
    <script type="module" async src="https://www.guanggao.com/gg/js?id=GG_1"></script>
  </head>

  <body>
    <noscript
      ><strong
        >System doesn't work properly without JavaScript enabled. Please enable
        it to continue.</strong
      ></noscript
    >
    <div id="app"></div>
  </body>
</html>

2.總結(jié)

2.1.加載script的5種方式:

  • 同步-阻塞解析html: <script>
  • 異步-不阻塞解析html-按順序執(zhí)行: <script defer>
  • 異步-不阻塞解析html-無(wú)序下載完立即執(zhí)行: <script async>
  • 異步-esm-不阻塞解析html-按順序執(zhí)行: <script type="module">
  • 異步-esm-不阻塞解析html-無(wú)序下載完立即執(zhí)行: <script type="module" async>

2.2.各方式差異:

加載方式執(zhí)行時(shí)機(jī)是否阻塞HTML解析執(zhí)行順序適用場(chǎng)景
<script>立即執(zhí)行文檔順序傳統(tǒng)腳本
<script defer>DOM解析后文檔順序依賴DOM的腳本
<script async>下載完成后下載不阻塞,執(zhí)行可能阻塞無(wú)序獨(dú)立第三方腳本
<script type="module">DOM解析后文檔順序ES模塊化代碼
<script type="module" async>下載完成后下載不阻塞,執(zhí)行可能阻塞無(wú)序獨(dú)立ES模塊

2.3.加載流程圖:

2.4.使用建議:

  • js使用非esm,優(yōu)先考慮使用 defer
  • js使用esm,優(yōu)先考慮使用 type="module"

 總結(jié)

到此這篇關(guān)于script標(biāo)簽的異步加載async、defer、type="module"的文章就介紹到這了,更多相關(guān)script標(biāo)簽的異步加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

衡水市| 陵川县| 郁南县| 马龙县| 青河县| 永寿县| 秦安县| 和政县| 乐业县| 灵武市| 苏州市| 英山县| 贵德县| 定西市| 延寿县| 聊城市| 喀什市| 黄大仙区| 辽阳市| 凯里市| 连平县| 中卫市| 潜江市| 抚顺市| 麻阳| 綦江县| 滁州市| 桂阳县| 宁波市| 扬中市| 泗阳县| 饶河县| 噶尔县| 犍为县| 沙河市| 成武县| 弥勒县| 峨眉山市| 长白| 雷州市| 垦利县|