Next.js + React + TypeScript：技術質問50選考えてみた

こでは、Next.js・React・TypeScript の組み合わせに関する 50の質問と回答 をまとめています。

**1. Next.js と Create React App (CRA) の違いは何ですか？**

回答：

Create React App はクライアントサイドレンダリング(CSR)をベースとしたReactプロジェクトの雛形。

Next.js はSSRやSSG、ルーティングなどを標準搭載しているフレームワーク。

**2. Next.js でのルーティングはどのように行いますか？**

回答：

pagesディレクトリやappディレクトリ（App Router）を使ったファイルベースのルーティング。

指定したフォルダ構成に従ってURLパスが自動的に設定される。

**3. Server Components と Client Components の違いは何ですか？**

回答：

Server Components はサーバー上でデータを取得しつつ、ブラウザにHTMLを送る。

Client Components はブラウザ上で動作し、useStateなどのReact Hooksが使える。

Next.js 13以降で混在できるようになり、パフォーマンスと開発者体験の両立を図れる。

**4. TypeScript を導入するメリットとデメリットは何ですか？**

回答：

メリット：型定義によりバグを未然に防ぎ、コード補完が強力になる。

デメリット：設定が少し複雑になる、型定義をしないといけないので最初の導入コストがある。

**5. use client; は何のために使われますか？**

回答：

Next.js 13のApp Routerで、コンポーネントをクライアントコンポーネントとして扱う宣言。

これを記述することで、ブラウザ側での処理（Hooksやイベントハンドラなど）が可能になる。

**6. Next.js でデータフェッチングをする方法には何がありますか？**

回答：

getStaticProps / getServerSideProps (pagesディレクトリ)

appディレクトリでは、Server Components 内で直接 fetch、あるいは Route Handlers を利用。

Client Components からは、API Routeなどにリクエストを送る形で実行。

**7. App Router と Pages Router の主な違いは何ですか？

回答：

Pages Routerは従来のNext.jsのルーティング。

App RouterはNext.js 13で導入された新しいルーティングシステムで、Server ComponentsとClient Componentsを柔軟に使える。

**8. Next.jsで環境変数を使う場合の注意点は？**

回答：

環境変数を呼び出すときは process.env を使用。

NEXT_PUBLIC_ で始まる変数はクライアントサイドにも露出されるため、機密情報は含めない。

**9. Incremental Static Regeneration (ISR) とは何ですか？**

回答：

ビルド後に特定のページだけを再生成できる機能。

ページごとに再生成のタイミングを設定でき、静的生成と動的コンテンツの両立を可能にする。

**10. Next.js での画像最適化 (Imageコンポーネント) のメリットは何ですか？**

回答：

適切な形式への自動変換(WebPなど)やレスポンシブ対応で、ページのパフォーマンスを向上。

ブラウザサイズに合わせてサイズを自動調整する。

**11. TypeScript でReactコンポーネントのPropsを型定義するにはどうしたらいいですか？**

回答：

インターフェースやタイプエイリアスを定義し、React.FC<Props> または function ComponentName(props: Props): JSX.Element { ... } の形で使う。

**12. 型定義ファイル (d.ts) はどのように活用しますか？**

回答：

外部ライブラリの型を拡張したり、プロジェクト全体で使う共通型を定義したりする。

プロジェクト直下やsrc配下にglobal.d.tsなどを置いて管理。

**13. Next.js で Redux などの状態管理ライブラリを使いたい場合はどうしますか？**

回答：

ProviderコンポーネントをラップしたClient Componentを作り、その中でストアを提供する。

各ページやコンポーネントではReact Hooks (useSelector, useDispatch など)を使って状態を操作。

**14. Next.js でのAPIルート (pages/api) はどう機能しますか？**

回答：

サーバーレス関数としてデプロイされ、エンドポイントとして利用できる。

ユーザーがアクセスするとサーバー上で実行され、リクエストに応じてレスポンスを返す。

appディレクトリの場合はRoute Handlerが対応。

**15. getStaticProps と getServerSideProps の違いは何ですか？**

回答：

getStaticProps：ビルド時に実行され、静的に生成されたページを返す。

getServerSideProps：リクエストがあるたびにサーバー側でデータを取得し、ページを返す。

**16. Next.jsで多言語対応（i18n）を行うにはどうすればよいですか？**

回答：

