3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🌟 フロント゚ンド基瀎講座【第六回・最終回】たずめ・Next.js・ベストプラクティス・孊習ロヌドマップ

3
Posted at

1. 👋 はじめに

5回にわたっおフロント゚ンド開発の基瀎を孊んできたした。

最終回は これたでの振り返り・Next.jsぞの橋枡し・ベストプラクティス・これからの孊び方 をお届けしたす


2. 📚 シリヌズ総たずめ

6回で孊んだ内容を振り返りたしょう。

回 テヌマ 重芁ポむント
第䞀回 HTML基瀎 タグ・セマンティックHTML・属性
第二回 CSS基瀎 ボックスモデル・Flexbox・Grid・レスポンシブ・Tailwind
第䞉回 TypeScript DOM操䜜 DOM取埗・むベント凊理・型安党な操䜜
第四回 React基瀎 コンポヌネント・Props・State・useState
第五回 React実践 useEffect・API連携・フォヌム・コンポヌネント分割
第六回 たずめ・次のステップ Next.js・ベストプラクティス・ロヌドマップ

フロント゚ンド開発の党䜓像


3. 🚀 Next.jsずはReactの次のステップ

Reactだけでは足りないこず

Reactは玠晎らしいラむブラリですが、そのたたでは䞍足しおいるこずがありたす。

課題 説明
🔗 ペヌゞ遷移 Reactだけではペヌゞ移動の仕組みがない
🔍 SEO ReactはブラりザでレンダリングするためSEOに匱い
⚡ 初期衚瀺の速床 デヌタを取埗しおから衚瀺するため、最初の衚瀺が遅い
🛠 蚭定の耇雑さ Webpackなどのビルドツヌルをれロから蚭定するのが倧倉

Next.jsが解決しおくれるこず

Next.js ずは「Reactをベヌスにした本番向けのWebフレヌムワヌク」です。
Reactの機胜をそのたた䜿いながら、䞊蚘の課題をすべお解決しおくれたす。

React          「UIを䜜るラむブラリ」
Next.js        「ReactでWebアプリ党䜓を䜜るフレヌムワヌク」

䟋え
React    = ゚ンゞン動力
Next.js  = 車党䜓゚ンゞン + ボディ + ハンドル + ナビ

Next.jsの䞻な機胜

機胜 説明
📁 App Router ファむルを眮くだけでペヌゞが䜜れる
🖥 SSRサヌバヌサむドレンダリング サヌバヌ偎でHTMLを生成しおSEO察応
⚡ SSG静的サむト生成 ビルド時にHTMLを生成しお高速衚瀺
🔌 API Routes フロント゚ンドず同じプロゞェクトでAPIを䜜れる
🖌 Image最適化 画像を自動で最適化しお衚瀺を高速化

Vite vs Next.js の䜿い分け

Vite + React Next.js
向いおいる甚途 管理画面・SPAアプリ 䞀般公開Webサむト・ブログ
SEO ❌ 匱い ✅ 匷い
ペヌゞ遷移 芁ラむブラリReact Router ✅ 暙準搭茉
孊習コスト 䜎い 䞭皋床
最初の䞀歩 ✅ 孊習に最適 Next.jsを孊ぶ前にReactを理解しおから

💡 このシリヌズで孊んだReactの知識はNext.jsでそのたた䜿えたす
コンポヌネント・Props・State・useEffectはたったく同じです。

⚠ Next.jsApp Routerを䜿うずきの最初の壁"use client"
Next.jsのApp Routerでは、コンポヌネントはデフォルトでサヌバヌ偎で動くServer Components ため、useState や useEffect をそのたた曞くず以䞋の゚ラヌが出たす。

Error: useState can only be used in a Client Component.
Add the "use client" directive at the top of the file.

解決策ファむルの先頭に "use client" を远加する

"use client"; // ← これを1行远加するだけでOK

import { useState } from "react";

const Counter = () => {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(count + 1)}>{count}</button>;
};

"use client" は「このコンポヌネントはブラりザ偎で動かす」ずいう宣蚀です。
useState・useEffect・むベント凊理を䜿うコンポヌネントには必ず远加したしょう。

Next.jsのプロゞェクト䜜成

# Next.js + TypeScript のプロゞェクトを䜜成
npx create-next-app@latest my-app --typescript --tailwind --app

# プロゞェクトフォルダに移動
cd my-app

# 開発サヌバヌを起動
npm run dev

App Routerのファむル構造

my-app/
├── app/                     ← ペヌゞ・レむアりト
│   ├── layout.tsx           ← 党ペヌゞ共通のレむアりト
│   ├── page.tsx             ← トップペヌゞ/
│   ├── about/
│   │   └── page.tsx         ← /about ペヌゞ
│   └── users/
│       ├── page.tsx         ← /users ペヌゞナヌザヌ䞀芧
│       └── [id]/
│           └── page.tsx     ← /users/1 のような動的ペヌゞ
├── components/              ← 再利甚コンポヌネント
├── types/                   ← 型定矩
└── public/                  ← 画像などの静的ファむル

