預先載入模組

Sérgio Gomes

模組式開發在可快取性方面帶來一些實際優勢 有助於減少 您要運送給使用者的位元組數。 程式碼越精細,也有助於載入故事 以便優先處理應用程式中的重要程式碼

然而,模組依附元件會造成載入問題,因為瀏覽器需要 等模組載入後才發現其依附元件為何。單程 您只要預先載入依附元件,瀏覽器就能知道 並保持連線忙碌狀態。

<link rel="preload">敬上 可讓您透過宣告式要求資源 以便瀏覽器需要這些圖片

<head>
  <link rel="preload" as="style" href="critical-styles.css">
  <link rel="preload" as="font" crossorigin type="font/woff2" href="myfont.woff2">
</head>

瀏覽器支援

  • Chrome:50。
  • 邊緣:≤79。
  • Firefox:85。
  • Safari:11.1.

資料來源

這個方式特別適合用在經常隱藏的字型等資源上 但有時有幾個層級會很深在這種情況下,瀏覽器 我們就必須等多次往返行程 在可能利用該時間開始下載時,擷取大型字型檔案 並善用完整的連線頻寬。

<link rel="preload"> 及其對應的 HTTP 標頭都提供簡單的宣告式 可讓瀏覽器立即瞭解需要的重要檔案 只要在目前導覽中就能查看這些元件當瀏覽器看到預先載入網頁時,會先 優先下載資源,到了實際需要時 或部分參數但不適用於模組。

這一切都變得不容易您可以運用多種憑證模式 但為了在快取中找到成功 擷取資源兩次不用說,重複擷取是糟糕的做法,因為 浪費使用者的頻寬並讓他們因無理由地等候。

針對 <script><link> 標記,您可以使用 crossorigin 設定憑證模式 屬性。然而,結果發現 <script type="module"> 沒有 crossorigin 屬性表示 omit 的憑證模式,但不存在 <link rel="preload">。這代表你必須 將 <script><link> 中的 crossorigin 屬性變更為一 而且如果只是為了執行 嘗試預先載入是其他模組的依附元件。

此外,擷取檔案只是實際執行程式碼的第一步。 首先,瀏覽器必須剖析及編譯。理想情況下 這應該也會提前執行,這樣在需要模組時,程式碼就會是 準備執行不過,V8 (Chrome 的 JavaScript 引擎) 會剖析並編譯模組 與其他 JavaScript 不同<link rel="preload"> 並未 能以任何方式指出載入的檔案是模組,因此所有瀏覽器 就是載入檔案並將其放到快取中使用 <script type="module"> 標記 (或由其他模組載入),瀏覽器會剖析 並將程式碼編譯為 JavaScript 模組。

簡單來說,沒錯。只要讓預先載入模組專用的 link 類型, 編寫簡單的 HTML 程式碼,不必擔心所使用的憑證模式。 維持預設運作狀態

<head>
  <link rel="modulepreload" href="super-critical-stuff.mjs">
</head>
[...]
<script type="module" src="super-critical-stuff.mjs">

由於瀏覽器現在知道您要預先載入的內容是模組,因此可以聰明 擷取完畢後,盡快剖析及編譯並編譯,不必等待 直到解碼器執行為止

瀏覽器支援

  • Chrome:66.
  • 邊緣:≤79。
  • Firefox:115。
  • Safari:17。

資料來源

但關於「模組」依附元件?

你應該問個真好!真正的確是這篇文章無法涵蓋的事情:週期性。

<link rel="modulepreload"> 規格實際上允許選擇性載入 要求的模組,但所有依附元件樹狀結構。瀏覽器 但他們可以

那麼,哪一個跨瀏覽器解決方案最適合預先載入模組及其相關資訊 因為您需要完整的依附元件樹狀結構才能執行應用程式?

選擇以遞迴方式預先載入依附元件的瀏覽器應具備強大的簡化功能 因此一般而言,最佳做法是宣告模組和平面清單 並信任瀏覽器不要重複擷取相同的模組。

<head>
  <!-- dog.js imports dog-head.js, which in turn imports
       dog-head-mouth.js, which imports dog-head-mouth-tongue.js. -->
  <link rel="modulepreload" href="dog-head-mouth-tongue.mjs">
  <link rel="modulepreload" href="dog-head-mouth.mjs">
  <link rel="modulepreload" href="dog-head.mjs">
  <link rel="modulepreload" href="dog.mjs">
</head>

預先載入模組是否有助於效能?

預先載入功能可讓瀏覽器瞭解 需要擷取內容,以免在很長的往返途中停下來。 如果您為了實驗模組,但因為非常深的因素而發生效能問題 依附元件樹狀結構,建立預先載入的平面清單一定很有幫助。

儘管如此,模組效能仍在開發中,因此請務必 使用開發人員工具來仔細瞭解應用程式的運作情形 可以考慮將應用程式分為多個區塊有很多 我們持續在 Chrome 開發模組,因此我們將針對 讓他們好好休息!