Next.js入門
Next.jsのLink
コンポーネントでページ遷移をするとリロードが行われない
通常のHTMLタグa
でページ遷移をするとリロードが行われる
静的リソース
Next.js は、ルートディレクトリの public
フォルダ下で、画像などの静的ファイルを配信できる。public
内のファイルは、ベース URL(/
)から始まるコードで参照できる。
例えば、 public/me.png
に画像を追加した場合、次のコードで画像にアクセスする。
import Image from 'next/image'
function Avatar() {
return <Image src="/me.png" alt="me" width="64" height="64" />
}
export default Avatar
Metaデータは<Head>
コンポーネントの中に書いていく。
import Head from 'next/head';
function IndexPage() {
return (
<div>
<Head>
<title>My page title</title>
<meta name="viewport" content="initial-scale=1.0, width=device-width" />
</Head>
<p>Hello world!</p>
</div>
);
}
export default IndexPage;
Next.jsは、拡張子.module.cssを使用するCSSモジュールをビルトインでサポートしています。
CSSモジュールは、一意のクラス名を自動的に作成することで、CSSを局所的にスコープします。これにより、衝突を心配することなく、異なるファイルで同じクラス名を使用することができます。この動作により、CSSモジュールはコンポーネントレベルのCSSをインクルードする理想的な方法となります。
Next.js で、すべてのページコンポーネント (pages/*.tsx) に共通のスタイルシート(いわゆるグローバル CSS)を適用したい場合は、pages/_app.tsx(js) というファイルを作成して、そこで CSS ファイルをインポートします。
補足:
VSCodeでJSXを編集する際に、Emmetが有効になっていない場合は以下の記事にあるように、VSCodeの設定でhtml以外のファイルでも有効にしてやればよい。
参考:
SSG
Next.js 12
-
getStaticProps
を使う
ページから getStaticProps(静的サイト生成)という関数をエクスポートすると、Next.js はビルド時に getStaticProps から返される props を使ってプリレンダリングします。
export async function getStaticProps(context) {
return {
props: {}, // ページコンポーネントに props として渡されます。
}
}
Next.js 13以降
-
getStaticProps
は使わないらしい - 詳細はまたあとで
SSR
Next.js 12
-
getServerSideProps
を使う
Next.js 13以降
Next.js 13での変更点
app
フォルダ
-
layout.tsx
- ページ全体に関わるレイアウト設定
- 以前は
_app.tsx(js)
や_document.tsx
に記述していた - 以前は<Head>コンポーネントの中に書いていたが、
layout.tsx
内の以下のような書き方に変更
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
};
-
page.tsx
- app/[hoge]/page.tsxとした場合に[hoge]の部分がpathとなる
- 以前のバージョンなら
index.tsx
-
app
ディレクトリ配下はサーバサイドレンダリング(SSR)される- クライアントサイドレンダリング(CSR)をしたい場合はページの先頭に
use client
を付ける必要がある - 公式
- クライアントサイドレンダリング(CSR)をしたい場合はページの先頭に
'use client';
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>Click me</button>
</div>
);
}