Slide 1

Slide 1 text

© Link and Motivation Group Vue3プロジェクトで swrvの導入に挑戦してみた! リンクアンドモチベーション プラットフォーム推進グループ 下田 裕介

Slide 2

Slide 2 text

2 © Link and Motivation Group シモディ 下田 裕介(@_4mdy) 株式会社リンクアンドモチベーション プラットフォーム推進グループ ● 2020年新卒入社 ● 入社以来ずっとモチベーションクラウド開発に従事 ● フロントエンドメインだけどバックエンドも書くよ ● プロダクトマネジメントもやる ● 「赤から」と「Coco壱」が好き 自己紹介

Slide 3

Slide 3 text

モチベーションクラウド 診断 変革 ※ 2022年度 実績 10,060 社 312 万人

Slide 4

Slide 4 text

4 © Link and Motivation Group 今日の目的 apiのパフォーマンス面でのFEの課題や propsバケツリレーで冗長になっていたFEコードを swrvを導入することでどう改善したかを伝えること。 ※時間も短いので、swrvの細かい仕様については触れません。

Slide 5

Slide 5 text

5 © Link and Motivation Group アジェンダ ● 前提 ● 導入プロセス ● 総括

Slide 6

Slide 6 text

6 © Link and Motivation Group アジェンダ ● 前提 ● 導入プロセス ● 総括

Slide 7

Slide 7 text

7 © Link and Motivation Group swrvについて ● swrvは、SWRをVue.jsアプリケーションに適応するための ライブラリである。 ● SWR(Stale While Revalidate)とはキャッシュ戦略の1つ。 ○ Stale = キャッシュが古くなった状態 ○ Revalidate = キャッシュを新しくする ● データfetchだけでなく更新処理でもキャッシュ機能が利用可能。 ● 定期ポーリングやフォーカス時の自動再検証もやってくれる。 => キャッシュ機能以外にも使える!

Slide 8

Slide 8 text

8 © Link and Motivation Group SWR(Stale While Revalidate)について ● 既存のキャッシュを返しつつ、 裏側でサーバー通信を行う。 ○ 新しいデータを取ってくるまでは、キャ ッシュデータがすぐに描画される。 ○ 通信エラーの場合もキャッシュを返却。 => 初回読み込み以降は、自動的に最新の情 報を反映し続けられるのが利点。

Slide 9

Slide 9 text

9 © Link and Motivation Group なぜswrvを導入したのか ページ描画時に複数の同一apiを叩いていて 通信量が増えていた。 取得したコンポーネントで Propsバケツリレーが発生していた。

Slide 10

Slide 10 text

10 © Link and Motivation Group なぜswrvを導入したのか ページ描画時に複数のapiを叩いていて 通信量が増えていた。 取得したコンポーネントで Propsバケツリレーが発生していた。 パフォーマンス面の 課題 コードの複雑性の 課題

Slide 11

Slide 11 text

11 © Link and Motivation Group 理想の状態 ページコンポーネントで一括fetchして propsバケツリレーになるのは嫌。 データを利用するコンポーネントから、 fetchしたいが、呼び出し数がネック。 => swrvを使うことで、各コンポーネント から同タイミングで呼ばれるfetchをまとめ てもらいたかった。

Slide 12

Slide 12 text

12 © Link and Motivation Group アジェンダ ● 前提 ● 導入プロセス ● 総括

Slide 13

Slide 13 text

13 © Link and Motivation Group 導入プロセス① 導入準備 対象api選定 api置き換え キャッシュ 設定 検証・測定 ● swrvをいきなり全てのapiに適応するのではなく、一部のapiで実際に試して 開発者体験/ユーザー体験がどう変わるのかを検証してみた。 ● Rails側でCache-Controlヘッダーの設定値を変更する。 ○ max-ageの設定(当初はmax-age=0) ○ stale-while-revalidateの設定(当初はmust-revalidate)

Slide 14

Slide 14 text

