Slide 1

Slide 1 text

共通 Reactコンポーネントを 作ろう!!! ーJavaScriptでココロオドル人をふやすー Meguro.es #4 in Wantedly 高松 真平 (@shimpeiws)

Slide 2

Slide 2 text

シゴトでココロオドル 私は誰? 2 * 高松 真平 (@shimpeiws) * Webエンジニア @ Wantedly https://www.wantedly.com/users/544320

Slide 3

Slide 3 text

シゴトでココロオドル 目次 1 ここ最近のWantedly React事情 2 共通化の機運 3 Original -> OOP -> HoCs -> Decorator 4 まとめとこれから 3

Slide 4

Slide 4 text

1.ここ最近のWantedly React事情 4

Slide 5

Slide 5 text

シゴトでココロオドル * RailsプロジェクトにReact + Reduxなスタックを導入 * とりあえずモダンになった * 戦いはこれからだ、的な展開 前回までのお話 5

Slide 6

Slide 6 text

シゴトでココロオドル 最近のシゴト 6 * 大規模なReact + Reduxプロジェクト → 11000 lines!!! * 社内(とちょっと外部)の勉強会 → React + Redux速習会 * エモいブログも書いた → なぜ React か? 173はてブ!!! 138ストック!!!

Slide 7

Slide 7 text

シゴトでココロオドル コンポーネントが増えました 7 * 大規模な開発だったので、かなりの勢いで書いた * 布教活動の成果もあり、書く人数も増えた * 結果: コンポーネントが104個まで増えた

Slide 8

Slide 8 text

2.共通化の機運 8

Slide 9

Slide 9 text

シゴトでココロオドル リストから選択するダイアログ、似ているようでちょっとずつ違う... SelectBoxという共通コンポーネント 9

Slide 10

Slide 10 text

シゴトでココロオドル インターン生の悲痛な叫び、ごめん... リファクタリングがしたいです! 10 SelectBox辛いです... まだ行けるでしょ 早すぎる最適化は... そんなやりとりを何回か繰り返し... リファクタリングが したいです!!! お、おおう... (レビュー辛くなってきた)

Slide 11

Slide 11 text

シゴトでココロオドル Issueがたった!!! 共通コンポーネントの設計 11

Slide 12

Slide 12 text

3.Original -> OOP -> HoCs -> Decorator 12

Slide 13

Slide 13 text

シゴトでココロオドル SelectBoxの縮小版を実装します Original -> OOP -> HoCs -> Decorator 13 * 4パターンの実装を用意 * Original → 最初に作った実装 * OOP → Productionで稼働中 * HoCs → 高階Componentを使う実装 * Decorator → ContextをDecorateする * ソースはこちら * shimpeiws/js-playground (GitHub) * src/react/components/selectBox 配下 * 書きかけ多くてすみません...

Slide 14

Slide 14 text

シゴトでココロオドル Original 14 * BaseComponentを継承して、差分をサブクラスに実装する * オーバーライトして欲しいメソッドにはコメント * 差分の吸収はpropsでフラグを渡す 使う側 BaseComponent

Slide 15

Slide 15 text

シゴトでココロオドル 悪い予感はしていたが、これでいけるのではと思っていました Original 15 * pros * 単純 * ちょっとしたものならばこれでOK * 正直共通化を考えていなかった * cons * 増え続けるフラグ用のprops * View(Render)の拡張に特に難がある * オーバーライドに無理を感じる

Slide 16

Slide 16 text

シゴトでココロオドル OOP 16 * 最もシンプルな形をBaseComponentにする * View・ロジックの差分はStrategyパターンで外から渡す * 検索欄など付加的な要素はDecoratorパターンでPluginにする 使う側 Strategy BaseComponent Strategy経由で 呼び出し

Slide 17

Slide 17 text

シゴトでココロオドル OOP 17 * 最もシンプルな形をBaseComponentにする * View・ロジックの差分はStrategyパターンで外から渡す * 検索欄など付加的な要素はDecoratorパターンでPluginにする Strategy Viewは 子コンポーネント Plugin Decoratorで 連結可能 Stateを拡張

Slide 18

Slide 18 text

シゴトでココロオドル ‘オブジェクト指向のこころ’は素晴らしい本ですね OOP 18 * pros * 硬派、OOPが分かっていれば理解できる * 外からViewもロジックも渡すので柔軟 * 現実解としてかなり優秀 * cons * Strategy・View・Item、ファイルが多い * npmで公開するものを作るのは無理 * デザパタはやっぱりJavaかな...

Slide 19

Slide 19 text

シゴトでココロオドル Higher Order Components (HoCs) 19 * HoCsでmixin的な動きを実現する * Componentを受けて元のComponentをextendsしたComponentを返す * 参照: ReactのHigher-order Component(HoCs)という概念に関するメモ by @inuscript HoCs mixinされる メソッド Componentを 拡張

Slide 20

Slide 20 text

シゴトでココロオドル Higher Order Components (HoCs) 20 * HoCsでmixin的な動きを実現する * Componentを受けて元のComponentをextendsしたComponentを返す * 参照: ReactのHigher-order Component(HoCs)という概念に関するメモ by @inuscript Base Component propsから mixinを呼べる 使う側 HoCsで 拡張

Slide 21

Slide 21 text

シゴトでココロオドル なんだかオトナになった気分です Higher Order Components (HoCs) 21 * pros * 分離もよく、かなりすっきり書けた * 余計なインタフェースが増えなくていい * 一度書けば難解さも感じない * cons * 最初何が起こっているのか分からない * Plugin的な仕組みをどう作るか * this問題 (設計の問題な気はしている)

Slide 22

Slide 22 text

シゴトでココロオドル Decorator 22 * ES6 DecoratorsでReactのcontextを拡張する * 各ComponentでContextを定義してロジック・Viewを分ける * 参照: Extending Behavior of React Components by ES6 Decorators & Higher Order Components 中はHoCs @context 使う側

Slide 23

Slide 23 text

シゴトでココロオドル Decorator 23 * ES6 DecoratorsでReactのcontextを拡張する * 各ComponentでContextを定義してロジック・Viewを分ける * 参照: Extending Behavior of React Components by ES6 Decorators & Higher Order Components ItemSelectBox contextを定義 decoratorを 適用

Slide 24

Slide 24 text

シゴトでココロオドル DecoratorとContext、ムズカシイです Decorator 24 * pros * Decorateするだけで拡張できる * ContextのDecorator部分は一度書くだけ * Contextに分離できるので見通しが良い * cons * Contextの仕組みがそもそも複雑 * stage-0...

Slide 25

Slide 25 text

4.まとめとこれから 25

Slide 26

Slide 26 text

シゴトでココロオドル まだまだ戦いは続く!!! まとめとこれから 26 * まとめ * OOPは現実解として良いと思う * HoCsはReactで共通コンポーネントを作る なら知っておくべきテクニック * 共通化は計画的に!!! * これから * SPAの品質保証どうする、という重い問題 * 次はテストかな...

Slide 27

Slide 27 text

シゴトでココロオドル モダンな環境でReactを書きたいエンジニアWanted!! We are hiring 27 https://www.wantedly.com/projects/51709