- 実施日
- 2020/8/25 あたり (チュートリアルは頻繁に更新されている模様)
チュートリアルで作成したもの
前提知識
Next.js
Universal (Isomorphic) JavaScript フレームワーク
特徴
- routing を書かなくて良い (書くことも出来る)
- SSG (Static Site Generation) に対応
- Static HTML Export (Pre-rendering)
- クライアントサイドのナビゲーション
- ページ遷移が JavaScript を使って行われる (ので高速)
- コード分割が自動的に行われる
SPA (Single Page Application)
画面の描画や遷移をクライアントサイドの JavaScript ですべて行う Web アプリケーション
特徴
- ページ遷移が発生しない
- 同一のページ内でコンテンツのみを切り替える
- ページ遷移が発生しない
メリット
- 高速
- 従来のサーバがページごとに HTML をレンダリングするのに比べて、SPA は必要な部分だけ API でデータを取得し再描画を行う為、高速
- フロントエンドとサーバサイドを完全に分離して開発出来る
- 高速
デメリット
- 初期表示に時間がかかる
SSR (Server-Side Rendering)
ブラウザで行われていたJSの実行とHTML生成をサーバー側(=Node.js)で行う技術
メリット
- SPA の欠点である 初期表示の遅さ がカバーされる
デメリット
- サーバ(=Node.js が動かせるサーバ)が必要
Pre-rendering
- パフォーマンス(高速化)、SEO の向上の為に、予め各ページの HTML を生成しておく事
Pre-rendering vs SSR
Pre-rendering
- 事前に生成したHTMLを配信
-
- アクセスを受けて、HTMLを生成・配信
SSG (Static Site Generation)
「事前に SSR を行って静的ファイル化しておき、本番環境では生成済みのHTMLを配信するだけ」 というアプローチ
- Next.js では
next export
コマンドで Static HTML Export (=静的ファイル化)できる
- Next.js では
メリット
- サーバが不要
- 生成済みの静的ファイルを S3 等でホストすればok
- サーバが不要
SSR vs SSG
チュートリアル実施時のメモ
Create a Next.js App
- Next.js アプリの作成
- create-next-appで作成
- ※create-next-app を使わずに Next.js アプリを作成する方法
npx create-next-app nextjs-blog --use-npm --example "https://github.com/vercel/next-learn-starter/tree/master/learn-starter"
- 開発サーバの起動
cd nextjs-blog yarn dev
- 開発サーバを起動すると http://localhost:3000 で Next.js アプリにアクセスできる
Navigate Between Pages
Next.js における「ページ」とは
pages
ディレクトリ以下に作成されるReact Component
の事
Next.js の Routing
- ページは ファイル名 に基づいてルーティングに関連づけられる
- 例
pages\posts\first-post.js
=> http://localhost:3000\posts\first-post
クライアントサイドでのアプリ内の異なるページへの遷移
コード分割(Code splitting) と プリフェッチング(prefetching)
- Next.js は自動的にコード分割を行う
- 各ページはそのページに必要なものだけを読み込む
Link
コンポーネント- ブラウザの viewport に表示されると、自動的にリンク先のページをバックグラウンドでプリフェッチする
Assets, Metadata, and CSS
- CSS スタイリング
CSS-in-JS
library により行われる- デフォルトでは styled-jsx が使用される
- styled-components、emotion 等の
CSS-in-JS
library を使用する事も可能
Pre-rendering and Data Fetching
Pre-rendering
Pre-rendering
- why
- パフォーマンス、SEO の向上
- how
- 予め各ページの HTML を生成しておく
- 生成された各 HTML は JavaScript コードと関連づけられる
- ブラウザがページをロードした際に、上記の JavaScript コードが実行される
- 予め各ページの HTML を生成しておく
- why
Next.js
のPre-rendering
- 2 つの方式がある
-
Static Generation
-
Server-side Rendering
-
- ページ毎にどちらの方式を使用するか選択できる
- 2 つの方式がある
Static Generation
(静的生成)- ビルド時 に HTML を生成する
Pre-rendering
手法 - 対処ページをユーザーのリクエストに先立って生成できる場合は、
Static Generation
を推奨
- ビルド時 に HTML を生成する
Server-side Rendering
(サーバサイドレンダリング, SSR)- 毎回のリクエスト毎 に HTML を生成する
Pre-rendering
手法
- 毎回のリクエスト毎 に HTML を生成する
(備考)
Pre-rendering
されているかの確認方法- ブラウザの JavaScript を無効にしてページをロード => レンダリングされれば
Pre-rendering
されている
- ブラウザの JavaScript を無効にしてページをロード => レンダリングされれば
Data Fetching
getStaticProps
getServerSideProps
(備考)
getInitialProps
クライアントサイドレンダリング
Pre-rendering
する必要がない場合に用いる下記の手法- 外部データを必要としないページの部分を
Static Generate
でPre-rendering
- ページをロードした際に、クライアント側で、JavaScript を使用して外部データを取得
SWR
を使用して外部データを取得する事を推奨
- 外部データを必要としないページの部分を
SWR
(stale-while-revalidate)Next.js
の開発チームがした、データフェッチ用の React フック- https://swr.vercel.app/
Dynamic Routing
Dynamic Routing
- 外部データに応じて、ページのパスを動的に生成し、ページを静的に生成する事
ページのパスを動的に生成 - =>
getStaticPaths
ページを静的に生成 - =>
getStaticProps
Dynamic Routing
での静的ページ生成http://localhost:3000/posts/<id>
というページを静的生成する場合/pages/posts/[id].js
ファイルを作成し、下記のような React コンポーネントを作成するgetStaticPaths()
を実装し、id として取りうる値のリストを返すgetStaticProps()
を実装し、id に基づいて必要なデータを取得する
// /pages/posts/[id].js export default function Post() { // React コンポーネントを返す } export async function getStaticPaths() { // id としてとりうる値のリストを返す return [ { params: { id: ['a', 'b', 'c'] //ここを、外部データに応じて動的に返すようにする } } ] } export async function getStaticProps({ params }) { // params.id を使用して、ページに必要なデータを取得する // この例では、params.id は ['a', 'b', 'c'] のようになる }
- 開発環境 vs 本番環境
- 開発環境
getStaticPaths
は毎回のリクエストごとに実行される
- 本番環境
getStaticPaths
はビルド時に実行される
- 開発環境
API Routes
API Route
- Next.js アプリの中に API エンドポイントを作成できる
API エンドポイントの作成
http://localhost:3000/api/hello
というAPI エンドポイントを作成する場合は、pages/api/hello.js
を作成する
// pages/api/hello.js export default (req, res) => { res.status(200).json({ text: 'Hello' }) }
Dynamic API Routes
を作成する事もできる留意点
Deploying Your Next.js App
TypeScript
tsconfig.json
の作成 +TypeScript
のインスール
yarn add --dev typescript @types/react @types/node touch tsconfig.json yarn dev
- 既存のファイルの拡張子を
js
からts
/tsx
に変更し、適宜、型を設定する