14 © Link and Motivation Group 導入プロセス② 1️⃣影響範囲の少ないapi 2️⃣呼び出し重複が存在するapi の2つの観点で洗い出した。 => 影響範囲が少なく、結果が出やすい箇所を事前に洗い出して、実装を始めた! 導入準備 対象api選定 api置き換え キャッシュ 設定 検証・測定

Slide 15

Slide 15 text

15 © Link and Motivation Group 導入プロセス③ Before(置き換え前の状態) ● 他ライブラリへの移行も見据えて、PureなTypeScriptでapiを実装していた。 ● swrvはVueのインスタンスの中でしか使うことができない。 導入準備 対象api選定 api置き換え キャッシュ 設定 検証・測定

Slide 16

Slide 16 text

16 © Link and Motivation Group 導入プロセス③ After(置き換える際に対応したこと) ● Vueのwatch, computed等の機能を用いてuseSWRVを利用して実装。 ● レスポンスのdataからリアクティブなentityを作成する。 導入準備 対象api選定 api置き換え キャッシュ 設定 検証・測定

Slide 17

Slide 17 text

17 © Link and Motivation Group 導入プロセス④ 困ったこと ● キャッシュの設定値(useSWRVの第3引数)が細かくて違いがわかりづらい。 ○ dedupingIntervalとrevalidateDebounceの違いは? ○ ttlとserverTtlの違いは? 導入準備 対象api選定 api置き換え キャッシュ 設定 検証・測定

Slide 18

Slide 18 text

18 © Link and Motivation Group 導入プロセス④ 設定だけでもこれだけ存在する。。。 (これでもvercel/SWRと比べると少ない)

Slide 19

Slide 19 text

19 © Link and Motivation Group 導入プロセス④ 意識したこと・取り入れたこと ● dedupingInterval(当該時間内の同一キーリクエストの重複排除)の値は 初期値よりも多めに設定。 ● revalidateOnFocus(windowsのfocus時の再検証)はfalseにして、 自動取得はoffに。=> 逐次更新が必要なアプリは、自動更新が活きてくるはず 導入準備 対象api選定 api置き換え キャッシュ 設定 検証・測定

Slide 20

Slide 20 text

20 © Link and Motivation Group 導入プロセス④ 導入準備 対象api選定 api置き換え キャッシュ 設定 検証・測定 Before ● 4つのapiが同時に呼ばれていた。。 ● 合計1.5秒程度かかっていた。。 ● キャッシュも効いていない。。

Slide 21

Slide 21 text

21 © Link and Motivation Group 導入プロセス④ 導入準備 対象api選定 api置き換え キャッシュ 設定 検証・測定 After ● apiがまとめられた! ● キャッシュも効いて、200ms前後に! ● 先にキャッシュが返ってきて、そのあと サーバーにデータを取得できている!

Slide 22

Slide 22 text

22 © Link and Motivation Group アジェンダ ● 前提 ● 導入プロセス ● 総括

Slide 23

Slide 23 text

23 © Link and Motivation Group ● vercel/swrとほぼ同等の機能が利用可能に! ● SWR・キャッシュ以外の機能も熱い! ● 軽量でバンドルサイズにも影響がほとんどない! ● 公式ドキュメントしか情報がほとんどない状態なので、コミュニティでどんどん意見交 換しましょう

Slide 24

Slide 24 text

24 © Link and Motivation Group ● vercel/swrとほぼ同等の機能が利用可能に! ● SWR・キャッシュ以外の機能も熱い! ● 軽量でバンドルサイズにも影響がほとんどない! ● 公式ドキュメントしか情報がほとんどない状態なので、コミュニティでどんどん意見交 換しましょう Vueユーザーなら即swrv

Slide 25

Slide 25 text

25 © Link and Motivation Group お知らせ ● エンジニアリングマネージャー ● プロダクトマネージャー ● テックリード ● サーバーサイドエンジニア ● フロントエンドエンジニア ● SRE ● データエンジニア ● CRM ● UXデザイナー 週1でテックブログ更新しています! まずはカジュアルにお話しましょう! ご連絡お待ちしております! 全職種、積極採用中です!