目的
- React(Create React App=CRA)とNext.jsは何が違うのかを調べて整理する。
背景
- CRAで作ったReactアプリは何となく雰囲気で動かせるようになってきた人が、Next.jsに関わるケースがあると思います。
- そしてその際、CRAで作ったReactアプリの知識のうち、何を流用できる/できない、また注意点は何かを素早く知りたい状況になると思います。
- ここではそのようなケースに遭遇した際に参考になる記事を書きます。
概要
- URL
Next.jsにできること
- 適切な場所でレンダリングするサービスを提供できる。
- CRAで作ったReactアプリのように、アプリケーションをブラウザ上でレンダリングできる。
- サーバーサイドアプリのように、アプリケーションをリクエスト時でレンダリングできる。(いわゆるSSR)
- 静的サイトジェネレータのように、ビルド時にレンダリングできる。(いわゆるSSG)
- 対象のコンポーネントへTS/JSファイルのパスでルーティングできる
- CRAで作ったReactアプリでは、react-router-domなどの3rd pathyライブラリを利用して、Componentへルーティングするのが一般的。
- Next.jsではpageディレクトリ配下にあるTS/JSファイルにルーティングされる。
- ファイルパスを
pages/post/[pid].js
などと指定することで、動的にルーティングできる。
- 画像をトリミングして配信できる
- Next.jsのコンポーネントを利用して画像をJSXに定義すると、トリミングして配信されるらしい。 Image Component and Image Optimization
- Rustコンパイラでビルドできる(Next.js ver12.0 ~)
- ローカルでのリフレッシュが3倍速、プロダクションビルドが5倍速らしい。参考: Next.js 12について本気出して和訳してみた
注意点
- Reactはライブラリで、Next.jsはフレームワークである。
- Reactは仮想DOMを扱うためのユーティリティライブラリだが、Next.jsはフレームワーク。
- Reactは利用者が、必要なライブラリを選んだり構造を検討する必要がある。ポジティブにいうと自由度がある。
- Next.jsは、SSR/SSGのフレームワークなので、構造は決まっていたりお作法がある。ポジティブにいうと規律がある。
- Next.jsはサービスになる。
- Reactアプリをデプロイする場合、ビルドしてJSファイルを取得し、別のHTTPサーバーが配信するように思う。(もしくはそのままserveするか)
- Next.jsアプリをデプロイする場合、ビルドして静的な情報を配置し、Next.jsをサービスとして起動して、Next.jsが配信する。
- Next.jsでページ共通処理を入れるとき、Custom Appという機能を使う必要がある
- Next.jsはファイルベースでルーティングするので、Reactで言うところのRouter/Switchコンポーネントがない。
- Reactなら共通処理はSwitchの外に定義するが、Next.jsの場合は、Custom Appを利用する。
- 普通のReactで動くライブラリがそのまま動かないケースがある。
- 動かない理由までは追ってないが、Dynamic Importという機能を使うと良いらしい。
- 情報源と解決Tips
- CSSモジュールを使っている際に、ブラウザ読み込み時にCSSが当たるのが遅れる。
- Next.jsでHTTPサービスを起動でき、Nginx等でリバースプロキシして利用する
- SSRするので当然ですが、そのままHTTPサーバーになります。
- PythonならWSGI、RubyならRack、PerlならPSGIみたいなものがありますが、そういうのはない。
- Next.jsのお作法は学ぶ必要がある
- 例えば
getStaticPaths
getStaticProps
getServerSideProps
がそれぞれどういう処理の流れになってるかなど。
- 例えば
所感・感想
- 最初 React / Next.jsで比較して調査を始めたが、対立としては「Create React App vs Next.js 」の方が適切だということに途中で気づいた。
- 漠然と「調査を始める前は、SSRが欲しいなら Next.jsを利用し、そうでないならCreate React Appが良い」と思っていたがフレームワークとしての規律が欲しいから Next.jsを採用するケースはありそうに思った。またCreate React Appで初めても自分で設定を調整すればSSRできる話も見えた。(大変だから Next.jsが出てきたのだと思うが)
- 言われてみれば当然だが、Next.jsはBFFのサーバーになる。そして、ミドルウェアを持って共通処理を挟むことができる。やろうとすればNext.jsはDB接続やキャッシュ、セッション管理も可能に見える。どこまでNext.jsのミドルウェアで行うべきなのだろうか。(Next.jsはBFFだと思うが、純粋なバックエンドとの役割分解はどうなるか。)
疑問はあるので、詳細は、調べていく必要がある。