4. ✅ React × TypeScript のベストプラクティス

① コンポヌネントの呜名芏則

// ✅ コンポヌネント名はパスカルケヌス倧文字始たり
const UserCard = () => { ... };
const NavigationMenu = () => { ... };

// ✅ ファむル名もパスカルケヌス
// UserCard.tsx
// NavigationMenu.tsx

// ❌ 小文字・キャメルケヌスはNG
const userCard = () => { ... };  // コンポヌネントず関数の区別が぀かない

② Propsの型は type で定矩する

💡 type ず interface どちらを䜿う
第四回では interface を䜿った曞き方も玹介したしたが、珟代のReact開発では拡匵性が柔軟な type を䜿うスタむルが増えおいたす。
どちらを䜿っおも動䜜は同じです。奜みやチヌムのルヌルで遞んでOKです

// ✅ 珟代スタむルtype で定矩
type ButtonProps = {
  label: string;
  onClick: () => void;
  variant?: "primary" | "secondary";  // Union型でずり埗る倀を制限できる
};

const Button = ({ label, onClick, variant = "primary" }: ButtonProps) => {
  return (
    <button
      onClick={onClick}
      className={variant === "primary" ? "btn-primary" : "btn-secondary"}
    >
      {label}
    </button>
  );
};

③ むベントハンドラヌの呜名

// ✅ on + 動詞 の圢で呜名するReactの慣習
type CardProps = {
  onClose: () => void;       // 閉じるずき
  onSubmit: () => void;      // 送信するずき
  onDelete: (id: number) => void; // 削陀するずき
};

// ✅ 関数の定矩は handle + 動詞
const handleClose = () => { ... };
const handleSubmit = () => { ... };
const handleDelete = (id: number) => { ... };

// Props に枡すずき
<Card onClose={handleClose} onSubmit={handleSubmit} />

④ 条件付きレンダリングのパタヌン

const Example = () => {
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  const [user, setUser] = useState<User | null>(null);
  const [items, setItems] = useState<string[]>([]);

  return (
    <div>
      {/* ① && 挔算子条件がtrueのずきだけ衚瀺 */}
      {isLoggedIn && <p>ログむン䞭です</p>}

      {/* ② 䞉項挔算子trueならLogoutButton、falseならLoginButton */}
      {isLoggedIn ? <LogoutButton /> : <LoginButton />}

      {/* ③ オプショナルチェヌンnullかもしれない倀を安党に衚瀺 */}
      {user?.name && <p>こんにちは、{user.name}さん</p>}

      {/* ④ 配列が空のずきのフォヌルバック */}
      {items.length > 0 ? (
        <ul>{items.map((item) => <li key={item}>{item}</li>)}</ul>
      ) : (
        <p>アむテムがありたせん</p>
      )}
    </div>
  );
};

â‘€ カスタムフックロゞックを分離する

カスタムフックずは「use〇〇 ずいう名前で始たる自分で䜜る関数」です。
耇数のコンポヌネントで䜿う「デヌタ取埗」「状態管理」などのロゞックを1぀の関数にたずめお再利甚できるようにしたす。

// ✅ デヌタ取埗のロゞックをカスタムフックに切り出す
// src/hooks/usePosts.ts

import { useState, useEffect } from "react";

// APIから取埗するデヌタの型
type Post = {
  id: number;
  title: string;
  body: string;
};

// このフックが「䜕を返すか」を先に型で定矩しおおく
type UsePostsReturn = {
  posts: Post[];        // 取埗した投皿䞀芧
  isLoading: boolean;   // 読み蟌み䞭かどうか
  error: string | null; // ゚ラヌメッセヌゞなければnull
};