next-i18next や next-intl などのライブラリを利用して国際化対応を行う。

App Router では各種i18nライブラリが対応し始めているのでそれらを参考に設定。

**17. パフォーマンス改善のためにできることは？**

回答：

コード分割や動的インポート(import("..."))を使い、必要なところだけ読み込む。

画像最適化や、キャッシュヘッダー設定でリソースを効率的に配信する。

ISRやSSGで静的化し、初回読み込みを高速化する。

**18. Next.js でカスタムサーバーを使うケースはどんなときですか？**

回答：

Expressなど既存のNode.jsサーバーと統合したい場合。

特殊なAPIルーティングやミドルウェアを使いたい場合。

**19. Next.js の <Head> コンポーネントと <title> タグはどう扱いますか？**

回答：

<Head> 内で <title> や <meta> タグを指定すると、ドキュメントヘッドが更新される。

appディレクトリの場合は metadata オブジェクトや Head.tsx を活用してメタデータを管理。

**20. "アウトオブザボックス"でできるSEOのメリットは？**

回答：

Next.js はSSR/SSGを活用することで、検索エンジンに最適なHTMLを返せる。

CSRのみのアプリよりもクローラに内容を認識してもらいやすい。

**21. next/link を使うメリットは？**

回答：

ルーティングが高速で、ページ間の移動がスムーズ。

<Link>タグで遷移先を指定するだけで、History APIを使ったスムーズな移動が実装できる。

**22. dynamic routes (動的ルート) はどのように使う？**

回答：

[id].tsxのようにファイル名をブラケットで囲むと、その部分をパラメータとして扱える。

useRouterフックや getStaticPaths などと組み合わせてIDごとのページを生成する。

**23. Next.js 13以降のLayout機能は何をする？**

回答：

ページ間で共通のレイアウトやUIを簡単に共有できる仕組み。

上位フォルダの layout.tsx 内で、ネストされるページの共通デザインやナビゲーションを定義。

**24. 簡易的なAPIであれば、どのようにデータをやり取りする？**

回答：

Pages Routerでは pages/api/ を使う。

App Routerでは Route Handler (app/route.ts) などを使う。

FetchやAxiosでエンドポイントを呼び出し、JSONなどでデータをやり取り。

**25. エラーや404ページはどう作成する？**

回答：

Pages Routerの場合は _error.js や 404.js を定義。

App Routerの場合は error.tsx や not-found.tsx を定義してハンドリング。

**26. SCSS や CSS Modules は使えますか？**

回答：

Next.js ではデフォルトでSCSSやCSS Modulesに対応している。

*.module.scss や *.module.css ファイルを用意してインポートするだけでOK。

**27. Tailwind CSS や Material-UI との組み合わせはどうですか？**

回答：

Tailwind CSS は公式ドキュメントに従って設定ファイルを用意すれば簡単に導入可能。

Material-UIなども同様に、通常のReactライブラリとしてインストールし利用可能。

**28. ビルドやデプロイの方法は？**

回答：

next build でビルド。

next start で本番サーバーを起動。

VercelやNetlify、AWSなど様々なホスティング環境で動作可能。

**29. Next.js をDockerコンテナで運用する場合のポイントは？**

回答：

Dockerfile内で npm install → npm run build → npm run start の手順を実行。

ポートや環境変数を適切に設定。

SSR機能があるので、多少のメモリとCPUリソースを考慮。

**30. バンドルサイズを最適化するには？**

回答：

next/dynamic を使い、必要なときだけコンポーネントを読み込む。

不要なライブラリを削除し、コンポーネントの分割を徹底する。

画像やフォントなどのアセットも最適化する。

**31. next/head と metadata オブジェクトの使い分けは？**

回答：

next/head は Pages Router や既存プロジェクトで主に利用し、任意のHead要素をJSXで記述できる。

App Router では metadata オブジェクトを使用して、メタデータやタイトルを宣言的に設定する方法が推奨される。

**32. Next.js アプリのパフォーマンスを測定するには？**

回答：

Google LighthouseやChrome DevToolsのパフォーマンスタブを使用。

さらにNext.js専用のツールやVercel Analyticsを利用するケースもある。

**33. Next.js で sass/scss を使うための設定は？**

回答：

yarn add sass または npm install sass で依存関係を追加すれば、そのまま .scss ファイルをインポートできる。

CSS Modulesは .module.scss という拡張子で使える。

