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

Vuex to Pinia 大規模な状態管理ライブラリの移行戦略 / Vuex to Pini...

Vuex to Pinia 大規模な状態管理ライブラリの移行戦略 / Vuex to Pinia: Migration Strategy for Large State Management Libraries

Yappli Tech Conference 2024 登壇資料

connpass:
https://yappli.connpass.com/event/328754/

セッション動画(YouTube):
https://youtu.be/LUaoZaQQ0X0?si=s5DEnuHBn4kX7I7x

Yappli Developers

December 04, 2024
Tweet

More Decks by Yappli Developers

Other Decks in Programming

Transcript

  1. Speaker 開発統括本部 プロダクト開発本部 開発2部 フロントエンド2グループ ⻘⽊ 優弥 • 2023/11〜 実質新卒⼊社

    • フロントエンド3年⽣ • CMS Block UIプロジェクトを担当 • 趣味はCLIツール制作 🔧🔨 💻
  2. ⽬次 1. Yappliの概要とBlock UIについて 2. Yappliのフロントエンドについて 🛁 3. Block UIの現状の課題

    📝 4. Piniaへの移⾏計画 🐾 5. Piniaへの移⾏取り組み 🐾 6. 得られた学び 📖
  3. Block UIについて 01 Yappliの概要とBlock UIについて Block UI独⾃の機能: • Undo Redoが実⾏可能!

    • より直感的かつストレスフリーなアプリ制作ができる🥰
  4. Yappliの規模 02 Yappliのフロントエンドについて • コード⾏数   : 約 33 万⾏ • コンポーネント数:

    約 1,400 個 • ページ数    : 約 100 ページ • 開発者数    : フロントエンド4名 + バックエンド数名
  5. 使⽤技術 02 Yappliのフロントエンドについて • Nuxt 3.10.3 • Vue 3.4.27 •

    TypeScript 5.4.5 • Vuex 4.1.0 • etc... ※ 2024-8-15 時点
  6. 使⽤技術 02 Yappliのフロントエンドについて • Nuxt 3.10.3 • Vue 3.4.27 •

    TypeScript 5.4.5 • Vuex 4.1.0 • etc... ※ 2024-8-15 時点
  7. 状態管理の現状 03 Block UIの現状の課題 • Block UIに関連するファイルは7つ • 1ファイル最⼤で約3000⾏‧全体で6000⾏以上 •

    無理⽮理ファイル分割して、⼀部型エラーを握り潰して悪魔合体している • Vuexの⾃作プラグインでUndo Redoを実現している
  8. Vuex‧Piniaの違い 03 Block UIの現状の課題 Vuex • 単⼀のStore • モジュール単位での分割 •

    state, getters, actions, mutationsの4つの要素 Pinia • 複数のStore • Store単位での分割 • mutationsを廃⽌
  9. Vuex‧Piniaの違い 03 Block UIの現状の課題 Vuex • 単⼀のStore • モジュール単位での分割 •

    state, getters, actions, mutationsの4つの要素 Pinia • 複数のStore • Store単位での分割 • mutationsを廃⽌
  10. Vuex‧Piniaの違い 03 Block UIの現状の課題 Vuex • 単⼀のStore • モジュール単位での分割 •

    state, getters, actions, mutationsの4つの要素 Pinia • 複数のStore • Store単位での分割 • mutationsを廃⽌
  11. ⾟みポイント 03 Block UIの現状の課題 • 複数Storeに分割したい😭 ← Piniaに移⾏すれば分割できる! • 関⼼ごとにファイルを分けたい😭

    • Storeの全体像が掴みにくい😭 • データの流れが分かりづらい😭 • 全体のルールが曖昧でカオス😭
  12. ⾟みポイント 03 Block UIの現状の課題 • 複数Storeに分割したい😭 ← Piniaに移⾏すれば分割できる! • 関⼼ごとにファイルを分けたい😭

    ← オブジェクトを分割すればできる! • Storeの全体像が掴みにくい😭 • データの流れが分かりづらい😭 • 全体のルールが曖昧でカオス😭
  13. ⾟みポイント 03 Block UIの現状の課題 • 複数Storeに分割したい😭 ← Piniaに移⾏すれば分割できる! • 関⼼ごとにファイルを分けたい😭

    ← オブジェクトを分割すればできる! • Storeの全体像が掴みにくい😭 ← 分割‧整理すれば解決できそう • データの流れが分かりづらい😭 • 全体のルールが曖昧でカオス😭
  14. ⾟みポイント 03 Block UIの現状の課題 • 複数Storeに分割したい😭 ← Piniaに移⾏すれば分割できる! • 関⼼ごとにファイルを分けたい😭

    ← オブジェクトを分割すればできる! • Storeの全体像が掴みにくい😭 ← 分割‧整理すれば解決できそう • データの流れが分かりづらい😭 ← mutationsが廃⽌されシンプルに • 全体のルールが曖昧でカオス😭
  15. ⾟みポイント 03 Block UIの現状の課題 • 複数Storeに分割したい😭 ← Piniaに移⾏すれば分割できる! • 関⼼ごとにファイルを分けたい😭

    ← オブジェクトを分割すればできる! • Storeの全体像が掴みにくい😭 ← 分割‧整理すれば解決できそう • データの流れが分かりづらい😭 ← mutationsが廃⽌されシンプルに • 全体のルールが曖昧でカオス😭 ← 移⾏後に別途対応
  16. 移⾏後の理想 04 Piniaへの移⾏計画 • Storeの全体像が把握しやすく、データの流れも追いやすい ◦ 既存のコードが整理整頓されていて、可読性が⾼い ◦ 1ファイルのコード量が少ない •

    チーム内でルールが設けられていて、誰もが迷わず開発できる ◦ 記法や設計思想が統⼀されている ◦ ベストプラクティスが共有されている
  17. Block UIにおけるUndo Redoの仕組み 04 Piniaへの移⾏計画 Store Offscreen Store Future History

    Undo 最新のHistoryを Futureに移動 Historyを基に OffscreenStoreを構築
  18. Block UIにおけるUndo Redoの仕組み 04 Piniaへの移⾏計画 Store Offscreen Store Future History

    Undo 最新のHistoryを Futureに移動 OffscreenStoreを Storeに反映 Historyを基に OffscreenStoreを構築
  19. 現在の移⾏⽅針:⾃動化する 04 Piniaへの移⾏計画 • Vuex → Piniaの⾃動化スクリプトを作成 • リファクタリングは極⼒⾏わない •

    スクリプトの設計は作り込まない • 各Storeに個別最適化したスクリプトを実装する 作業の⾃動化 = 何回でもやり直せる!移⾏期間を最⼩限に!🤗
  20. Piniaへの移⾏取り組み 04 Piniaへの移⾏取り組み • 必要な作業の洗い出し • 必要な作業の⾃動化 • 具体的な進め⽅ ◦

    plopjsを⽤いてストアファイルのテンプレート⽣成を⾃動化 ◦ ts-morphを⽤いて移⾏作業を⾃動化
  21. Piniaへの移⾏取り組み 04 Piniaへの移⾏取り組み • 必要な作業の洗い出し • 必要な作業の⾃動化 • 具体的な進め⽅ ◦

    plopjsを⽤いてストアファイルのテンプレート⽣成を⾃動化 ◦ ts-morphを⽤いて移⾏作業を⾃動化
  22. Piniaへの移⾏取り組み 04 Piniaへの移⾏取り組み • 必要な作業の洗い出し • 必要な作業の⾃動化 • 具体的な進め⽅ ◦

    plopjsを⽤いてストアファイルのテンプレート⽣成を⾃動化 ◦ ts-morphを⽤いて移⾏作業を⾃動化
  23. plopjsを⽤いたテンプレート⽣成 04 Piniaへの移⾏取り組み - 具体的な進め⽅ • plopjsとは、ジェネレーターコマンドを作るためのライブラリ • npm run

    plop を実⾏するだけで、対話的に内容を指定‧カスタマイズして 必要なファイル群を⼀括⽣成することができる • 移⾏作業にも、今後の開発にも活かせる🥰 =実質的な命名規則‧構造のルール化
  24. ts-morphを⽤いた移⾏作業 04 Piniaへの移⾏取り組み - 具体的な進め⽅ • ts-morph は TypeScript Compiler

    API のラッパーライブラリ 1. TSファイルのスクリプトをAST(抽象構⽂⽊)に変換 2. ASTをもとに読み取り‧書き込みを⾏う 3. 変更後のASTからスクリプトを⽣成
  25. ts-morphを⽤いた移⾏作業 04 Piniaへの移⾏取り組み - 具体的な進め⽅ • Vueファイルにはコンパイルライブラリの @vue/compiler-sfc を併⽤ 1.

    @vue/compiler-sfc でSFCを解析してscripts部分を抽出 2. TSファイルと同様に処理を⾏い、読み書き後の内容で置換する