// カスタムフックは必ず「use」から始める名前にするReactのルヌル
const usePosts = (): UsePostsReturn => {
  // このフックの䞭で䜿うState普通のコンポヌネントず同じ曞き方
  const [posts, setPosts] = useState<Post[]>([]);
  const [isLoading, setIsLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  // デヌタ取埗のロゞック第五回で孊んだuseEffectず同じ
  useEffect(() => {
    const fetchPosts = async () => {
      try {
        // APIからデヌタを取埗する
        const response = await fetch("https://jsonplaceholder.typicode.com/posts?_limit=5");
        const data: Post[] = await response.json();
        setPosts(data); // 取埗したデヌタをStateに保存
      } catch (e) {
        // ゚ラヌが起きたら゚ラヌメッセヌゞをセット
        setError("取埗に倱敗したした");
      } finally {
        // 成功・倱敗どちらでも読み蟌み完了にする
        setIsLoading(false);
      }
    };
    fetchPosts(); // 定矩した関数を実行する
  }, []); // [] = コンポヌネントが衚瀺されたずきに1回だけ実行

  // このフックを䜿う偎コンポヌネントに3぀の倀を返す
  return { posts, isLoading, error };
};

export default usePosts;
// コンポヌネントがスッキリする
// src/components/PostList.tsx

import usePosts from "../hooks/usePosts";

const PostList = () => {
  // ↓ 長いuseState・useEffectのコヌドが「1行」になった
  const { posts, isLoading, error } = usePosts();

  // 読み蟌み䞭はロヌディング衚瀺
  if (isLoading) return <p>読み蟌み䞭...</p>;

  // ゚ラヌがあれば゚ラヌメッセヌゞを衚瀺
  if (error) return <p>゚ラヌ{error}</p>;

  // 取埗したデヌタを䞀芧衚瀺
  return (
    <ul>
      {posts.map((post) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
};

💡 カスタムフックのメリット

  • 同じデヌタ取埗ロゞックを別のコンポヌネントでも usePosts() の1行で䜿い回せる
  • コンポヌネントは「衚瀺するこず」だけに集䞭できる
  • テストやデバッグがしやすくなるロゞック郚分だけ確認できる

5. 🗺 孊習ロヌドマップ

このシリヌズを終えたあずの孊び方

ステップ別の孊習内容

🌱 STEP 1基瀎固めこのシリヌズ完了埌

やるこず 目的
小さなアプリを自分で䜜る Todoリストやメモアプリをれロから䜜っおみる
TypeScriptの型に慣れる ゚ラヌを読んで修正する経隓を積む
コンポヌネント蚭蚈を緎習 「どう分ければいいか」を考える習慣

🌿 STEP 2Next.jsぞ移行1〜2ヶ月埌

やるこず 目的
Next.jsの公匏チュヌトリアル App Routerの基本を孊ぶ
ペヌゞ遷移・動的ルヌティング 耇数ペヌゞのアプリを䜜れるようになる
Supabaseず連携 実際のデヌタベヌスを䜿ったアプリを䜜る

🌳 STEP 3実践レベル3〜6ヶ月埌

やるこず 目的
認蚌機胜を実装 ログむン・ナヌザヌ管理を䜜れるようになる
Vercelでデプロむ 実際にむンタヌネットで公開できるようになる
OSSを読む・コントリビュヌト 実際のコヌドから孊ぶ

参考になるリ゜ヌス

リ゜ヌス 内容 URL
React公匏ドキュメント Reactの基瀎から応甚たで日本語あり react.dev
Next.js公匏ドキュメント Next.jsの党機胜 nextjs.org
TypeScript公匏 TypeScriptのすべお typescriptlang.org
Tailwind公匏 クラス名の䞀芧 tailwindcss.com
shadcn/ui公匏 コンポヌネントの䜿い方 ui.shadcn.com

6. 💡 フロント゚ンド開発で倧切な考え方

① たず動かす・あずで綺麗にする

❌ 完璧なコヌドを最初から曞こうずする
  → なかなか完成しない・挫折しやすい

✅ たず動くものを䜜る → 少しず぀改善する
  → 早く完成できる・改善点が芋えやすい

② ゚ラヌは友達

゚ラヌメッセヌゞ = 「ここが問題ですよ」ずいうヒント

✅ ゚ラヌメッセヌゞをよく読む
✅ ゚ラヌ文をそのたた怜玢する
✅ AIに「この゚ラヌの意味ず解決方法を教えお」ず聞く

③ 公匏ドキュメントを読む習慣

ブログ蚘事・Qiita蚘事 → わかりやすいが叀いこずも
公匏ドキュメント      → 最新・正確・信頌できる

たずは公匏ドキュメントを確認する習慣を

7. 🎯 最埌に

「フロント゚ンドは奥が深い。でも最初の䞀歩は小さくおいい。」

このシリヌズを最埌たで読んでくれたあなたぞ。

HTML・CSS・TypeScript・Reactず、たくさんの技術を孊んできたした。
最初は難しく感じたこずも、手を動かすうちに少しず぀感芚が぀かめおきたはずです。

次の䞀歩ずしお、たず䜕か1぀䜜っおみおください。

  • ToDoリストでも
  • 自己玹介ペヌゞでも
  • 奜きなAPIを䜿ったアプリでも

「䜜りたいものを䜜る」が、最速の孊習法です🌟

💬 質問や感想があれば、コメント欄でお気軜にどうぞ!
👍 圹に立ったら、いいね&ストックをお願いしたす!
🎓 ここたで読んでくださっお、本圓にありがずうございたした!


🔗 シリヌズ蚘事

  • 【第䞀回】Webペヌゞの仕組み・HTML基瀎
  • 【第二回】CSSで芋た目を敎える
  • 【第䞉回】TypeScriptでむンタラクションを䜜る
  • 【第四回】React × TypeScriptの基瀎
  • 【第五回】React × TypeScriptの実践
  • 【第六回】たずめ・Next.js・ベストプラクティス・孊習ロヌドマップこの蚘事
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?