フロントエンド勉強会-23/11/15
NextJS 14リリース
- ターボパック:App & Pagesルーターで5,000件のテストに合格
- ローカルサーバーの起動が53%高速化
- 高速リフレッシュによるコード更新の94%高速化
- サーバーアクション(安定版):段階的に強化される変異
- キャッシュと再検証の統合
- シンプルな関数呼び出し、またはフォームでネイティブに動作
- 部分的なプリレンダリング (プレビュー):高速な初期静的レスポンス + ストリーミング動的コンテンツ
- Next.jsを学ぶ(新機能):アプリルーター、認証、データベースなどを学ぶ無料コース。
14に上げるか?
Amplifyが対応していない
Server Action使う前提で開発してきた
→ECS上でもデプロイできるので、14に上げた!
storybook7へのバージョンアップ
困った
storybook6.5.9の状態でyarn4に上げたところ、yarn4が邪魔してstorybookを7にバージョンアップできなくなっていた。
→ もうすぐ解決しそう
根拠
2023/10/30にv7.6.0-alpha.3がリリース
このリリースにyarn4への対応があるので、v7.6.0を待てばyarn4かつstorybook7未満のリポジトリでもバージョンアップ可能になる。
ちなみにnext14.0.0の対応も含まれてるから更新のいいポイントになる
[備忘録] useMemo の使いどき
コンポーネントの再レンダリングを抑えるために、メモ化という概念があるわけだけど
デバックツールで動きを見る感じ、useMemoしようがしまいが、再レンダリングが発生しなかった。
そもそも実装初期で、メモ化を検討ができていないので、知見を増やしておきたい
-
useMemo
: useMemoで囲まれた処理はレンダリング時に再計算をスキップする。依存配列に含まれた変数が変更されている場合のみ再計算する。 -
useCallback
: useMemoとほぼ同じ。レンダリング時に関数の生成をスキップする。依存配列に含まれた変数が変更されている場合のみ再計算する。 -
memo
: コンポーネントを囲む。useMemoのコンポーネント版みたいな感じ。props全てに変更がなければ再レンダリングをスキップする。(再レンダリングを防ぐためにはこれが使える)- 注意点としてシャローコピーである点が挙げられる。https://stackoverflow.com/questions/59280319/react-memo-rerendering-with-the-same-props
他にも方法としては以下があります。
-
useEffect
の排除(useEffectは全ての計算の最後に行われる。したがってuseEffectでstateを更新した場合、全ての計算がもう一度行われ、めちゃくちゃ高価なコストになる) - コンポーネントを細く区切る(自身に関係ないpropsを持たせないことで再レンダリングを防げる)
-
Context
の依存を最小限にする(Contextの値を変更したとき、Contextを使用するコンポーネントは全て再レンダリングされるため)
僕の知ってる範囲だとこんな感じですかね〜
ぶっちゃけ関数に関しては脳死でuseCallbackを使ったらいいかと。レンダリングごとに計算するより大体早くなります
useMemoは脳死でやるならプリミティブ以外に使ったらいいかなと。プリミティブのうち計算量が多いものなら囲むと早くなると思います。感覚でやるのは良くないので、プリミティブの計算については問題が起きてからちゃんと検証して実装でいいと思います。
親のコンポーネントの再レンダリングが多く、子コンポーネントは再レンダリングが不要な場合、無駄に子コンポーネントの再レンダリングが走るのでmemoで囲んであげると効果的です。
ありがとうございます
実際に動かしたときに、メモしてもしなくても、体感で遅さが目立たない場合ってどう選択しますかね?
この判断が結構悩んでるんですよね。
なので、画面のテストで、高い負荷をかけるしかないのかぁと思ったりしてます
ぶっちゃけスルーでいいと思います。気になるコードがあればchromeのCPUスロットルで性能を下げて見る事ができます。(一番上のno throttlingの部分)
もしくは時間の計測もいいかと思います。https://react.dev/reference/react/useMemo#how-to-tell-if-a-calculation-is-expensive
あとは一昨日slackで書いたようにwhy did you renderを使えば無駄なレンダリングが見れるのでしらみ潰しに無駄を排除するとかですかね〜https://github.com/welldone-software/why-did-you-render
[デザイン] ロゴ・アイコンのAI自動生成
経緯
一からデザインを考えるのは少し大変なので、AIにイメージを出してもらって、それらを参考に自分でデザインするという方法をとりたかった
試したもの
-
WIX
プロンプトを指定できなかったのでナシ -
stable diffusion
モデルとかプロンプト色々工夫してやれば一番期待できるものを出力してくれそう。
ただ、少し面倒 -
BRAND MARK
キーワードとか、カラースタイルとかに答えるだけでたくさん生成してくれる
モダンでシンプルなデザインを出してくれるし、
出力結果の編集(ColorやFontなど)も細かくできるのでwebサービスとの相性は良さそう
AIが生成したロゴの肖像権ってどうなる?
Material React Table V2を導入
V1から変更するメリット
- 無駄な再レンダリングが発生しなくなる
- 数値ベースのページネーションのデザインが可能になる
所感
- 機能的にオーバスペックすぎず、質素すぎない感じがいいかも
- MUI特有の型が多すぎて、ライブラリに依存しすぎてしまうため、型を抽象化する方法を探したい