0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Next.js学習まとめ

Posted at

Next.jsの学習まとめ

Create Next App

npx create-next-app nextjs-sample

ルート管理

ReactRouterではそれぞれのコンポーネントでルートを管理していたが、
Pages内のフォルダディレクトリで管理できるようになるメリットがある。
PagesフォルダはNextCreateApp時に追加されるので、これを使用する。
また、ルーティング管理のために特別な名称があり、
index.** というファイル名は"/"を表しており、
_**.というようにアンダーバーから始まる場合はルーティングされず
ルーティング不要なファイルに使用されている。(_app.jsなど)
[
].とした場合はパラメータを表し、
[...
].**とした場合は複数のパラメータを受け取る。

階層1 階層2 階層3
Pages _app.js
index.js
main index.js
content.js
[articleId].js
[...slug].js

上記のようにファイルを作成した場合、
アクセスできるURLは[ / , /main , /main/content , /main/:articleId , /main/* ]となる。

ページリンク

ページ間をリンクするためにはLinkコンポーネントを使用する

<Link href="/main/content" />
<Link href={{
            pathname: '/main/:articleId',
            query: { articleId: helloworld },
          }}

クエリパラメーターの取得

コンポーネント内で現在のパラメーターを取得するためには"next/router"から
useRouterをインポートすることで取得することができる

import { useRouter } from "next/router";

const router = useRouter();
const currentQuery = router.query;

SSG/ISR

  • SSG
    next.jsではビルド時にプリレンダリングすることで
    パフォーマンスの向上やSEO対策を行うことができる。
    使い方としてはコンポーネント内で下記を記述する。
  • ISR
    SSGの欠点として一度ビルドした後は更新されないという点がある。
    その欠点を補うためにISRを設定することで自動で更新されるようになる。
    revalidateを追加することで更新間隔(秒数)を設定する。
export async function getStaticProps(context) {
  return {
    props: {},
    revalidate: 30,
  }
}

また、ルーティングで[**].**というパラメーターを受け取るコンポーネントとした場合、
上記の設定のみだと動かない。
それぞれのパスを設定するために下記のような記述する

export async function getStaticPaths() {
  return {
    paths: [
      { params: { articleId: "a1" } },
      { params: { articleId: "a2" } },
      { params: { articleId: "a3" } },
    ],
    fallback: true
  };
}

pathにはビルド時に生成するパスを全て記述する。
fallbackは3つの設定があり、
trueの場合は事前に設定したパス以外も受け取り見つかった場合はページを表示し、
以降パスのリストに追加される。
falseの場合は事前に設定したパス以外はエラーとなる。
"blocking"を設定した場合は、trueとほぼ同じであるが完全にロードが完了してからページが表示される。

SSR

ReactはCSRのためクライアントのスペックによって表示までに時間がかかってしまうことがある。
Next.jsではSSRを使用でき、これはサーバー側で処理するためスペックに依存しない。
SSRとSSGの違いとしてはSSRはリクエスト毎にページを生成するが、SSGは事前にページを生成し提供している。
SSRの書き方としては下記のように記述する。

export async function getServerSideProps(context) {
  return {
    props: {}, 
  }
}

また、ページが見つからなかった場合の処理として、
notFoundとRedirectが設定できる

return {
      notFound: true,
    }
return {
      redirect: {
        destination: '/',
      },
    }

Next.js製コンポーネント

Headコンポーネントを使用すると普段htmlに記述しているheadを追加することができる

import Head from "next/head"
<Head>
   <title>My page title</title>
   <meta name="viewport" content="initial-scale=1.0, width=device-width" />
</Head>

Imageコンポーネントを使用すると遅延ロードと最適化がされるので基本こちらを使用した方がよい

<Image
  src="me.png"
  alt="Picture of the author"
  width={500}
  height={500}
/>

カスタムドキュメント

pagesフォルダ内に下記のように_document.jsを追加するとhtmlの雛形の設定ができる。
主にHtml全体の設定やHeadの設定をここで行う。

import { Html, Head, Main, NextScript } from 'next/document'

export default function Document() {
  return (
    <Html lang="ja">
      <Head/>
      <body>
        <Main />
        <NextScript />
        <div id="overlay" />
      </body>
    </Html>
  )
}
0
2
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?