Next.jsのチュートリアルをまじめにやってみる
やったことがなかったため。Next.jsを最近使う機会があるのだけど、Next.jsがいまいちなにをやっているのかわかってない。React.jsは結構好きで使っていた。
一通り終わったあたりで、これもオススメです
こなしているチュートリアルはこれになる。
まず最初に知ったのはcreate-next-app
というコマンドだった。次からプロジェクトを作る際に使いたい。
基本的なLinkとかpagesが何とかは知っていたのですっ飛ばしたけど、CSS周りがわかってなかったのでメモ。普段はコンポーネントを用意してくれるライブラリを使ってしまうことが多く、この辺りの理解を完全にすっ飛ばしていたと思う。
Next.jsが扱うCSSは、チュートリアルが扱う限りではスコープの違いによりふたつあるようだ。
- ローカルスコープで定義されるもの。つまり、コンポーネント単位が適用範囲となるCSS。
- グローバルスコープで定義されるもの。つまり、
_app.js
で定義し、全部のコンポーネントに対して適用となるCSS。
clsxというライブラリがちょっと紹介されていた。知らなかったので、あとでキャッチアップしておく。
Pre-rendering
デフォルトでは、Next.jsは各々のページを事前に生成(pre-render)しておく。生成されたHTMLは読み込まれるとJavaScriptコードが読みこまれて、インタラクティブなページとして動作する。このことをhydrationと呼ぶらしい。
React.js単体だとこれは動いていないので、JavaScriptをオフにするとページを見られなくなってしまう。
最初の読み込みのタイミングで、可能な限り生成されたHTMLを読み込む。次に、それでも難しかったものはあとからJavaScriptを読み込むといった流れ?
Next.jsにはふたつのプリレンダリングの仕方がある。
- Static Generation: ビルドしたタイミングで生成されるHTMLのことで、リクエスト間で共通して同じものが返される。
- Server-side Rendering: Next.js側のサーバーでリクエストごとに生成されるHTML。
この生成方式はページごとに選べるらしく、ひとつのNext.js appの中にふたつのプリレンダリング方式を混在させることもできるらしい。すごい。
どちらをどの場面で使うべきかと言うと、
- Static Generation
- こちらをNext.jsは推奨している。まあ普通に考えて、これが一番速いからね。
- ユーザーからのリクエストに先立ってページをプリレンダリングできないようなケースでは、Static Generationはいいアイディアではない。たとえばページが頻繁に更新されるものや、リクエストのたびにコンテンツが変わるようなもの。
- Server-side Rendering
- 上記では満たせないケースで使用する。
ちなみにだが、データのフェッチのする・しないに関わらずStatic Generationはワークするらしい。
Static Generationのために、データの取得は getStaticProps
で可能。サンプルだとファイルシステムから取得しているのでビルド時点で情報があるじゃん!ないとダメなの?と思ったけど、データベースからも取ったりできるらしい。わお。
getserverSideProps
はサーバーサイドレンダリングのときに利用できる。また、そもそもデータのプリレンダリングが不要な場合には、SWR
が使える。Next.js的にはデータの取得時にはこっちの利用を推奨しているみたい。
Dynamic Routingのところにはふたつ出てくる。
-
getStaticPaths
: あらかじめ候補となるパスの情報を渡しておくと、静的にページをプリレンダリングしてくれる機能っぽい? -
getStaticProps
: ↑で取得したパラメータを元に、各ページ用にpropsを生成してくれる君っぽい。
日付のところではdate-fnsが使われていたのでメモ