📉

【Next.js/React】Next.js を徹底的に洗い尽くす[※随時更新]

2023/05/01に公開

きっかけ

Next.jsを業務で長らく使うことが判明したので、
徹底的に勉強していこうかなって感じで👾
そして、私みたいな初心者()でも
わかるように自分であとから見返せるようなものにしたいです。

Next.jsって?

Next.jsは、Reactベースのフレームワークであり、
高速でシンプルなウェブアプリケーションの構築を目的としています。

Next.jsは、多くの機能を提供し、開発者がウェブアプリケーションを作成する際に手間を省きます。以下では、Next.jsの主な機能と利点について詳しく説明します。

サーバーサイドレンダリング(SSR)

Next.jsは、サーバーサイドレンダリング(SSR)をサポートしています。
これは、Reactアプリケーションをサーバー上でレンダリングすることを意味します。
これにより、ユーザーにとってウェブページの読み込み時間が短縮され、
SEOにも効果的です。Next.jsは、SSRをサポートするためのAPIを提供し、
Reactコンポーネントをサーバー上でレンダリングすることができます。

静的ファイル生成(SSG)

Next.jsは、静的ファイル生成(SSG)もサポートしています。
これは、サーバー上でReactアプリケーションをレンダリングし、
HTMLファイルを生成することを意味します。
これにより、Reactアプリケーションを静的なHTMLファイルとして保存し、
サーバーに再度問い合わせることなく、高速にコンテンツを配信できます。

ルーティングとコード分割

Next.jsは、ルーティングとコード分割を簡単に行うことができます。
Next.jsでは、pagesディレクトリにファイルを作成することで、
ルーティングを自動的に設定することができます。
また、コンポーネント単位でのコード分割が可能であり、
必要なコンポーネントだけを必要なタイミングでロードできます。

APIルート

Next.jsは、APIルートをサポートしています。
これは、ウェブアプリケーション内でREST APIを作成することができます。
APIルートを作成するには、pages/apiディレクトリにファイルを作成します。
APIルートを使用することで、ウェブアプリケーション内でのデータの送受信が簡単になります。

ホットリローディング

Next.jsでは、ホットリローディングがデフォルトで有効になっています。
これは、コードを変更した場合、ブラウザが自動的にリロードされ、
変更内容が反映されることを意味します。
これにより、開発者はコードを変更した直後に変更内容を確認できます。

また、Next.jsは、ホットリローディングを最適化しています。
特に、ページ単位のホットリローディングを実現しています。
つまり、ページのコンポーネントを変更した場合、そのページのみがリロードされ、
他のページは影響を受けません。
これにより、開発者は素早く反応することができ、効率的な開発が可能になります。

さらに、Next.jsは、ホットリローディングを自動的に適用することができるだけでなく、
手動で有効化することもできます。
開発者は、開発中のコードの特定の部分について、
自動的なホットリローディングを無効化し、手動でリロードすることができます。

モジュール解決

Next.jsは、WebpackとBabelを使用して、モジュールを解決します。
これにより、開発者は、npmパッケージやローカルファイルを簡単にインポートすることができます。また、CSSや画像ファイルなどの静的ファイルも、モジュールとして扱うことができます。

デフォルトでのセキュリティ機能

Next.jsは、デフォルトでいくつかのセキュリティ機能を提供しています。
例えば、クロスサイトスクリプティング(XSS)攻撃を防ぐためのセキュリティヘッダーが含まれています。また、セキュリティに関する最新のベストプラクティスが自動的に実装されています。

環境変数の扱い

Next.jsでは、環境変数を簡単に扱うことができます。
.envファイルを作成し、環境変数を定義することができます。
環境変数は、process.envオブジェクトを通じてアクセスできます。

カスタマイズ可能

Next.jsは、多くの機能を提供していますが、それでも開発者は独自のニーズに合わせてカスタマイズすることができます。
例えば、WebpackやBabelの設定を変更したり、サードパーティのライブラリを追加したりすることができます。

環境構築

1.Node.jsのインストール

まずは Node.jsをインストールしましょう。

2.Next.jsのインストール

下記のコマンドをたたく

npm install -g next
  1. Next.jsの新規プロジェクト作成
npx create-next-app my-app

my-appという名前の新しいNext.jsプロジェクトを作成します。

  1. プロジェクトの実行
cd my-app
npm run dev

localhost:3000 にアクセスできると思います。
これでNext.jsの環境は出来上がりました。

ディレクトリの作成

