天天看點

Async、defer以及普通加載script差別詳解

如果用一張圖檔诠釋這幾種script加載的特點,應該是這樣的:

Async、defer以及普通加載script差別詳解

結合圖檔我們可以将三種方式的特點總結如下:

index.html:

<!DOCTYPE html>
<html lang="en">

<head>
  <script>
    console.time('timer');
    console.timeLog('timer', '--- Start parsing HTML');
    document.addEventListener('DOMContentLoaded', function () {
      console.timeLog('timer', '--- Document loaded');
    });
  </script>
</head>

<body>
  <p>
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Explicabo harum velit itaque assumenda, quibusdam
    obcaecati suscipit quasi odit accusantium soluta qui, debitis quae iusto? Nobis ratione ut nesciunt a minima.
  </p>
  <!-- 此處省略500行重複元素 -->
  <script>console.timeLog('timer', '--- Start loading 1.js')</script>
  <script src='./1.js'></script>
  <script>console.timeLog('timer', '--- Start loading 2.js')</script>
  <script src='./2.js'></script>
  <script>console.timeLog('timer', '--- Start loading 3.js')</script>
  <script src='./3.js'></script>
  <!-- 此處省略1500行重複元素 -->
   <p>
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Explicabo harum velit itaque assumenda, quibusdam
    obcaecati suscipit quasi odit accusantium soluta qui, debitis quae iusto? Nobis ratione ut nesciunt a minima.
  </p>
  <script>
    console.timeLog('timer', '--- End parsing HTML')
  </script>
</body>

</html>           

1.js:

const text1 = `
  // 超長文本
`

text1.split(' ');
console.timeLog('timer', '--- 1.js excuted');           

2.js:

const text2 = `
  // 超長文本
`

text2.split(' ');
console.timeLog('timer', '--- 2.js excuted');           

3.js:

const text3 = `
  // 超長文本
`

text3.split(' ');
console.timeLog('timer', '--- 3.js excuted');           

我們分别使用普通、async和defer的方式加載1.js、2.js、3.js,觀察控制台的列印結果:

普通結論:script出現會中斷HTML加載,且script會順序的加載、執行,所有script執行完成後再解析HTML。

Async 結論:HTML解析和script下載下傳同步進行,script執行會中斷HTML解析;script執行順序和tag出現順序不一定相同;script可能會在document loaded之後執行。

Defer 結論:HTML解析和script下載下傳同步進行;script會在HTML解析完成後和document loaded之前執行,且執行順序和tag出現順序一緻。

由以上實驗可知:如果使用普通方式時通常建議将script放到

的最後,以免阻塞HTML解析影響網頁打開速度。而defer相對于async更具優勢,不會阻塞HTML解析且script的執行順序可以預測,有一些需要預先下載下傳執行的script可以使用defer的方式在中引用。

如果你想開發小程式或者了解更多小程式的内容,可以通過第三方專業開發平台,來幫助你實作開發需求:

廈門在乎科技

-專注

廈門小程式開發公司

、app開發、網站開發、H5小遊戲開發