模組式開發在可快取性方面帶來一些實際優勢 有助於減少 您要運送給使用者的位元組數。 程式碼越精細,也有助於載入故事 以便優先處理應用程式中的重要程式碼
然而,模組依附元件會造成載入問題,因為瀏覽器需要 等模組載入後才發現其依附元件為何。單程 您只要預先載入依附元件,瀏覽器就能知道 並保持連線忙碌狀態。
<link rel="preload">
<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>
這個方式特別適合用在經常隱藏的字型等資源上 但有時有幾個層級會很深在這種情況下,瀏覽器 我們就必須等多次往返行程 在可能利用該時間開始下載時,擷取大型字型檔案 並善用完整的連線頻寬。
<link rel="preload">
及其對應的 HTTP 標頭都提供簡單的宣告式
可讓瀏覽器立即瞭解需要的重要檔案
只要在目前導覽中就能查看這些元件當瀏覽器看到預先載入網頁時,會先
優先下載資源,到了實際需要時
或部分參數但不適用於模組。
為什麼 <link rel="preload">
不適用於模組?
這一切都變得不容易您可以運用多種憑證模式 但為了在快取中找到成功 擷取資源兩次不用說,重複擷取是糟糕的做法,因為 浪費使用者的頻寬並讓他們因無理由地等候。
針對 <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 rel="modulepreload">
只有模組的 <link rel="preload">
嗎?
簡單來說,沒錯。只要讓預先載入模組專用的 link
類型,
編寫簡單的 HTML 程式碼,不必擔心所使用的憑證模式。
維持預設運作狀態
<head>
<link rel="modulepreload" href="super-critical-stuff.mjs">
</head>
[...]
<script type="module" src="super-critical-stuff.mjs">
由於瀏覽器現在知道您要預先載入的內容是模組,因此可以聰明 擷取完畢後,盡快剖析及編譯並編譯,不必等待 直到解碼器執行為止
但關於「模組」依附元件?
你應該問個真好!真正的確是這篇文章無法涵蓋的事情:週期性。
<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 開發模組,因此我們將針對 讓他們好好休息!