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以下のようなページが表示されます。
![]() |
|---|
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 からデータを取得する場合、 LoaderFunction と useLaoderData を使います。LoaderFunction 内で PokéAPI を呼び出し、取得したデータを返します。コンポーネント内からは useLoaderData を介して取得したデータにアクセスできます。
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:deployhttps://{プロジェクト名}.pages.dev/pokemon/1000 にアクセスすると、サーフゴーが表示されます。
![]() |
|---|
こんなに簡単に SSR アプリを作成・デプロイできてしまうのは感動があります。

