Next.js

Next.jsとは

Reactのフレームワーク

・設定をある程度フレームワーク側で自動的に設定してくれる

・Pre-Rendering が簡単にできる

・Rendering のタイミングを選択できる

・Routing の設定を書かなくても良い

 

設定

①Reactと同じでcreateコマンドを実行するだけで自動的にBabelやwebpackの設定をしてくれる

 

②関連してCodeSpittingのような最適化のための設定もある程度行ってくれる

npx create-next-app app_name

HTML生成タイミング

StaticGeneration

 ・ビルド時にHTMLを生成し、アクセス時にそれを表示

・Server-SideRendering

 ・アクセス時に生成し、それを表示

・Client-SideRendering

 ・ページ表示後にHTMLを生成し、それを表示

ページ
表示速度
全コンテンツ
表示速度
SEO対策
Static
Generation
Server-Side
Rendering
Client-Side
Rendering
× ×

Routing

・Next.jsではpagesディレクトリ以下のディレクトリ構造で自動的にルーティングを設定してくれる

・面倒なルーティングの設定を書かなくて良い

・ダイナミックルーティングにも対応

Routing

pages/bulletin_board_topics/index.js

=> /bulletin_board_topics

pages/bulletin_board_topics/[id].js

=> /bulletin_board_topics/:id

pages/bulletin_board_topics/[id]/edit.js

=> /bulletin_board_topics/:id/edit

ページ遷移

Next.js(React)ではHTML全体を再レンダリングするのではなく、<div id="__next">内を切り替えることでページ遷移を表現している。

<html>のスタイルを

背景黄色にして

ページ遷移しても...

何がいいのか

 

まずは表示がヌルッと高速である。

JavaScriptが保持しているデータをページ遷移した後も引き継ぐことができる。

 

Linkコンポーネント

Linkコンポーネントは<a>のラッパーでクライアントサイドナビゲーションを実現するためのコンポーネントです。

import Link from 'next/link'

export default function Home() {
  return (
    <Link href='/bulletin_board_topics'>掲示板</Link>
  )
}

Reactのチュートリアル知識と

Next.jsのLinkコンポーネント

さえわかれば

外部データに依存しないページ

は誰でも簡単に作れる

DataFetching

getStaticProps()

getServerSideProps()

・外部データを取得するために使う

・async/awaitで非同期処理の制御

・pageコンポーネントでのみ使用可能

使用方法はこの名前で関数を作り、exportするだけ。

DataFetching

getStaticProps()

・ビルド時に実行され、データを取得

getServerSideProps()

・リクエスト時に実行され、データを取得

Renderのタイミングに影響する

export async function getServerSideProps() {
  const res = await fetch('https://api/url')
  const json = await res.json()
  return {
    props: {
      bulletin_board_topics: json.bulletin_board_topics
    }
  }
}

export default function Index({ bulletin_board_topics }) {
  return (
    <>
      <h1>掲示板一覧</h1>
      {bulletin_board_topics.map((data) =>
        return <div>{data.title}</div>
      )}
    </>
  )
}

Cliant-SideRendering

BONDGATEはSEOを考える必要が薄いので、必ずしもサーバーサイドレンダリングにする必要はない。

なので、外部データに依存する部分だけクライアントサイドレンダリングにするのが望ましいだろう。

そういう場合はSWRというライブラリを用いて実装する。

import useSWR from 'swr'

async function fetcher(url) {
  const res = await fetch(url)
  const json = await res.json()
  return json.bulletin_board_topics
}

export default function Index({ bulletin_board_topics }) {
  const { data, error } = useSWR('https://api/url', fetcher)
  if (error) return <div>failed to load</div>
  if (!data) return <div>loading...</div>
  return (
    <>
      <h1>掲示板一覧</h1>
      {bulletin_board_topics.map((data) =>
        return <div>{data.title}</div>
      )}
    </>
  )
}

SWR

FetchAPIではなくSWRを用いる主なメリットはSWRの強力なキャッシュ機能を利用するところにある。

また、データの再フェッチも優秀で取得するデータが変更があった場合に関数を再実行することなく再フェッチしてくれる。

おまけでデータ取得の状態管理が容易。

Next

By Ryosuke Hiroe

Next

  • 90