AMP 運作方式
結合以下最佳化是 AMP 頁面如此快速,幾乎立即載入的原因。總共有 7 個原因 - 如果覺得閱讀量還是太大,可以直接觀看說明影片
非同步執行所有 AMP JavaScript
JavaScript 功能強大,幾乎可以修改頁面的各個方面,但也可能阻礙 DOM 建構並延遲頁面呈現 (另請參閱 使用 JavaScript 新增互動功能)。為了避免 JavaScript 延遲頁面呈現,AMP 只允許非同步 JavaScript。
AMP 元件底層可能會有 JavaScript,但它們都經過仔細設計,以確保不會造成效能降低。
雖然 amp-script
允許自訂 JS,且 iframe 允許第三方 JS,但它們都不能阻礙呈現。例如,如果第三方 JS 使用 對效能非常不利的 document.write
API,它也不會阻礙主頁面的呈現。
靜態調整所有資源大小
圖片、廣告或 iframe 等外部資源必須在 HTML 中宣告其大小,以便 AMP 可以在下載資源之前確定每個元素的大小和位置。AMP 會在不等待任何資源下載的情況下載入頁面佈局。
AMP 將文件佈局與資源佈局分離。只需一個 HTTP 請求即可佈局整個文件 (+字型)。由於 AMP 經過最佳化,可避免瀏覽器中昂貴的樣式重新計算和佈局,因此載入資源時不會有任何重新佈局。
不要讓擴充機制阻礙呈現
AMP 不允許擴充機制阻礙頁面呈現。AMP 支援 燈箱、Instagram 嵌入、推文 等擴充功能。雖然這些功能需要額外的 HTTP 請求,但這些請求不會阻礙頁面佈局和呈現。
任何使用自訂腳本的頁面都必須告訴 AMP 系統它最終會有一個自訂標籤。例如,amp-iframe
腳本會告訴系統將會有一個 amp-iframe
標籤。AMP 會在甚至不知道它將包含什麼內容之前就建立 iframe 框
<script async custom-element="amp-iframe" src="https://cdn.ampproject.org/v0/amp-iframe-0.1.js"></script>
將所有第三方 JavaScript 排除在關鍵路徑之外
第三方 JS 喜歡使用同步 JS 載入。它們也喜歡使用 document.write
載入更多同步腳本。例如,如果您的頁面上有五個廣告,而每個廣告都導致三個同步載入,每個載入都有 1 秒的延遲連線,那麼僅 JS 載入就需要 15 秒的載入時間。
AMP 頁面允許第三方 JavaScript,但僅限於沙箱化的 iframe 中。透過將它們限制在 iframe 中,它們無法阻礙主頁面的執行。即使它們觸發多次樣式重新計算,它們的小型 iframe 也只有非常小的 DOM。
執行樣式重新計算和佈局所需的時間受 DOM 大小限制,因此與重新計算頁面的樣式和佈局相比,iframe 重新計算速度非常快。
所有 CSS 都必須是內嵌且大小受限的
CSS 會阻礙所有呈現,它會阻礙頁面載入,而且往往會變得臃腫。在 AMP HTML 頁面中,僅允許內嵌樣式。與大多數網頁相比,這從關鍵呈現路徑中移除了 1 個或更多 HTTP 請求。
此外,內嵌樣式表的最大大小為 50 KB。雖然這個大小對於非常複雜的頁面來說已經足夠大,但它仍然要求頁面作者實踐良好的 CSS 衛生習慣。
字型觸發必須有效率
Web 字型非常大,因此 Web 字型最佳化 對於效能至關重要。在具有一些同步腳本和一些外部樣式表的典型頁面上,瀏覽器會等待並等待,直到所有這些都發生後才開始下載這些大型字型。
AMP 系統宣告在字型開始下載之前,HTTP 請求為零。這之所以可能,是因為 AMP 中的所有 JS 都具有 async 屬性,並且僅允許內嵌樣式表;沒有 HTTP 請求會阻礙瀏覽器下載字型。
盡量減少樣式重新計算
每次您測量某些內容時,都會觸發樣式重新計算,這非常昂貴,因為瀏覽器必須佈局整個頁面。在 AMP 頁面中,所有 DOM 讀取都發生在所有寫入之前。這確保每個影格最多只有一次樣式重新計算。
深入瞭解樣式和佈局重新計算對 呈現效能 的影響。
僅執行 GPU 加速動畫
擁有快速最佳化的唯一方法是在 GPU 上執行它們。GPU 知道圖層,它知道如何在這些圖層上執行某些操作,它可以移動它們、可以淡化它們,但它無法更新頁面佈局;它會將該任務交給瀏覽器,這並不好。
與動畫相關的 CSS 規則確保動畫可以進行 GPU 加速。具體來說,AMP 只允許對 transform 和 opacity 進行動畫和轉換,以便不需要頁面佈局。深入瞭解 使用 transform 和 opacity 進行動畫變更。
優先載入資源
AMP 控制所有資源下載:它會優先載入資源、僅載入需要的資源,並預先擷取延遲載入的資源。
當 AMP 下載資源時,它會最佳化下載,以便首先下載目前最重要的資源。圖片和廣告僅在它們可能被使用者看到、位於首頁上方,或使用者可能快速捲動到它們時才會下載。
AMP 也會預先擷取延遲載入的資源。資源會盡可能晚地載入,但會盡可能早地預先擷取。這樣可以讓載入速度非常快,但僅在資源實際顯示給使用者時才會使用 CPU。
立即載入頁面
新的 preconnect API 被大量使用,以確保 HTTP 請求在發出時盡可能快。透過這種方式,可以在使用者明確表示他們想要導航到頁面之前呈現頁面;當使用者實際選擇它時,頁面可能已經可用,從而實現即時載入。
雖然預先呈現可以應用於所有 Web 內容,但它也可能佔用大量頻寬和 CPU。AMP 經過最佳化,可減少這兩個因素。預先呈現僅下載首頁上方的資源,並且預先呈現不會呈現 CPU 密集型內容。
當 AMP 文件被預先呈現以實現即時載入時,實際上只會下載首頁上方的資源。當 AMP 文件被預先呈現以實現即時載入時,可能使用大量 CPU 的資源 (例如第三方 iframe) 不會被下載。