Preact プロジェクトを GitHub Pages にデプロイした
以前ちょっとだけ触った Preact。
Preact CLI で作ったプロジェクトをそのまま GitHub Pages にデプロイすると、ベースとなるパスがズレてしまうので、ルーティングが上手く動作しなかった。
https://neos21.github.io/my-preact/
(例) でアクセスすると初期ページは表示されるhttps://neos21.github.io/my-preact/second-page
に遷移しようとすると…https://neos21.github.io/second-page
という URL に解釈されてしまい (/my-preact/
部分が欠落する)、正常に動作しない
どうしたらいいのかなーと調べていたところ、上手くコレを解決したサンプルプロジェクトを発見した。
- flameddd/preact-github-actions-to-github-pages: This is a DEMO how to use github actions deploy Preactjs to github pages
- preact-github-actions-to-github-pages
内部実装を調べたところ、やっていることは大きく2つだった。
- 環境変数
GITHUB_PAGES
と、baseroute.js
というファイルを利用して、環境変数によってベースとなるディレクトリパスを定義している- 上の例でいくと
/my-preact/
部分を環境変数で注入している - ページリンクを実装する際は必ず
baseroute
をimport
して、${baseroute}/profile
のようなリンクパスで記述している - GitHub Pages へのデプロイ時に実行するビルドコマンドの実行時のみ、環境変数を付与するようにしている (
package.json
のnpm run build
がそれ) preact.config.js
でもこの環境変数を元に調整している。ローカル開発時は余計なディレクトリパスが付与されないように工夫されている
- 上の例でいくと
- PWA 向けに
manifest.json
に記述されるパスを同様に書き換えておく- dot-json というパッケージを使って、GitHub Pages 向けビルド時に
manifest.json
のstart_url
を書き換えている
- dot-json というパッケージを使って、GitHub Pages 向けビルド時に
このプロジェクトの本質に的を絞って、より小さくまとめた Fork 版で、自分でも動作を検証してみた。
- Neos21/practice-preact-on-github-pages: It's a demo about how to use Github Actions to deploy a Preact.js website to Github Pages
- practice-preact-on-github-pages
プロジェクト名を書き換えたが、上手く動いている。
ディレクトリパスを持っているのは package.json
の scripts.build
部分のみだ。preact.config.js
や baseroute.js
などは、環境変数 GITHUB_PAGES
を参照するだけなので、特に変更不要。
manifest.json
の name
や short_name
などは任意で書き換えて良い (name
値が title
属性値に使われる)。start_url
はビルド時に成果物ファイルの方を書き換えるので、src/manifest.json
の記述は /
のままで良い。
app.js
や header.js
でどんな風にリンクを組み立てているかだけ確認してもらったら、あとは好きにプロジェクトを組んでもらって良い。npm run dev
で開発サーバが起動してローカルで上手く動作するし、npm start
は serve
パッケージを使ってビルドした資材をローカルで動かせる。いずれも環境変数 GITHUB_PAGES
は渡されていないので、http://localhost:5000/
で正しく動く構成としてビルドされる。
GitHub Actions を用意してあり、npm run build
(GitHub Pages 向けのビルドスクリプト) を実行して GitHub Pages にデプロイ出来るようにしてある。コレも Fork 元はちょっと古かったので、直しておいた。Secret の用意は不要である。
コレでとりあえず、Preact のルータが動くようになった。同様に Riot.js も GitHub Pages 上で動かしたいなーと思っているのだが、パス調整を参考にして頑張ってみるか。