Next.js学習ログ
冬休みでNext.jsを勉強したいなーと思ったので、学習ログをスクラップにまとめていきます。
やりたいこと
他何かおすすめの資料あればコメントもらえると嬉しいです。
自分のスキルレベル
- はるか昔にReactのチュートリアルをちょっとやった。普段はVueを書く。
- Next.js 初めて
pre-renderingの話。
Next.jsはデフォルトでプリレンダリングするので、JSなしでも動く。
JSが読み込まれた後でインタラクテイィブな操作が可能になる。
pre-rendaeringには2つの方法がある
- Static Generation(SSG)
- Server-side Rendering(SSR)
SSGはビルド時にHTMLを生成する。SSRはリクエスト毎にHTMLを生成する。
Next.jsはページ別にレンダリング方式を選択できる(スゴイ)
あるページではSSG、あるページではSSRみたいなことができる。
SSRより遥かにスピードが早いSSGを使うことがおすすめ。
ページの内容がリクエストのたびに変更する必要がある場合は、SSR。またはSPA。
外部データを必要としないページはプロダクションビルド時に自動的にSSGになる。
外部データを必要とするページは、外部データをfetchした後にビルドされる。
SSGでのデータ取得はgetStaticProps
によって行われる。
export default function Home(props) { ... }
export async function getStaticProps() {
// Get external data from the file system, API, DB, etc.
const data = ...
// The value of the `props` key will be
// passed to the `Home` component
return {
props: ...
}
}
(developmentモードではgetStaticPropsも、リクエストのたびに実行される)
getStaticPropsはserver-sideで実行されることが決まっているので、DBにアクセスすることもできる。
import someDatabaseSDK from 'someDatabaseSDK'
const databaseClient = someDatabaseSDK.createClient(...)
export async function getSortedPostsData() {
// Instead of the file system,
// fetch post data from a database
return databaseClient.query('SELECT posts...')
}
このコードはブラウザ用のJSビルドにはバンドルされない。
getStaticPropsはpageでのみ実行可能。ページ以外のファイルでは使えない。
リクエスト時にビルドするのがSSR
SSRでは、getServerSideProps
がリクエスト時にサーバー側で実行される。
引数に受け取るcontext
でリクエスト時の値を受け取ることもできる。
export async function getServerSideProps(context) {
return {
props: {
// props for your component
}
}
}
getServerSidePrpsはリクエスト時にデータを取得しなくてはならないページにだけ使うべき。リクエスト毎にデータにアクセスするため、CDNに載せることは出来ず速度が遅い。
Client-side Rendering
pre-renderがいらない場合は、静的にページをビルドし、ページがビルドされた後に、JSで外部データを読み込む方式が良い。
管理画面とかにおすすめ
SWR
データフェッチのためのリアクトフックライブラリ
GraphQLでいうApollo的にデータのキャッシュとか色々してくれる
SWRのVue版もあった。
動的なSSGページ作成の方法
Dynamic Routesを使う。
import Layout from '../../components/layout'
export default function Post() {
return <Layout>...</Layout>
}
export async function getStaticPaths() {
// Return a list of possible value for id
}
export async function getStaticProps({ params }) {
// Fetch necessary data for the blog post using params.id
}
API Route
Do Not Fetch an API Route from getStaticProps or getStaticPaths
You should not fetch an API Route from getStaticProps or getStaticPaths. Instead, write your server-side code directly in getStaticProps or getStaticPaths (or call a helper function).
Here’s why: getStaticProps and getStaticPaths runs only on the server-side. It will never be run on the client-side. It won’t even be included in the JS bundle for the browser. That means you can write code such as direct database queries without them being sent to browsers.
API Route を getStaticProps や getStaticPaths からは取得できない。
なるほど〜。
API RouteはHeadless CMSのプレビューモードでも使える
Next.jsの公式チュートリアル 一通り読み終わった。
- pre-rendering and Data Fetching
- Dynamic Routes
- API Routes
が勉強になった。
CSR, SSR, ISR, SSGの動作確認用のサンプルアプリを作ってみた