pagesディレクトリを作成し、
index.js ファイルを作成します。

index.js

import Head from 'next/head'

export default function Home() {
  return (
    <div>
      <Head>
        <title>My Next.js App</title>
        <meta name="description" content="My awesome Next.js app" />
      </Head>
      <h1>Welcome to my app!</h1>
      <p>This is the home page.</p>
    </div>
  )
}

上記の例では、Headコンポーネントを使用して、
ページのタイトルと説明を設定しています。
また、ページのコンテンツとして、h1要素とp要素を使用して、メッセージを表示しています。

1行ずつ解説

import Head from 'next/head'

import Head from 'next/head'は、
Next.jsでHTMLのheadセクションを変更するためのコンポーネントです。

Next.jsでは、pagesディレクトリ内に作成された各ページコンポーネントの
headセクションが自動的に生成されます。
しかし、場合によっては、headセクションに特定の要素(例えば、title要素、meta要素、link要素など)を追加したい場合があります。
その場合、Headコンポーネントを使用することで、headセクションをカスタマイズできます。

以下は、Headコンポーネントを使用して、ページのタイトルとメタデータを設定する例です。

import Head from 'next/head'

export default function Home() {
  return (
    <div>
      <Head>
        <title>My Next.js App</title>
        <meta name="description" content="My awesome Next.js app" />
      </Head>
      <h1>Welcome to my app!</h1>
      <p>This is the home page.</p>
    </div>
  )
}

この例では、Headコンポーネントを使用して、title要素とmeta要素を追加しています。title要素は、ページのタイトルを設定します。meta要素は、ページの説明(description)を設定します。

Headコンポーネントを使用することで、ページのheadセクションを柔軟に変更できるため、SEO対策やアクセシビリティの向上に役立ちます。


