Upgrade to Pro — share decks privately, control downloads, hide ads and more …

freee Tech Night #2 会計freee 7年目のフロントエンド開発

freee Tech Night #2 会計freee 7年目のフロントエンド開発

Takumi Ohashi

March 26, 2019
Tweet

More Decks by Takumi Ohashi

Other Decks in Technology

Transcript

  1. • ソシャゲ界出身 • 2014年12月入社 • フロントエンド寄りエンジニア • 社内でやってること ◦ 会計freeeの開発

    ◦ フロントエンド啓蒙活動 ◦ ボルダリング部部長 Takumi Ohashi / @_tohashi Webアプリケーションエンジニア 4
  2. 6 会計freee • 経理業務を始めとして請求書、ワークフロー管理など • 2013年ローンチ • first commit は2012年

    • モノリシックな Rails アプリケーション ◦ 一部機能はマイクロサービス化 • フロントエンドも同じリポジトリに
  3. 19 現在 • 主要な機能はほぼ ES2015~ / React に移行 ◦ SPAではなく、機能ごとに独立したエントリーポイント

    ◦ 一部は CoffeeScript / Backbone のまま • ESLint, Prettierによる静的解析とフォーマット • flowtypeによる静的型付け • Storybookによるコンポーネントカタログ • テストはJest, Storyshots
  4. 24 facebook/flux を使い続けた • flux が指すものは2つ ◦ 1. facebook が提唱したデータフローのアーキテクチャ

    ◦ 2. 1のリファレンス実装ライブラリ • 会計freeeでは2を使用している • Dispatcher を提供する flux と Container, ReduceStore を提供するflux-utils からな る非常に薄いライブラリ ◦ Redux で言うと Container = Provider, ReduceStore = Reducer
  5. 25 facebook/flux 導入の背景 • 2015年 React 導入時に flux 用ライブラリを選定 •

    当時 flux 系ライブラリが乱立 ◦ 既に Redux が頭一つ抜けてはいたが、ミドルウェア等のエコシステムへのロック インを危惧、薄い方がいいという判断
  6. 26 facebook/flux で起きた諸問題 • 治安の乱れ • 薄いゆえに色々できてしまう ◦ Component から直接

    Store を参照、単方向データフローの崩壊 ◦ Component と ActionCreator の密結合、dispatchの起点が不明瞭に • 今やマイナーなので書き方のサンプルがインターネットに少ない
  7. 27 昨年Reduxへの移行を検討するも... • 時既に遅し ◦ facebook/flux を利用したコードは膨大な量に ▪ 移行作業はActionCreatorとdispatchの分解が特にネック ◦

    facebook/flux と Redux が共存する移行期が長期に渡りそう • 2015年時点で facebook/flux を選んだのは完全に間違いではなかった(と思う) ◦ ただもっと早く全体を見渡して移行の判断を下すべきだった
  8. 28 facebook/flux でなるべく治安を保っていく • リファレンス実装の明示 • Lintで防げる箇所は防ぐ ◦ Container component

    以外で Action の import 禁止など • 実質社内フレームワークのようになっていってしまうリスクはあるが・・・
  9. 31 コンポーネントの状態をStoreで管理する • 例えば以下のような状態 ◦ モーダルの開閉 ◦ ローディング ◦ フォームの入力値

    • これらの状態を持つ UIStore を作って flux のデータフローに載せる ◦ ※ここで言う Store = Redux における Reducer です • コンポーネントの状態の変更も Action を通じて行う
  10. 42 ライフサイクル内でdispatchの悲劇 • UIStoreの変化タイミングを取るために、componentDidUpdate 等のライフサイクル で prevProps と比較 ◦ ライフサイクルから

    Action が dispatch される事態が多発 • facebook/flux では dispatch からの同一イベントループ内で再度 dispath を呼び出 すと例外が投げられる • コンポーネントの動作自体に影響はないと思いきや・・・
  11. 43 React16アップデート時の思わぬ障壁に • React16からはコンポーネント内で Uncaught Error が発生すると root まで遡ってコ ンポーネント全体が

    unmount される ◦ 表示上の不整合を防ぐための仕様変更 • Error Boundary を設定するか例外処理をちゃんとする • この場合そもそもライフサイクルから dispatch しない
  12. 48 そもそもReactで継承はすべきではない • ReactのコンポーネントはViewControllerではない ◦ MVCからの移行だとオブジェクト指向的に捉えがち • 常に同じ props から同じ

    DOM を生成するアトミックな関数 ◦ render という明確な主体 • 抽象化は別のアプローチで行う ◦ Higher Order Component ◦ Render Props ◦ children