Next.jsで作ったブログをAMPとPWAに対応させる
TL;DR
Next.jsのPWA対応というとnext-offlineとかnext-pwaが有名かと思います。しかし、AMPページのキャッシュはこれらがデフォルトで対応していないので、自前でやる必要があります(参考issue)。自分はこの2つのパッケージを使って色々やってて永遠にPWA対応できなかったので、AMPと同時に対応しようとしている人は注意が必要です。
とはいえ、やることはほとんどexample/amp-firstをコピペするだけなのですが...。
publicフォルダの準備
manifest.json
まず、manifest.jsonを用意します。何で用意してもいいですが、必要なものとして以下が挙げられます(参考)。iconとか用意するのはめんどうなので、PWA manifest generatorを使いました。
start_urlnameorshortnameicons(192 - 512 px)display
また、このiconはmaskableである必要があるので、Maskable.app Editorで変換した後、"purpose": "any maskable"をiconのプロパティに足します。
とりあえずこのサイトのmanifest.jsonは以下のような感じです。
manifest.json
apple touch icon
ここを見てもらったほうが早いですが、PWA対応したいページのヘッダーに
を加えておきます。アイコンのサイズは192x192か180x180である必要があります。
serviceworker.js
examples/amp-first/public/serviceworker.jsをコピペしてpublicに置きます。たぶん、だいたいamp-swです。
serviceworker.js
serviceworkerのregister
examples/amp-first/public/install-serviceworker.htmlをコピペしてpublicに置きます。
install-serviceworker.html
PWA対応したいページでserviceworkerをインストールする
ampではserviceworkerのインストールはamp-install-serviceworkerで行えます。
PWA対応したいコンポーネントのbodyに以下を入れます。
offlineページの作成
これよくわかってないので後で調べるかもしれませんが、amp-firstの例ではofflineページが準備されています。コピペして置いておきましょう。serviceworkerのofflinePageOptionなんでしょう。
offline.js
結果
以上でPWA対応は完了です。当サイトtopの2020/09/30現在のlighthouse performanceです。

ちなみにWordpress時代はこんなんなので、非常に成長していると言えるでしょう。all 100は難しいですね...。
