Slide 1

Slide 1 text

30万 行 を超えるCMSの Nuxt 3 移 行 戦略

Slide 2

Slide 2 text

Speaker プロダクト開発本部 開発2部 フロントエンドグループ フロントエンドエンジニア 小 林 洋介 2021年12 月 からヤプリで働くフロントエンド5年 生 。Yappliの管理画 面 とデザインシステムの開発を している。 写真📸コーヒー☕キャンプ🏕 @k0n_karin

Slide 3

Slide 3 text

01 02 03 04 Yappliのフロントエンドについて🛁 アップデート計画🤔 アップデート前準備💪 得られた学び📚

Slide 4

Slide 4 text

01 Yappliの フロントエンドについて🛁

Slide 5

Slide 5 text

0 1 Yappliのフロントエンドについて Yappliのフロントエンド業務 Yappliの主なフロントエンド領域はアプリを作る管理画 面 です。 例えば… • 既存機能の運 用 や保守 • 新機能の提案や開発 • Storybookを 用 いたデザインシステムの構築 • etc.

Slide 6

Slide 6 text

0 1 Yappliのフロントエンドについて Yappliのフロントエンド業務 Yappliの主なフロントエンド領域はアプリを作る管理画 面 です。 例えば… • 既存機能の運 用 や保守 • 新機能の提案や開発 • Storybookを 用 いたデザインシステムの構築 • etc.

Slide 7

Slide 7 text

プロダクトの規模 • コード 行 数:約 33 万 行 • コンポーネント数:約 1,400 コンポーネント • ページ数:約 100 ページ フロントエンド5 人 と 一 部のバックエンド数 人 で 支 えている 0 1 Yappliのフロントエンドについて

Slide 8

Slide 8 text

使ってる技術 • Nuxt 2 . 1 5 . 8 • Vue 2 . 6 . 1 4 • @nuxtjs/composition-api 0 . 3 2 . 0 • TypeScript 4 . 2 . 4 ※2023-09-15時点 0 1 Yappliのフロントエンドについて

Slide 9

Slide 9 text

02 アップデート計画 採 用 しているNuxt 2 について 2023年末でサポートが終了😭 年内にNuxt 3 にアップデートする必要がある。

Slide 10

Slide 10 text

02 アップデート計画🤔

Slide 11

Slide 11 text

02 アップデート計画 取り組むこと 1 . アップデート前の準備 2 . Nuxt 2 . 1 7 へのアップデート 3 . Nuxt Bridgeの導 入 4 . Bridgeの段階導 入 5 . Nuxt 3 へのアップデート

Slide 12

Slide 12 text

アップデート前の準備 Nuxt, Vue 共に破壊的変更が結構ある。 プロダクト規模も前述の通りのため、 入 念に事前調査しながら、 アップデート前に対応できる変更や依存関係の整理から取り組 む。 02 アップデート計画

Slide 13

Slide 13 text

Nuxt 2 . 1 7 へのアップデート 2023年頭にNuxt 2 . 1 6 がリリースされ、続いて2.17もリリースされ た。後続のNuxt Bridgeに向けアップデートが必要。他にも • Vue 2 . 7 (script setup, Composition API) • Node.js 2 0 +をサポート など、年内をNuxt 2 で戦うための重要なアップデート。 02 アップデート計画

Slide 14

Slide 14 text

Nuxt Bridgeの利 用 プロダクト規模もそれなりのため、アップデート作業には 工 数が かかる上に相応のビジネスリスクも伴うため、切り戻しやすいよ うに段階的に進めたい。 Bridgeがあれば、途中で3直 行 もできるため選択肢が多くなる🥰 02 アップデート計画

Slide 15

Slide 15 text

Nuxt Bridgeの利 用 Bridgeのリリース当初は不安定で、ドキュメントや事例など情報 不 足 だったが、メンテナの 方 々の尽 力 でかなり安定してきた。 近々、RC版も出る🎉 02 アップデート計画

Slide 16

Slide 16 text

Nuxt 3 へのアップデート ビッグバンリリースを避けるために段階的にリリースしたいが、 2→3はどうしても 大 きなリリースになるのは不可避… ➡カナリアリリースなどの公開範囲を絞るリリースを検討。 02 アップデート計画

Slide 17

Slide 17 text

02 アップデート計画 取り組むこと 1 . アップデート前の準備 2 . Nuxt 2 . 1 7 へのアップデート 3 . Nuxt Bridgeの導 入 (👈イマココ) 4 . Bridgeの段階導 入 5 . Nuxt 3 へのアップデート

Slide 18

Slide 18 text

03 アップデート前準備💪

Slide 19

Slide 19 text

アップデートの前に… • 計画時点で対応事項が 100 個ぐらいあった。 • これらを 長 期的に安全にアップデートをしていく必要がある。 • リソース都合で 一 時的に1 人 でやらないといけない😇 03 アップデート前準備

Slide 20

Slide 20 text

アップデートの前に… • 計画時点で対応事項が 100 個ぐらいあった。 • これらを 長 期的に安全にアップデートをしていく必要がある。 • リソース都合で 一 時的に1 人 でやらないといけない😇 ➡ 大 量の対応を少ないリソースで品質を担保しながら進める必要 がある🤔 03 アップデート前準備

Slide 21

Slide 21 text

自 動化だ!🦾🤖🦾 03 アップデート前準備

Slide 22

Slide 22 text

自 動化 1 . ESLint のカスタムルールを使う 2 . VRT (Visual Regression Testing) をする 03 アップデート前準備