**34. getInitialProps は今も使われるの？**

回答：

Pages Router では使用可能だが、推奨はされていない。

新規プロジェクトやApp Routerでは getStaticProps や getServerSideProps、Server Components のfetchなどを使う。

**35. React 18 の useTransition, useDeferredValue はNext.jsでも使える？**

回答：

もちろん使える。Client Components でReact 18の新機能として遅延レンダリングや低優先度レンダリングを実装できる。

**36. useCallback や useMemo はどのように使えばよい？**

回答：

コンポーネント内で定義した関数や値のメモ化を行い、不要な再レンダリングを防ぐ。

ただしむやみに使うと複雑になるため、パフォーマンスが重要な箇所で必要に応じて使う。

**37. Next.js と GraphQL を組み合わせる場合の一般的な構成は？**

回答：

Apollo Client や urql などのGraphQLクライアントをClient Componentで使う。

Server Side Rendering したい場合はページ単位でサーバー側からデータ取得を行うか、Route Handler と GraphQLサーバーの接続を検討。

**38. エラー境界 (Error Boundary) はどう扱う？**

回答：

Reactのクラスコンポーネントで実装するか、App Router では error.tsx ファイルでハンドリング可能。

ランタイムエラーに備えた設計が必要。

**39. next/script の活用例は？**

回答：

サードパーティのスクリプト（Google Analyticsなど）を読み込む際に使う。

strategy パラメータで読み込みタイミングを設定可能。

**40. SWR (stale-while-revalidate) を使うメリットは？**

回答：

クライアントサイドでキャッシュしつつ、バックグラウンドでデータを再検証できる。

リアルタイム性とパフォーマンスを両立。

**41. レスポンシブなデザインを実装するうえで気をつけることは？**

回答：

画像やコンポーネントの大きさが動的に変わるときは、Next.jsの <Image> やCSSのメディアクエリを活用。

Tailwind CSS 等を用いてブレークポイントを定義すると管理しやすい。

**42. Next.js アプリにログイン機能を実装するには？**

回答：

NextAuth.js や Auth0、Firebase Authentication などの外部サービスを利用。

JWTやCookieを使ってセッション管理を行い、サーバー側で認証情報を検証する方法もある。

**43. public ディレクトリの使いどころは？**

回答：

静的ファイル(画像やフォント、robots.txtなど)を配置する場所。

/public 以下のファイルは / からアクセス可能になる。

**44. カスタムの _document.tsx や _app.tsx (Pages Router) はどういう役割？**

回答：

_document.tsx はサーバーサイドでのみレンダリングされるHTMLの雛形を定義。

_app.tsx は各ページをラップし、共通のレイアウトや状態管理などを定義。

App Router ではLayout.tsxやtemplate.tsxなどに役割が移行。

**45. ESLint や Prettier と連携させる方法は？**

回答：

Next.js公式が提供するeslint設定を使うか、自分で .eslintrc.js や .prettierrc を用意する。

"scripts": { "lint": "next lint" } などとしてプロジェクト全体のコードをチェックできる。

**46. テストを行うにはどうしたらいい？**

回答：

Jest や React Testing Library を使う。

pages や components などの単位でテストファイルを分け、ユニットテストやスナップショットテストを行う。

**47. バージョンアップで注意すべき点は？**

回答：

Next.js や React、TypeScript はバージョンアップで非推奨機能が変更になることがある。

公式のマイグレーションガイドをチェックし、Breaking Changesがないかを確認。

**48. middleware.ts (App Router) の役割は？**

回答：

リクエストが特定のルートに到達する前に実行されるミドルウェアを定義。

認証チェックやリダイレクト、ヘッダーの付与などが可能。

**49. ページ遷移時のローディング表示をどう行う？**

回答：

next/navigation の useRouter などで router.isPending を確認し、ローディング中かどうかを判定。

あるいは古い書き方として next/router の onRouteChangeStart などをフックしてローディングUIを表示。

**50. アプリが複雑化してきたとき、どこからリファクタリングすべき？**

回答：

フォルダ構成やコンポーネント分割を見直し、大きなコンポーネントを小さく分割。

ロジックをカスタムフックに切り出したり、不要な依存を削除したりして管理しやすい構造に整える。

**ここに挙げた質問は一部の例であり、実際の開発要件に合わせて適宜ドキュメントや公式ガイドをチェックしてください。**