export default function Home() {

export default function Home() {}は、Next.jsのページコンポーネントの例です。

Next.jsでは、pagesディレクトリ内に作成された各ページコンポーネントが、
それぞれのURLに対応します。
例えば、pages/index.jsコンポーネントは、アプリのホームページに対応します。

このようなページコンポーネントは、Reactのコンポーネントと同様に、export defaultを使用してエクスポートします。そして、コンポーネントの中身には、ページのHTML要素を記述します。

以下は、Next.jsのページコンポーネントの例です。

import Head from 'next/head'

export default function Home() {
  return (
    <div>
      <Head>
        <title>My Next.js App</title>
        <meta name="description" content="My awesome Next.js app" />
      </Head>
      <h1>Welcome to my app!</h1>
      <p>This is the home page.</p>
    </div>
  )
}

この例では、Headコンポーネントを使用して、title要素とmeta要素をページに追加しています。
また、h1要素とp要素を使用して、ページの主要なコンテンツを記述しています。

Next.jsのページコンポーネントは、Reactコンポーネントと同様に、
propsを受け取ることができます。
これを使用して、ページコンポーネントに必要なデータを渡すことができます。
また、APIルートやデータベースからデータを取得することもできます。


return (
    <div>
      <Head>
        <title>My Next.js App</title>
        <meta name="description" content="My awesome Next.js app" />
      </Head>
      <h1>Welcome to my app!</h1>
      <p>This is the home page.</p>
    </div>
  )

このreturnブロックは、Homeコンポーネントが描画する要素を定義しています。

<div>要素の中には、ページの全体を囲むためのコンテナーとして使用されます。
<Head>コンポーネントの中には、ページのtitleタグとmetaタグが含まれています。

<title>要素は、ページのタイトルを定義するために使用され、ブラウザのタブに表示されます。

<meta>要素は、Webページに関するメタデータを定義するために使用されます。
この例では、name属性にdescription、content属性にMy awesome Next.js appが指定されています。

<h1>要素は、ページの見出しを定義し、<p>要素は、テキストコンテンツを定義します。これらの要素は、ユーザーにページの内容を伝えるために使用されます。

return文の中身は、JSXという言語で書かれています。JSXは、JavaScriptの拡張構文であり、ReactでUIを構築するために使用されます。JSXのコードは、ReactによってJavaScriptのコードに変換されます。

ページのエクスポート

ページのコンポーネントを作成したら、
次に、exportデフォルト構文を使用して、ページをエクスポートする必要があります。

pagesディレクトリの作成
まず、Next.jsでは、ページのコンポーネントをpagesディレクトリに配置する必要があります。例えば、indexページを作成する場合は、pagesディレクトリにindex.jsファイルを作成します。

ページの作成

次に、ページのコンポーネントを作成します。以下は、indexページの例です。

import Head from 'next/head'
export default function Home() {
  return (
    <div>
      <Head>
        <title>My Next.js App</title>
        <meta name="description" content="My awesome Next.js app" />
      </Head>
      <h1>Welcome to my app!</h1>
      <p>This is the home page.</p>
    </div>
  )
}

この例では、Headコンポーネントを使用して、ページのタイトルと説明を設定しています。
また、ページのコンテンツとして、h1要素とp要素を使用して、メッセージを表示しています。

ページのエクスポート

ページのコンポーネントを作成したら、
次に、exportデフォルト構文を使用して、ページをエクスポートする必要があります。

export default function Home() {
  // ...
}

ページのルーティング

Next.jsでは、pagesディレクトリ内のファイル名を使用して、ページのルーティングを自動的に設定します。例えば、index.jsファイルは、ルートパス(/)に対応します。また、about.jsファイルは、/aboutパスに対応します。

ページの表示

最後に、ページを表示するために、Next.jsのLinkコンポーネントを使用して、ページ間のナビゲーションを設定できます。

import Link from 'next/link'

export default function Home() {
  return (
    <div>
      <h1>Welcome to my app!</h1>
      <p>This is the home page.</p>
      <Link href="/about">
        <a>About</a>
      </Link>
    </div>
  )
}

1行ずつ解説

import Link from 'next/link'

import Link from 'next/link' は、
Next.jsアプリケーションでのルーティングを実現するためのReactコンポーネントであるLinkをインポートするためのコードです。

Linkコンポーネントは、Reactのルーターを使って、アプリケーション内の別のページにリンクすることができます。このコンポーネントは、通常、アンカータグ(<a>要素)の代わりに使用されます。

例えば、以下のようなコードを記述することで、/aboutへのリンクを作成することができます。

<Link href="/about">
  <a>About us</a>
</Link>

このコードでは、<Link>要素のhrefプロパティに/aboutという文字列を渡すことで、/aboutページへのリンクを作成しています。そして、<a>要素の中には、リンクのテキストとしてAbout usという文字列を表示しています。

このように、Linkコンポーネントを使用することで、
Next.jsアプリケーション内のページ遷移を簡単かつシームレスに実現することができます。


export default function Home() {

export default function Home()は、Next.jsアプリケーションでのホームページを表すReactコンポーネントの定義を行うためのコードです。

このコンポーネントは、pagesディレクトリにあるindex.jsというファイルに記述され、アプリケーションのトップレベルのページとして表示されます。

以下は、基本的なHomeコンポーネントの例です。

import Head from 'next/head'

export default function Home() {
  return (
    <div>
      <Head>
        <title>My Next.js App</title>
        <meta name="description" content="My awesome Next.js app" />
      </Head>
      <h1>Welcome to my app!</h1>
      <p>This is the home page.</p>
    </div>
  )
}

この例では、Headコンポーネントを使ってページのヘッダー情報を設定しています。
<title>タグでページのタイトルを設定し、<meta>タグでページのメタデータを設定しています。

その後、<h1>タグでページの見出しを表示し、<p>タグでページの本文を表示しています。

このように、export default function Home()を使って、
Next.jsアプリケーションのホームページを定義することができます。


return (
    <div>
      <h1>Welcome to my app!</h1>
      <p>This is the home page.</p>
      <Link href="/about">
        <a>About</a>
      </Link>
    </div>
  )

<Link>コンポーネントを使用して、リンクを作成し、hrefプロパティでリンク先のURLを指定することができます。
<Link>コンポーネントを使用することで、Next.jsはクライアントサイドのルーティングを処理し、ページ遷移時にページ全体を再読み込みせずに必要な部分だけを更新することができます。

以下は、<Link>コンポーネントを使用して、Aboutページへのリンクを追加した例です。

import Head from 'next/head'
import Link from 'next/link'

export default function Home() {
  return (
    <div>
      <Head>
        <title>My Next.js App</title>
        <meta name="description" content="My awesome Next.js app" />
      </Head>
      <h1>Welcome to my app!</h1>
      <p>This is the home page.</p>
      <Link href="/about">
        <a>About</a>
      </Link>
    </div>
  )
}

この例では、<Link>コンポーネントでAboutページへのリンクを作成し、
<a>タグでリンクを表示しています。
クリックすると、Next.jsはクライアントサイドのルーティングを処理し、
Aboutページに移動します。

Discussion