Slide 23

Slide 23 text

自 動化 1 . ESLint のカスタムルールを使う 2 . VRT (Visual Regression Testing) をする 03 アップデート前準備

Slide 24

Slide 24 text

ESLint のカスタムルールを使う💪 Vue 公式の eslint-plugin-vue で破壊的変 更の多くを対応できる。 …が、プロダクトには放置された 非 推奨コ ードが多く、pluginだけでカバーできない 形式のものが結構あった(数百件🫠 03 アップデート前準備 - 自 動化

Slide 25

Slide 25 text

Vue の SFC の書き換え (SFC→AST→SFC) は vue-eslint-parser とESLintのカスタムルールでできるので 自 作する✍ ESLint のカスタムルールを使う💪 ➡ ➡ ➡ ✨ ✨ 03 アップデート前準備 - 自 動化

Slide 26

Slide 26 text

🎉

Slide 27

Slide 27 text

Linterで防げれば 非 推奨コードも 早期& 自 動で排除できる👍 03 アップデート前準備 - 自 動化

Slide 28

Slide 28 text

自 動化 1 . ESLint のカスタムルールを使う 2 . VRT (Visual Regression Testing) をする 03 アップデート前準備

Slide 29

Slide 29 text

なんで VRT?🤔 1 . Yappliの開発フローとの相性 2 . テストのためのコスト 3 . バージョンアップとの相性 03 アップデート前準備 - 自 動化

Slide 30

Slide 30 text

1 . Yappliの開発フローとの相性 03 アップデート前準備 - なんでVRT?🤔 実装 コード レビュー 個別QA 週次QA リリース 週次QAとリリースは週に1回

Slide 31

Slide 31 text

実装 コード レビュー 個別QA 週次QA リリース バージョンアップでは影響範囲が広いので通常の個別QAは困難😿 03 アップデート前準備 - なんでVRT?🤔 1 . Yappliの開発フローとの相性

Slide 32

Slide 32 text

実装 コード レビュー 個別QA 週次QA リリース かといって週次QAを待つと 手 戻りが多くなる可能性🙀 03 アップデート前準備 - なんでVRT?🤔 1 . Yappliの開発フローとの相性

Slide 33

Slide 33 text

実装 コード レビュー 個別QA 週次QA リリース 実装段階で早めに広範囲の動作確認を低コストに実施したい → 自 動テストが有効そう✅ 03 アップデート前準備 - なんでVRT?🤔 1 . Yappliの開発フローとの相性

Slide 34

Slide 34 text

2. テストのためのコスト 元々コンポーネントのテストが不 十 分(StoreとUtilしかない)か つコンポーネントはStoreにめちゃくちゃ依存している🙀 単体 ・ 結合レベルのテストをするには、まずコンポーネント 自 体 のテスタビリティを向上する必要がありそう… 03 アップデート前準備 - なんでVRT?🤔

Slide 35

Slide 35 text

https://autify.com/ja/blog/refactoring-or-testing-ja 2. テストのためのコスト 03 アップデート前準備 - なんでVRT?🤔

Slide 36

Slide 36 text

https://autify.com/ja/blog/refactoring-or-testing-ja 2. テストのためのコスト 03 アップデート前準備 - なんでVRT?🤔

Slide 37

Slide 37 text

https://autify.com/ja/blog/refactoring-or-testing-ja 2. テストのためのコスト 03 アップデート前準備 - なんでVRT?🤔 E 2 Eが合いそう✅

Slide 38

Slide 38 text

3. バージョンアップとの相性 バージョンアップで確認したいことは、バージョンアップ後の 環境と本番環境が同じ動作であること。 🤝 本番 検証 03 アップデート前準備 - なんでVRT?🤔

Slide 39

Slide 39 text

E 2 Eの中でもVRTが良さそう💡 03 アップデート前準備 - なんでVRT?🤔

Slide 40

Slide 40 text

VRTするぞ! 03 アップデート前準備 - なんでVRT?🤔

Slide 41

Slide 41 text

https://playwright.dev/

Slide 42

Slide 42 text

なんでPlaywright? • VRTも普通のE 2 Eもどちらもできる • 並列実 行 が最 高 • Auto-waitのおかげで、多少の不安定さを 吸収してくれる • 使うのが初めてでも、直感的に書ける! 03 アップデート前準備 - なんでVRT?🤔

Slide 43

Slide 43 text

🎉

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

No content

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

僅かな差分も検知できる✅ 03 アップデート前準備

Slide 50

Slide 50 text

これで万全のバージョンアップ体制ができた🥳 03 アップデート前準備

Slide 51

Slide 51 text

04 得られた学び📚

Slide 52

Slide 52 text

1 2 ”仕組み”でプロダクトを維持すること 自 動化の偉 大 さ • 非 推奨なコードや依存関係は意識しないと放置されがち。 • 日 頃から妥協せず、早めに摘む。(「後で直す」は 大 体直さない🫠) • 維持する仕組みを作ろう!(静的解析、CI、啓蒙活動など) • 定期的に 見 直す 文 化を作ることでも、チームにも維持する意識が芽 生 える。 • プロダクトが 大 きくなるほど、 人力 だけで対処できなくなる。 • 自 動化のメリットはプロダクトが 大 きくなるほど、時間が経つほどに増 大 する。 04 得られた学び📚

Slide 53

Slide 53 text

VERSION UP VOYAGEは まだ始まったばかり…👨🚀