Remix on Cloudflare Pages で SSRの練習

Icon

70_10

Cloudflare Pages 上に Remix で SSR アプリケーションを作成します。
GET /pokemon/{図鑑番号} にアクセスすると、ポケモンの名前と画像が表示されるという簡単なページの作成を目指します。

Cloudflare が用意しているドキュメントを参考に進めます。

1. プロジェクトの作成

プロジェクトを作成します。 Cloudflare が用意しているプロジェクトテンプレートを使います。

npm create cloudflare@latest remix-ssr-sample-app -- --framework=remix

プロジェクトが作成できたら、まずはローカル実行してみます。

cd remix-ssr-sample-app
npm run dev

以下のようなページが表示されます。

Hello World

2. 最初のデプロイ

npm run pages:deploy

デプロイが正しくできるとデプロイ完了後に表示される URL からアクセスできます。URL は https://{プロジェクト名}.pages.dev という形式になります。
プロジェクト名がそのままサブドメインになります。すでに同じ名前のものが存在する場合は、別名になると思われます。

メモ :
デプロイ直後にアクセスしても、すぐにはページが表示されませんでした。
何分か経過してからようやくアクセスできるようになりました。SSG とは違い、SSR はデプロイ反映に少し時間がかかるようです。

3. PokéAPI を使ったページの作成

https://pokeapi.co/api/v2/pokemon/{ずかん番号 or ポケモンの英語名} でポケモンのデータを取得できます。
ピカチュウのデータを取得する場合は、GET /api/v2/pokemon/25 もしくは GET /api/v2/pokemon/pikachu です。

Remix で API からデータを取得する場合、 LoaderFunctionuseLaoderData を使います。
LoaderFunction 内で PokéAPI を呼び出し、取得したデータを返します。コンポーネント内からは useLoaderData を介して取得したデータにアクセスできます。

./app/routes/pokemon.$id.tsx
import { LoaderFunction, json } from "@remix-run/cloudflare";
import { useLoaderData } from "@remix-run/react";

interface Pokemon {
  name: string;
  sprites: {
    front_default: string;
  };
}

export const loader: LoaderFunction = async ({ params }) => {
  const res = await fetch(`https://pokeapi.co/api/v2/pokemon/${params.id}`);

  if (!res.ok) {
    throw new Error("Failed to fetch pokemon");
  }

  const data = await res.json<Pokemon>();

  return json(data);
};

export default function PokemonPage() {
  const pokemon = useLoaderData<Pokemon>();

  return (
    <div>
      <h1>{pokemon.name}</h1>
      <img
        src={pokemon.sprites.front_default}
        alt={`Sprite of ${pokemon.name}`}
      />
    </div>
  );
}

4. デプロイ

再度デプロイします。

npm run pages:deploy

https://{プロジェクト名}.pages.dev/pokemon/1000 にアクセスすると、サーフゴーが表示されます。

alt text

こんなに簡単に SSR アプリを作成・デプロイできてしまうのは感動があります。