気になったTech系記事/イベントをまとめていくScrap
Hrajuku.ts Recoil勉強会
イベント概要
※ ailead では recoilも部分的に用いられている
Uhyoさん
要約
- Fluxは天才だった
- Recoilならやり直せる
内容
UIを構築する以外の仕事はReactにはやらせたくない
コアな状態は少なければ少ないほどよい
描画以外の部分をRecoilにやってほしい
Recoil
atom: 自身で樹応対を保持する
selector: 他の状態を見て計算する
非同期ネイティブ
ロジック用のReactのような使い心地
- イミュータブル・冪等性が前提のAPI
- 計算結果の一貫性の保証
atom と selector の使い分け
他に従属しない状態がatom それ以外は何が何でもselecotor
検索画面
検索条件:atom
ページ数:atom -> Userが独立して変更できる
検索結果:selector -> 上記2つから計算できる
ページネーションがカーソルだと迷う?
使い方は基本的にhookベース
データフローグラフ
atomから始めるデータの流れがRecoilのAPIを用いて定義される
Recoil層からの入力は基本的にコア状態の変更として作用させる
入力用フックを介して、コア状態を更新する。
ユースケースに応じた個別の入力用フックがある
Recoilを使う場合は、React層にはいる前に計算が終わっている
よさ
Reactにロジックを載せると、整合性を保つのが難しくなる
整合性保証
Reactの整合性保証:状態→画面の整合性
Recoilの整合性保証:グラフ→状態の整合性
Recoilを活用するデータフロー設計
シンプルローレベルなAPIから構成されているとkろ
Reactより無理が聞かないので、望ましい設計を保ちやすい
Yoshikoさん
SPAにおける3種類のStateの分類
状態
- Global State : Componentを超えて / LifeCycleを超えて共有する必要のある状態
- Server Data Cache : サーバーデータのキャッシュ
- Global State' : 上記以外
- Local State : Componentに閉じた状態
それぞれに適したLib
ServerDataCache -> SWR, ReactQuery
GlobalState -> Recoil
LocalState -> React
使い方
ピュアなGlobalStateとしての使い方
APIも9割程はatom
- 置き場所・命名のルール
-
src/globalStates
以下に置く。1Stateあたり1ファイル - ファイル名がRecoilのKeyになっている
- 露出させるインターフェイスのルール
- RecoilのAPIを直接露出させず、Read用, write用のカスタムフックのみを露出させる
- ライブラリの知識を隠蔽できる
- Write操作に意味を付けられる
- state更新の意味合いをstate側から提供し、使い方を限定できる
※腐敗防止層は、主要なライブラリについては、全て入れている
- Readhook
- 大体useRecoilValueをラップしているだけ
- WriteHook
- 関数のまとまりをExportしている
- 動作に専用の関数を入れている
- 関数は必ずメモ化する(使う側でdepsに入れることを想定している)
- 任意のusecaseから呼び出し可能
- callback ルール
- useRecoilCallback
atomへのsubscribeは発生させたくないけど、atomの値だけを取得したい場合
おやくそく
ナレッジワークス、採用しているよ
Okunoさん
状態は管理したくない。
状態とは
- ユーザーのログインの状態
- フォームの入力値
- GUIの表示状態
状態の管理はどこ?
- LocalStorage, SessionStorage
- URLSearchParams
- IndexedDB
- 状態管理API, ライブラリ
- useState(), useRef()
状態の多さ - アプリケーションの複雑さ
状態の多いアプリケーションは複雑である
状態の多さは表示要素の多さではない
DBにて永続されたものであれば、状態は複雑地鳴り内
状態管理 = キャッシュではない
- fetchしたばかりのデータを状態管理に入れない
SWRを使おうよ
思考停止でオレオレキャッシュを実装しない
状態管理とキャッシュ戦略は異なる概念
キャッシュ:表示の高速化、リクエストの削減によるコスト削減
状態管理:永続化されない状態の管理
仕組みづくりはオンボーディングコストから
チームメンバーの出入りが起こるのだれば、オンボーディングコストをむやみに上げるのは得策ではない
チーム加入直後から高生産性を発揮させられるか
前任者の離脱以降もメンテナンスを維持できる?
キャッシュ以前にfetchをへらす
- fetchした値はそのままコンポーネントの必要箇所にバインディングして描画すれば十分
- コンポーネント再描画で発生する通信はブラウザを信じてガンガン実行
- そもそもReact自体をよく学習し、冗長なコンポーネント再描画をへらす努力をする
- MSW
Recoilはいつ使うのか?
- gui は useStateで十分
- react-hook-form
- 複数のページをまたいで使用する状態はURLSearchParamsを検討する
- エンドユーザーによってブックマークされうるページか
- LINEのようなメッセージアプリで共有されるか?
- ブラウザの戻る機能を併用された時、どうするか?
じゃあいつRecoilを使う時
- Propsバケツリレーがあまりにも頻繁で生産性・可読性とも低下を実感する時
- 全ページで必ず利用する情報があるとき
contextの代用品としての利用法
RecoilSelectorはつかわない
- contextの代用品という立ち位置なので、Contextの代用以外のことはしない
- RecoilSelecorの使い方のルール周知が難しい
- Reactの一般スキルさえあれば、開発できるような状態を作っている
useRecoilStateの扱い方
コンポーネント無いでいきなりうせRecoilStateを呼ばないようにしている
理由
- useRecoilStateのを扱う処理のテストをコンポーネントなしに実施するため
@packageっていうUhyoさん作成のライブラリがとても便利
@na2hiroさん
Recoilと将棋ったー
100種類以上の変速将棋を実施できる
TechStack
- Remix
- React
- Recoil
その前は、PHP, 生JSだった!
構成
React Router. Remix
- ページ遷移 / URLから派生する状態
- URL
- writeリクエストのハンドリング
Recoil
- 将棋板
盤の表示
棋譜をatomに定義
board
コマの可動域の表示→掴んだコマの座標をatomを定義
可動域はselector
掴んだコマを話すには
同じところをクリックし直すと、コマを話したい
愚直にやるなら、座標クリック時に、同じ座標を選択済みかどうかを確認
コアなatomを一つ用意して、それに対するラッパとしてselectorを用意する
hook の形でlogicをカプセル化することもでkる
棋譜の再生
手数→atom
「RecoilRootごとに異なる状態をもたせられる」という発想
QA
Q:selectorの中でfetchできるが、やるか?でテストはどうするのか?
uhyoさん
cacheをrecoilに頼るのが正しいのか?という概念がある
selector単位でUnitテストする
fetchのmockはgqlのレイヤでmockを挟んでいる。gqlクライアントがモックしてくれる
na2hiroさん
Remixに全て任せている
httpRequestを使っている
Shogitterでは一切Unitテストを書いていない。CypressでE2Eしている
fetchのmockをどうするか次第
Q:サーバーからデータを取得する部分をどうするのか?取得したときのデータを編集したときどうするのか?
uhyoさん
Userが編集する場合、それはatomにしないといけない。
依存先の値が変わったときにresetされるatom
依存先のselectorの値が変われば、自分自身の値が書き換わるatomを用意することができる
Q:Recoilでテストを用意するとき、結果の検証時はRecoilそのものの値をみるのか、Component側をみるのか
Recoilの状態を直に見に行くとホワイトテスト的になるが、そこはどうなのか?
okunoさん
テストでは、RTLとmswを使っている。
runRenderHooks?みたいな関数を自分で作っている。
RecoilRootをRTLの中で呼ぶようにしている。
結合テストっぽく、外部から見ている
jestのtestで、recoilのstateを抜き出している。
Q:Recoilが辛くなる性質のアプリ、使わない理由があれば
uhyoさん
UI層で扱うべきStateがあれば、それはRecoil使わない
Recoilはロジックを書くものと想像している
okunoさん
Recoilがすたれたらどうしますか?→周りが使わなくなったら、、
2022/12/08
デザインシステム構築の第一歩 〜takanoripさんとSakitoさんに学ぶ
まとめ
- デザインの必要性を価値の部分まで落とし込んで説得できている
- デザインチームのサイクルを開発サイクルと揃えている
メモ
始め方
Ubie
デザインの再現性のコンポーネント化から初めて、それをまとめたものをデザインシステムとした
デザインシステムを最初から目的にしていたわけではない
Cybozu
手段としてのデザインシステム
1ヶ月くらいでみんなで勉強して、みんなの目線を揃える
6人くらいのチーム
ボタンから 1コンポーネントから
会社の中での位置づけ
Cybozu
チーム立ち上げの時期な期限とかは特に無い
必要であることを十分に説明
Ubie
特にマネージャーはいない
やるかどうかの判断は
技術投資に対するハードルは高い
事業成長に直接的につながらない技術投資にたいしては、慎重になりがち
チーム構成
Ubie
デザイナー+デザインシステムで構成
全員兼業メンバー
デザインエンジニアは、デザイン+実装までやる
Cybozu
マネージャーは居ない
DesignTechnologistが主体のチーム
兼任のメンバーもいるが、ほぼ主務
デザインシステム以外もやっている
デザインから実装まで。プロトタイプ作ってプロダクトに入れるところまで
デザインシステムの認知
Ubie
デザインシステムのReturn
- 作業効率Upで節約される時間
- デザインの一貫性がプロダクトのメトリクスに与える影響
ビズサイドへの共有
デザインComponentの置き換えが大変だった。
置き換えの最中にも新しいComponentが発生したりする。
Cybozu
ボタン単位から初めて少しずつコンポーネントを置き換える
置き換えは自分たちでやってしまう
PRをだす、QAの人もチームがいるので、プロダクトチームからするとマージするだけ
コンポーネントが入っていくと、デザインシステムに依存するようになる。
<移動の関係で、以降は聞けず、、、>
質問
- デザインによる価値向上はどのように計測される?
- OKRへの落とし込み方
- 経営メンバーとの共有?
- Ubieでは一応報告はしていて把握しているはずだが、承認を得る必要はない
- デザインチームもなくそのオーナーもいない。
- サークル「デザ価値」サークルのリードが決める
- デザインシステムやっていく胆力
- マネージャーが居ないから楽ということはない
- むしろ自分たちでやっていく必要がある
- デザインシステムの浸透
Related Contents
Flutterアプリにおける、過不足ない設計の考察