1. 程式人生 > 其它 >JS檔案延遲和非同步載入:defer和async屬性

JS檔案延遲和非同步載入:defer和async屬性

—般情況下,在文件的 標籤中包含 JavaScript 指令碼,或者匯入的 JavaScript 檔案。這意味著必須等到全部 JavaScript 程式碼都被載入、解析和執行完以後,才能繼續解析後面的 HTML 部分。如果載入的 JavaScript 檔案很大, HTML 文件解析就容易出現延遲。

—般情況下,在文件的 <head> 標籤中包含JavaScript 指令碼,或者匯入的 JavaScript 檔案。這意味著必須等到全部 JavaScript 程式碼都被載入、解析和執行完以後,才能繼續解析後面的 HTML 部分。如果載入的 JavaScript 檔案很大, HTML 文件解析就容易出現延遲。

為了避免這個問題,在開發 Web 應用程式時,建議把匯入 JavaScript 檔案的操作放在 <body> 後面,讓瀏覽器先 將網頁內容解析並呈現出來後,再去載入 JavaScript 檔案,以便加快網頁響應速度。

延遲執行 JavaScript 檔案

<script> 標籤有一個布林型屬性defer

,設定該屬效能夠將 JavaScript 檔案延遲到頁面解析完畢後再執行。

示例

在下面示例中,外部檔案 test.js 包含的指令碼將延遲到瀏覽器解析完網頁之後再執行。瀏覽器先顯示網頁標題和段落文字,然後才彈出提示文字。如果不設定 defer 屬性,則執行順序是相反的。

test.html原始碼:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <script type="text/javascript" defer src="test.js"></script>
  6. </head>
  7. <body>
  8. <h1>網頁標題</h1>
  9. <p>正文內容</p>
  10. </body>
  11. </html>


test.js 原始碼:

  1. alert("外部檔案");


注意:defer 屬性適用於外部 JavaScript 檔案,不適用於 <script>籤包含的 JavaScript 指令碼。

非同步載入JavaScript檔案

在預設情況下,網頁都是同步載入外部 JavaScript 檔案的,如果 JavaScript 檔案比較大, 就會影響後面 HTML 程式碼的解析。上面提到一種解決方法:就是最後載入 JavaScript 檔案。

現在可以為 <script> 標籤設定async

屬性,讓瀏覽器非同步載入 JavaScript 檔案,即在載入 JavaScript 檔案時,瀏覽器不會暫停,而是繼續解析。這樣能節省時間,提升響應速度。

示例

如果為 <script> 標籤設定 async 屬性,然後在瀏覽器中預覽,則會看到網頁標題和段落文字同步,或者先顯示出來,然後同步彈出提示文字。如果不設定 async 屬性,則先彈出提示文字,然後才開始解析並顯示網頁標題和段落文字。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <script type="text/javascript" async src="test.js"></script>
  6. </head>
  7. <body>
  8. <h1>網頁標題</h1>
  9. <p>正文內容</p>
  10. </body>
  11. </html>


async 是 HTML5 新增的布林型屬性,通過設定 async 屬性,就不用考慮 <script> 標籤的放置位置,使用者可以根據習慣繼續把很多大型 JavaScript 庫檔案放在 <head> 標籤內。