🏎️

パフォーマンス観点でみる Next.js の getLayout

に公開
4

Discussion

mya-akemya-ake

こんにちは。
例としてRecoilを出すのであれば、RecoilRootをLayoutに出す場合の注意点を書いておいた方がいいと思ったので、コメントさせていただきます(ライブラリの使い方がこの記事の本質ではないと思いますが)。
RecoilRootを持たないレイアウトに遷移した場合に、Recoilに保存しておいた値が消えてしまいます。そのためこの記事の前提の「ログインユーザー情報格納のために利用している」のであれば、この点をケアしておく必要があると思います。

フォークして実装したリポジトリはこちらになります。こちらではレイアウトが変わっても値が消えないように実装してありますが、本番環境で利用できるほどの品質ではありません。参考程度に見ていただければと思います。
https://github.com/mya-ake/nextjs-getlayout
追加したコード

  • authenticatedというbool値をRecoilに追加
  • /my/login でログインできるようにし、authenticatedtrue
  • /my/profileauthenticatedの値を表示
  • ヘッダーを作成し遷移できるように
  • Atom Effectsを利用して、値の永続化を実装(この実装を消すと値を保持できなくなります)
    • Suspenseを使えばきれいに書けるのでは?とこのコメントを書きながら思いつきましたが、試せてはないですmm
    • レイアウト間の値保持だけが目的であればシングルトンに保持させておくとかでも十分そうです
TakepepeTakepepe

@mya-ake コメント・サンプルご提案ありがとうございます。そうですね、React.Context Provider をマウントする場合と同様ですが、Layout をアンマウントすると状態破棄されてしまいますね。なので、前提例としてもう少し別のものを挙げるべきだったなと思います。

懸案事項のような、レイアウトアンマウントでも維持したい状態値であれば、React.Context に持たせて_app にマウント、そうでないものは Recoil で管理するのも一つ手かもしれません(この構成試して比較してはないですが、RecoilRoot を _app にマウントするよりも軽量になるかも知れません)ここは管理の複雑さと、記事本題のファイル分割観点のトレードオフになるんじゃないかと思います。

mya-akemya-ake

お返事ありがとうございます。後述されているようにReact.Contextで持たせることで十分に軽量なものができると思います。サンプルのLocalStorageに持たせるコードも1kBぐらいの増加なので、Recoilに比べれば十分に軽量なものは作れそうです。そのためそのトレードオフも十分にやる価値はあるものになると僕は思います。
本題とは関係ない箇所でしたが、追加でコメントいただきありがとうございます。

TakepepeTakepepe

いえ、とんでもないです!ご指摘ありがとうございます。getLayout はとくに、今回の本題と関連して Recoil と Conext の違いがでる点だと思うので、後日まとめたいと思います。