React Router SPA+HonoをCloudflare Workersで公開する
React RouterはSPAとし、APIにHonoを使い、Cloudflare Workersで公開できるサンプルを作った。
コードは以下にある。
React Router SPAを作成
公式サンプルはHono+ViteやReact Router SSRであり、ここから改造するよりはこれを参考にして、React Router SPAにCloudflareの設定をする方が簡単だと判断した。
React Router SPAの部分は別記事で作成したものをそのまま持ってきた。
hono-react-router-adapterを導入
どう連携するのかREADMEを読んだ段階ではわからなかったが、ちょっと試した結果、
- 開発環境は、React Routerが動いているところにviteプラグインの追加でHonoが動く
- 本番環境は、wranglerにReact Router serverとHonoを混ぜたサーバーを定義する
と理解した。
開発環境の設定
hono-react-router-adapterの使い方通りにserverAdapter
を追加する。これによってnpm run dev
で起動する開発サーバーからHonoも見えるようになる。
本番環境のデプロイ設定
まず、npm i -D wrangler @hono/vite-dev-server
をする(おそらくHonoに慣れているユーザーには自明すぎるため、hono-react-router-adapterのREADMEには書かれていない)。
hono-react-router-adapterのCloudflare Workersの手順に従って、vite.config.ts
にadapter
を追加をする。追加することでCloudflare仕様の環境変数定義.dev.vars
が利用できる。
worker.ts
は作成しない。React RouterはSPAモードであり、build/server
以下にコードを生成しないためだ。サーバーはHonoを直接指定することになる(後述)。
最後にwrangler.jsonc
を作成する。公式はtoml推しっぽく見えるが、npm create cloudflare
で確認したHonoやReact Routerのサンプルはjsoncであったため、jsoncを採用した。
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "react-router-hono",
"compatibility_date": "2025-04-04",
"main": "./server/index.ts",
"assets": {
"directory": "./build/client/",
"not_found_handling": "single-page-application",
},
}
重要なのは以下の三点。
-
main
の起動するサーバーにHonoのパスを指定する -
assets
のdirectory
にReact Routerのclient生成先のパスを指定する -
assets
のnot_found_handling
をindex.htmlがfallbackされるSPA仕様にする
これでnpm run build && wrangler deploy
でデプロイできる。Cloudflareのサンプルにあるwrangler dev
を使うとローカルでも動作を確認できる。
あとがき
公式にあるサンプルは(多分)全てSSRが有効なため作った。SPAを置きたいというのはレアケースなのかもしれない。
Discussion