1. 程式人生 > >初探谷歌AMP技術

初探谷歌AMP技術

參加完騰訊web前端大會後,對其中的AMP技術比較感興趣,遂花了點時間研究了一下,於是有了該篇文章

什麼是AMP?

AMP全稱Accelerated Mobile Pages,意為加速的移動頁面。Google將會免費把他們的網頁快取到Google自己的CDN中。 簡單的說 AMP就是快取…如果符合規則,您將可以使用其中的快取。

谷歌開發AMP初衷

廣告服務

Facebook開發Instant Article的目的是讓你在Facebook上就能看到其他網站上的內容,這個方向是非常正確。如果能夠在Facebook裡享受到比在其他瀏覽器更加快的載入速度的話,使用者又何必再去用別的應用來看呢。

谷歌似乎是認識到了來自於Facebook的這種威脅——通過Instant Article,Facebook完全可以過濾掉Google的廣告服務。於是Google迅速動手開發了AMP專案,其目的實際上就是為了增強它在移動廣告服務領域的市場。至於為什麼電腦使用者被拋棄掉了,那是因為谷歌已經掌握把廣告推送給你的能力了。

AMP特點

  • AMP的HTML是標準HTML的子集,限制了部分標籤的使用
  • CSS程式碼也簡化,而且要寫在HTML中,不能呼叫外部CSS檔案
  • 所有js檔案必須是非同步載入的
  • 不允許自定義js指令碼
  • 資源控制,比如圖片、視訊等使用者下拉到圖片時再載入
  • 高度快取,Google將頁面快取在自己伺服器了
  • 根據Google給出的資料,目前所有的AMP頁面的開啟速度都低於1秒,少於1s是符合使用者心理預期的.大於1s後多延遲1s會流失20%的使用者

AMP技術組成

AMP HTML

下面是一些在寫AMP HTML時需注意的:

  • 如果 a 標籤的 href 屬性以 javascript: 開頭,則 target 屬性必須設定為 _blank,否則不被允許。
  • 內部樣式表必須包含amp-custom 如<style amp-custom>
  • 不可使用!important樣式,AMP Runtime需要擁有對元素樣式的最終決定權
  • 某些選擇器因為效能問題而被禁用,如(*) 和 (:not)

AMP JS

AMP Cache

  • AMP Cache是基於CDN,它會自動抓取AMP HTML頁面,並自動快取,以提高頁面的效能,並且所有JS檔案和圖片使用HTTP2.0。簡單的說,只要大家按照AMP的規範寫AMP頁面,就能夠被收錄到AMP Cache中。
  • AMP Cache還帶有一個驗證系統,以確保頁面正常工作,而且不依賴於外部資源。該驗證系統還執行一系列的斷言確保頁面符合AMP HTML規範

AMP適用於哪些場合?

由於AMP HTML對頁面做了許多限制和約束,所以AMP主要用於提高靜態頁面的效能,這個靜態也不是指無服務端參與的頁面,而是指沒有複雜互動、以展示內容為主的頁面,比如無評論功能的部落格、新聞詳情頁面等等

解析一個AMP檔案

<!-- 必須為 doctype html -->
    <!DOCTYPE html>
    <!-- 方便其他程式能識別出該頁面為AMP HTML  ⚡ 也可換為amp-->
    <html ⚡>
      <head>
        <meta charset="utf-8">
        <!-- AMP Runtime 該js需翻牆 -->
        <script async src="https://cdn.ampproject.org/v0.js"></script>
        <!-- 用於指定該頁面普通版本的url,如果只有一個版本,使用當前url即可 -->
        <link rel="canonical" href="my-non-amp.html">
        <!-- 在普通頁面版本中 href需指定為amp頁面的url -->
        <!-- <link rel="amphtml" href="my-amp.html"> -->
        <!-- 必須包含viewport -->
        <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
        <!-- 樣板程式碼 start -->
        <style amp-boilerplate>
        body{
          -webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;
          -moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;
          -ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;
          animation:-amp-start 8s steps(1,end) 0s 1 normal both;
        }
        @-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}
        @-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}
        @-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}
        @-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}
        @keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}
        </style>
        <noscript>
          <style amp-boilerplate>
            body{
                -webkit-animation:none;
                -moz-animation:none;
                -ms-animation:none;
                animation:none;
            }
          </style>
        </noscript>
        <!-- 樣板程式碼 end -->
        <!-- 內部樣式表(不超過50KB)必須包含 amp-custom屬性 -->
        <style amp-custom>
          h1{
            color: #6cf;
          }
          .test{
            border: 1px solid red;
            width: 60%;
            margin: 0 auto;
          }
        </style>
        <title></title>
      </head>
      <body>
        <h1>demo</h1>
        <div class="test">
          <amp-img src="./img/a.png" width="400" height="300" alt="" layout="responsive">
        </div>
      </body>
    </html>

樣板程式碼是為了確保頁面在被渲染完畢前不可見(透明度為0)
早先的樣板程式碼如下:

    <style>
      body {
        opacity: 0
      }
    </style>

    <noscript>
      <style>
        body {
          opacity: 1
        }
      </style>
    </noscript>

這種樣板程式碼,如果AMP Runtime載入失敗,技術上是不可能讓頁面的透明度從0變為1,為了避免這種情況,現在的模板已經做了修改

    <style amp-boilerplate>
      body{
        -webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;
        -moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;
        -ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;
        animation:-amp-start 8s steps(1,end) 0s 1 normal both;
      }
      @-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}
      @-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}
      @-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}
      @-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}
      @keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}
    </style>
    <noscript>
      <style amp-boilerplate>
        body{
          -webkit-animation:none;
          -moz-animation:none;
          -ms-animation:none;
          animation:none;
        }
      </style>
    </noscript>

AMP上線前驗證

體驗地址

不管我在PC的移動端模式還是手機上,搜尋出來的結果並沒有帶AMP標記的網頁,感到比較奇怪。

補充

AMP技術可以極大提高網站載入速度,但這只是影響搜尋排名的中的一個因素,使用AMP並不能大幅提升你在搜尋結果中的排名