Preact プロジェクトを GitHub Pages にデプロイした

以前ちょっとだけ触った Preact。

Preact CLI で作ったプロジェクトをそのまま GitHub Pages にデプロイすると、ベースとなるパスがズレてしまうので、ルーティングが上手く動作しなかった。

どうしたらいいのかなーと調べていたところ、上手くコレを解決したサンプルプロジェクトを発見した。

内部実装を調べたところ、やっていることは大きく2つだった。

  1. 環境変数 GITHUB_PAGES と、baseroute.js というファイルを利用して、環境変数によってベースとなるディレクトリパスを定義している
    • 上の例でいくと /my-preact/ 部分を環境変数で注入している
    • ページリンクを実装する際は必ず baserouteimport して、${baseroute}/profile のようなリンクパスで記述している
    • GitHub Pages へのデプロイ時に実行するビルドコマンドの実行時のみ、環境変数を付与するようにしている (package.jsonnpm run build がそれ)
    • preact.config.js でもこの環境変数を元に調整している。ローカル開発時は余計なディレクトリパスが付与されないように工夫されている
  2. PWA 向けに manifest.json に記述されるパスを同様に書き換えておく
    • dot-json というパッケージを使って、GitHub Pages 向けビルド時に manifest.jsonstart_url を書き換えている

このプロジェクトの本質に的を絞って、より小さくまとめた Fork 版で、自分でも動作を検証してみた。

プロジェクト名を書き換えたが、上手く動いている。

ディレクトリパスを持っているのは package.jsonscripts.build 部分のみだ。preact.config.jsbaseroute.js などは、環境変数 GITHUB_PAGES を参照するだけなので、特に変更不要。

manifest.jsonnameshort_name などは任意で書き換えて良い (name 値が title 属性値に使われる)。start_url はビルド時に成果物ファイルの方を書き換えるので、src/manifest.json の記述は / のままで良い。

app.jsheader.js でどんな風にリンクを組み立てているかだけ確認してもらったら、あとは好きにプロジェクトを組んでもらって良い。npm run dev で開発サーバが起動してローカルで上手く動作するし、npm startserve パッケージを使ってビルドした資材をローカルで動かせる。いずれも環境変数 GITHUB_PAGES は渡されていないので、http://localhost:5000/ で正しく動く構成としてビルドされる。

GitHub Actions を用意してあり、npm run build (GitHub Pages 向けのビルドスクリプト) を実行して GitHub Pages にデプロイ出来るようにしてある。コレも Fork 元はちょっと古かったので、直しておいた。Secret の用意は不要である。

コレでとりあえず、Preact のルータが動くようになった。同様に Riot.js も GitHub Pages 上で動かしたいなーと思っているのだが、パス調整を参考にして頑張ってみるか。