introduction
Too Long, Didn’t Read
[slug].tsx
で getStaticPaths
などを使った dynamic route と、Hybrid AMP を併用することは現状難しいことが判明した。色々考えた結果、https://oriverk.dev の方はコードの自由度を保つため、AMP 技術を組み込まないことにした。その他の playground や趣味ブログで使っていきたい。
AMP(Accelerated Mobile Pages)
Google と Twitter による開発のキャッシュ等によるモバイル表示の高速化技術。AMP Websites, Stories, Ads, Email の 4 つがあり、検索ページでは AMP 対応サイトは雷⚡アイコンが表示される。今回は AMP Websites を利用する。
reference: amp.dev - AMP HTML 仕様
Next.js と AMP
Next.js は AMP に対応していて、AMP のみの生成と AMP と従来の HTML ページの生成を制御できる。export const config = { amp: true }
または ‘hybrid’としておけば、amp コンポーネント用の script などの記述が自動で挿入される。
AMP First Page
- nextjs と react client side のランタイムを持たない
- amp optimizer で自動最適化
- ユーザー用の最適化済みページと、検索エンジン用のインデックス可能な非最適化ページを生成
Hybrid AMP Page
- 従来の HTML ページと AMP ページが生成される
- AMP ページは amp-optimizer により最適化されているため、検索エンジンによるインデックスが可能
なお、amp-only と hybrid の 2 つのモードの区別には、useAmp()
という React Hooks が用いられる。前者の時は true
を、後者の時は false
を返す。
Main
修正する必要がある箇所
_document.jsx
内の gtag の変更
- image の取り扱い
- amp モード時は
amp-img
を使用する必要がある
- swipeable な side-bar
- サイト内検索用の algolia
onclick
で開閉するアイコンリンク群
setup amp-validator
google web store - AMP Validator を使用する。
modify components for amp
style amp-custom
css ライブラリには styled-jsx
を使ってます。非 amp の時の様に <style jsx>{ amp-img { width: 100%; } }</style>
の様に書けば、自動的に <style amp-custom>
に変換される。
amp.d.ts
AMPはtypescript用の組込型が無い ので、自分で amp.d.ts
を作る必要がある。実際に <amp-img>
とすると Property 'amp-img' does not exist on type 'JSX.IntrinsicElements'.
と出る。
custom types の追加には stack overflow を参照する様にと Next.js 公式ドキュメントにある。
取り敢えず、amp-image を対応してみる。
amp-img
以前に画像最適化した際 に使った next-optimized-images
を今回も併用した。
また fallback にはエラー回避のために、空文字を渡しておいた。これは Reactの仕様に起因 していて、React issue#9230 が一番参考になった。これによる Next.js 側の issue だと、#8861、#10000、#12708 がある。attribute が違うだけで、原因は全部同じようだ。
amp-image-lightbox
画像ポップアップの lightbox。amp-image-lightbox を書き加え、amp-img に on 属性などを書き足すだけで動く。また id さえ合致して置けば、1 ページに 1 つの amp-image-lightbox で動く。
amp-image-slider
中央のスライダーを動かして、画像を比較できる。個人的には Photoshop での画像修正のビフォーアフターを見せる箇所の奴。画像ラベルには通常の div 要素にはない属性を必要とし、.d.ts で拡張することにした。
amp-carousel
amp-carousel も実際に触ってみたが、controls や autoplay、loop に空文字を渡せるように.d.ts に定義する以外は真新しいものは無かったので割愛。ただ、amp-carousel
に指定できる属性が多く、属性だけで見た目や動作などを大きく変えられるので、弄って遊ぶだけでも面白かった。
others
[TOC]
Last
References
amp 化する際に、読んだり参考にしたもの。