Next.jsの始め方 — お店のページと、クリックできるボタンを作ろう
画面、API、ボタンの役割を分ける
- App Routerのお店ページ
- Clientの数えるボタン
- 固定商品API
- ビルドと公開の区別
まず、新しいお店のページを作る
Reactの基礎と、サポート中のNode.js LTS、npmを用意します。Next.jsの最低要件はNode.js 20.9以上ですが、テンプレート・依存の条件も確認します。この例はNode.js 24で確認しました。
新しいフォルダーを作る例です。長いコマンドは一行で実行します。Cache Componentsなどの高度な設定を最初の練習には加えません。
npx create-next-app@latest next-shop-demo --typescript --app --no-tailwind --no-src-dir --no-linter --no-react-compiler --no-cache-components --use-npm --yes
cd next-shop-demo
app/shop/page.tsxを作ります。
import Counter from './counter';
export default function Shop() {
return (
<main>
<h1>ひよこのお店</h1>
<p>りんごは200円です。</p>
<Counter />
</main>
);
}
app/shop/counter.tsxを作ります。
'use client';
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
{count}回押しました
</button>
);
}
npm run devを実行し、端末に出たURLの/shopを開きます。お店の見出しと、押すたびに数が増えるボタンが出れば成功です。
商品APIも一つ作る
app/api/product/route.tsを作ります。
export function GET() {
return Response.json({
name: 'りんご',
price: 200,
});
}
同じサーバーの/api/productを開き、JSONを確認します。今回は固定の商品で、DB、ログイン、外部APIを使いません。
ファイルと役割を整理する
次のファイルは、すべてapp/の下です。
| ファイル | 役割 |
|---|---|
| shop/page.tsx | /shopの画面 |
| shop/counter.tsx | 状態とクリックの処理 |
| api/product/route.ts | /api/productの応答 |
| layout.tsx | 共通のレイアウト |
Server ComponentとClient Componentは、サーバーという機械と利用者の端末を単純に二分する名前ではありません。最初のHTMLの表示と、ブラウザーでの操作を区別して読むと理解しやすくなります。
ビルドと公開は別の段階
開発サーバーをCtrl+Cで止めてからnpm run buildを試します。Node.jsサーバーとして試す場合は、その後npm run startで起動し、端末のURLを確認します。終わったらCtrl+Cで止めます。
本番へ出す際は、公開先と利用機能を選びます。静的出力には機能の制限があり、サーバーで動くRoute Handlerなどを同じように使えるとは限りません。
もう少し詳しく:キャッシュと変更処理
fetchのキャッシュ、ルートの静的・動的生成、再検証は関連しますが同じものではありません。force-cacheだけをSSGの指定だと覚えず、Next.jsの版とCache Componentsの設定をそろえて確認します。
注文を保存する機能へ広げるなら、Server ActionsやRoute Handlerでも、入力検証と認証・認可が必要です。サーバーで動くことだけで権限が正しく守られるわけではありません。
ペンギン先生のまとめ
「Next.js」って出てきたら「Reactの画面に、ページの道筋やサーバー側の処理を加える枠組み」と思えばだいたいOK! まずお店の画面、ボタン、商品APIの役割を説明してみよう。
参考資料
- Next.js:導入 — OS・Node要件と導入
- Next.js:create-next-app — 設定フラグ
- Next.js:Server/Client — 境界と初回の事前描画
- Next.js:Route Handlers — route.tsとURL
- Next.js:fetch — キャッシュとルート生成の区別
- Next.js:公開 — 静的出力の制限とbuild/start
- Next.js:データの安全性 — Actionsの認証・認可