AMP OptimizerによるAMPのさらなる最適化
以前、 Optimize your hosted AMP pages - amp.dev を読みながらAMPの最適化を行いました。
AMPページの最適化〜ぼくのAMPサイトがこんなに遅い訳がない〜 - SIS Lab
今回は、さらに一歩進みAMP Optimizer
によるAMPの最適化を試してみました。結果は、Web Core Vital
の1つであるLargest Content Full Paint
を40%改善できました。
対応した内容と結果をまとめています。
AMP Optimizerとは
AMP Optimizer is a tool to simplify creating AMP pages and improve AMP rendering performance. AMP Optimizer implements AMP performance best practices and supports AMP server-side-rendering.
amp-toolbox/packages/optimizer at master · ampproject/amp-toolbox
AMP Optimizer
は、AMPページ作成を簡素化し、AMPのレンダリングパフォーマンスを改善するツールです。AMPのパフォーマンスに関するベストプラクティスが実装されており、AMP SSR(サーバーサイドレンダリング)
もサポートしています。
デフォルトで次の最適化を実施します。
- AMPレイアウトのサーバーサイド・レンダリング
- 不足するAMPコンポーネントスクリプトの自動インポート
- 不足する必須AMPタグの自動追加
- amp-img, amp-iframe, amp-video, or amp-video-iframeからhero画像の自動検出とプリロード
- (可能であれば)AMP Boilerplateの削除
- 不要な空白の削除
- CSS keyframe animationsを抽出しページ下部へ移動
- AMPフレームワークとカスタムフォント読込の最適化
- インライン化されたamp-scriptコードのCSPを生成
AMP SSR(サーバーサイドレンダリング)とは
AMPはWeb Component framework
であり、AMPの独自タグ(amp-*)を有効化するためにクライアント側で処理を行なっています。
たとえば、AMPページが表示されるまでにクライアント側では次のプロセスが実行されます。
- AMP BoilerplateがAMPページを隠す
- AMP JavaScriptをロードする
- AMP CSSを挿入する
AMP SSR
を行うことで、上記のプロセスを省略または最適化を行うことができます。
2017年と少し古い情報ですが、下記記事中のスライド写真が参考になります。
Google、さらなる高速化を目指してSSRのAMPを開発中 | 海外SEO情報ブログ
AMP Optimizerによる最適化(AMP SSR)の効果
AMP Optimizer
を利用し、AMPのSSRを実行するメリットは次のとおりです。
- AMP Runtime JavaScriptを実行せずにAMPドキュメントを描画でき、AMP Boilerplateが削除される
- AMP Boilerplateが無くなることで、AMPページ読み込み時のドキュメント非表示の時間が短縮される
なぜ、AMP Boilerplate
の削除がページ表示時間の改善に繋がるのか。
AMP Boilerplate
のコードは、AMPの独自タグが有効化され、ページレイアウトが確定するまでAMPドキュメントを非表示にします。
AMP SSR
によって、事前にページレイアウトを確定することで、AMP Boilerplate
によるページ隠蔽が不要となります。
AMP SSRは、サーバー上でAMPボイラープレートコードを取り除いてページレイアウトをレンダリングすることによって動作します。AMP ボイラープレートコードが存在しているのは、ページの読み込み時にコンテンツの位置が突然変化しないようにするためです。AMPフレームワークがダウンロードされてページのレイアウトが確定するまでの間、ページのコンテンツは隠蔽されます。その結果、AMP ページでは他のクライアントサイド フレームワークと同じ問題が発生することになります。つまり、Javascript がダウンロードされるまでレンダリングがブロックされます。
Google Developers Japan: オリジンで AMP を高速化する: AMP + SSR = ⚡
ところで、AMP Validなページを作るためにはAMP Boilerplate
が必須ですが、AMP Optimizer
による最適化で生成されたページはAMP Validとなるのでしょうか。
Google Developers Japan: オリジンで AMP を高速化する: AMP + SSR = ⚡ によると次の説明があり、有効なAMPとして扱われるようです。
- AMP Optimizerを利用した最適化を行なったページには以下のように
transformed="self;v=1"
が付与される - この属性が設定されているとAMP検証ツールは、SSRを適用した有効なAMPとして扱う
<html amp transformed="self;v=1">
対応内容
対応内容としては、公式ドキュメントのサンプルコードを参考にし、gulp
でAMP Optimizer
を実行します。
私のブログはHugoを利用しており、生成物はpublic
ディレクトリに配置されるため、そのHTMLファイルを上書きする形で実行します。
gulpによるAMP Optimizerの実行
const {src, dest} = require('gulp');
const through2 = require('through2');
const AmpOptimizer = require('@ampproject/toolbox-optimizer');
const ampOptimizer = AmpOptimizer.create();
function build(cb) {
return src('public/**/*.html')
.pipe(
through2.obj(async (file, _, cb) => {
if (file.isBuffer()) {
const optimizedHtml = await ampOptimizer.transformHtml(
file.contents.toString()
);
file.contents = Buffer.from(optimizedHtml);
}
cb(null, file);
})
)
.pipe(dest('public/'));
}
exports.default = build;
GitHub Actionでの実行
上記gulpスクリプトをGitHub Action
で実行しています。
jobs:
deploy:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
with:
submodules: true # Fetch Hugo themes
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: '0.74.3'
- name: Setup package.json
run: npm install
- name: Run API server
run: npm run serve:prod
- name: Build
run: hugo --gc
+ - name: Optimize AMP
+ run: npx gulp
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./public
WebPageTestによる測定結果
通常のAMP
指標 | 結果(秒) |
---|---|
First Contentful Paint | 1.996 |
Speed index | 11.954 |
Largest Content Full Paint | 14.345 |
AMP Packer実行
指標 | 結果(秒) |
---|---|
First Contentful Paint | 7.882 |
Speed index | 9.137 |
Largest Content Full Paint | 9.532 |
AMP Optimizer実行
指標 | 結果(秒) |
---|---|
First Contentful Paint | 2.082 |
Speed index | 7.111 |
Largest Content Full Paint | 9.131 |
AMP Optimizer x Google Ad Manager
指標 | 結果(秒) |
---|---|
First Contentful Paint | 2.198 |
Speed index | 6.849 |
Largest Content Full Paint | 8.598 |
まとめ
- AMP OptimizerのAMP SSRを利用して、
Web Core Vital
の1つであるLargest Content Full Paint
を40%改善できた - AMP利用のベストプラクティスは昔から公開されているにも関わらずキャッチアップできていなかったため、AMP利用する際は公式ドキュメントの読み込みが必要
参考
- 詳解 AMP Optimizer - Qiita
- Google Developers Japan: AMP をさらに高速化する方法
- How to make AMP even faster – The AMP Blog
- Google Developers Japan: 新しい AMP Optimizer で楽々 AMP 開発
- Google Developers Japan: オリジンで AMP を高速化する: AMP + SSR = ⚡
- AMPを「高速化技術」「一瞬で表示する技術」というのはもうやめよう。|榊原昌彦|note
- PageSpeed Insights
- WebPageTest - Website Performance and Optimization Test
Related contents
TECH
2020.08.15
TECH
2019.10.11
TECH
2019.10.06
TECH
2020.11.01
TECH
2020.04.10
TECH
2020.03.31
TECH
2020.03.13
TECH
2020.02.02