Slide 1

Slide 1 text

© DMM.com Think!FrontEnd #1 React + Redux: Re-Architecture Hironori Akaishi 合同会社DMM.com オンラインサロン事業部

Slide 2

Slide 2 text

© DMM.com Hironori Akaishi / クマチャン 合同会社DMM.com 19年新卒入社 フロントエンドエンジニア オンラインサロン事業部 @isytter

Slide 3

Slide 3 text

© DMM.com 会員制のクローズドなコミュニティであるオンライン サロンのプラットフォーム ・サロン管理、会員管理 ・専用コミュニティ

Slide 4

Slide 4 text

© DMM.com 会員制のクローズドなコミュニティであるオンライン サロンのプラットフォーム ・サロン・会員管理 ・専用コミュニティ

Slide 5

Slide 5 text

© DMM.com TypeScript・Hooks化 Agenda Reduxアーキテクチャの変更 Hooksでのユニットテスト パフォーマンス 今後のDMMオンラインサロン

Slide 6

Slide 6 text

© DMM.com TypeScript・Hooks化

Slide 7

Slide 7 text

© DMM.com Hooks is なに フック (hook) は React 16.8 で追加された新機能です。state などの React の機能を、 クラスを書かずに使えるようになります。 公式ドキュメントより : https://ja.reactjs.org/docs/hooks-overview.html

Slide 8

Slide 8 text

© DMM.com ・Classコンポーネント/recomposeの混在 ・フルJavaScript ・テストカバレッジ0% ・React + Redux + Redux-Saga ・moducks(ducks+Sagaを実現するユーティリティ) 配属時の構成・問題

Slide 9

Slide 9 text

© DMM.com ・型が無い(ライブラリ側で型が用意されていない) ・saga v1.0.0-beta.1以上にあげられない ・case変換してActionTypeからActionが作られるので型定義を用意するのが難しい moducks

Slide 10

Slide 10 text

© DMM.com JSからTSにするときにありがちなのが、どうしても型付けできず にanyが入りこんてしまう サロンの場合はReduxがModucksに完全に依存しているので Reduxが絡むとこは確実にanyになる TypeScript・Hooks化

Slide 11

Slide 11 text

© DMM.com TypeScript・Hooks化 any型が入り込んだものを扱う型を定義 想定している型をGenericsに渡しておくことで 後々の修正が容易になる

Slide 12

Slide 12 text

© DMM.com TypeScript・Hooks化 ATOMS Atomic Designの場合 MOLECULES PAGES・ORGANI SMS ・Hooksにしていく場合、部分的に変えていくことができない ・1コンポーネントを1度で修正しないといけない ・進め方を間違えるとリファクタが難しくなり、今までのコードをただ HooksやTypeScriptにするだけしかできなくなる ・いきなりページ単位でTypeScript・Hooks化していくのは難しい ・スクラム開発だと見積もりにブレが出やすい、想定してない変更が出てくる ・依存関係が少ないものを先にTypeScript・Hooksにしていく ・AtomicDesignだとAtoms→Molecules→ページごとにするとスムーズにいきやすい

Slide 13

Slide 13 text

© DMM.com Reduxアーキテクチャの変更

Slide 14

Slide 14 text

© DMM.com ・moducks配下に全てのロジック ・sendersにデータ更新、作成系 ・viewsにデータ取得系 いままでのアーキテクチャ

Slide 15

Slide 15 text

© DMM.com ・ドメインロジックはEntities配下 ・各ドメインごとにaction、reducer、sagaファイル ・元々の構成がReduxで状態を持ちすぎていた →entities内にロジックを閉じ込める ・Redux-Sagaは、のちのちツライ.... ・副作用系がSagaに依存してしまうのでリファクタや今後の置 き換えが難しい 新しいアーキテクチャ

Slide 16

Slide 16 text

© DMM.com ・カスタムhooksに副作用系を集める ・UI(Component)側に寄せつつ、UIにロジックを持ち込まない Hooksベースのアーキテクチャ

Slide 17

Slide 17 text

© DMM.com Hooksのユニットテスト

Slide 18

Slide 18 text

© DMM.com Hooksのユニットテスト enzyme ・Reactコンポーネントのユニットテストの定番 ・Shallow Rendering機能で子コンポーネントへ影響を気にせず、テストをコンポーネント内に制限する ことができる

Slide 19

Slide 19 text

© DMM.com Hooksのユニットテスト enzyme ・Reactコンポーネントのユニットテストの定番 ・Shallow Rendering機能で子コンポーネントへ影響を気にせず、テストをコンポーネント内に制限する ことができる Hooksとの相性が悪い Shallow Rendering時にuseEffectを呼び出せないなど問題がある

Slide 20

Slide 20 text

© DMM.com Hooksのユニットテスト React Testing Library(@testing-library/react) ・ユーザがコンポーネントを使用するようにテストが設計されreact-dom/test-utilsをラップしたライブラ リ ・jestのカスタムマッチャである@testing-library/jest-dom、Custom Hooks用のテストユーティリティ @testing-library/react-hooksと一緒に使うと便利 enzymeのように実装をテストするライブラリに比べるとシンプルに書くことができる

Slide 21

Slide 21 text

© DMM.com https://kumaaaaa.com/react-testing/ React Hooks Testing - BLOG

Slide 22

Slide 22 text

© DMM.com テスト方針 コンポーネントのユニットテストは頑張らない選択肢が大事 ・そもそもフロントエンドは変更が多い ・労力に対して、見返りが少ない テストの「選択と集中」を決める ・比較的変更が少ない、Atoms・Moleculesを中心にテストをする ・機能はe2e、UIはVRTで担保する

Slide 23

Slide 23 text

© DMM.com パフォーマンス

Slide 24

Slide 24 text

© DMM.com Reactのパフォーマンス最適化方法はいろいろ ・不要な再レンダリングを防ぐ ・code splitting ・cache ・service worker ・react-query ・prefetching ・Quicklink

Slide 25

Slide 25 text

© DMM.com Reactのパフォーマンス最適化方法はいろいろ ・不要な再レンダリングを防ぐ ・code splitting ・cache ・service worker ・react-query ・prefetching ・Quicklink

Slide 26

Slide 26 text

© DMM.com パフォーマンス useSelector React Redux v7.1.0から追加されたHook API connectを使ったHOCを使わずにRedux Storeか らデータを取得できる

Slide 27

Slide 27 text

© DMM.com useSelector Actionがdispatchされると、Selectorの結果を以 前のものと比較して、再レンダリングする →不要な値をSelectorで返さないようにする connectとは違い、Propsが変わっていなくても親 の再レンダリングの影響をうける →React.memoでラップすることを意識する

Slide 28

Slide 28 text

© DMM.com 今後のDMMオンラインサロン(宣伝)

Slide 29

Slide 29 text

© DMM.com オンラインサロン市場の急成長、ビジネスニーズの拡大にレガシーシステムが要求に耐えづらくなりつつあ る... 今後のDMMオンラインサロン

Slide 30

Slide 30 text

© DMM.com マイクロサービス化予定

Slide 31

Slide 31 text

© DMM.com ・Next.js ・Go ・EKS or ECS Fargate etc…. 技術スタック(予定)

Slide 32

Slide 32 text

© DMM.com Thanks Illustrated by Streamline Lab(https://lab.streamlineicons.com)