チーム開発におけるコンポーネントシステムの問題と解決施策
by
nal
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
#RAKUSMeetup ©2021 RAKUS Co., Ltd. チーム開発における コンポーネントシステムの問 題と解決施策 UI開発課 フロントエンドエンジニア 中田 和宏
Slide 2
Slide 2 text
#RAKUSMeetup : @nalpan : @nal_pan 中田和宏(なかたかずひろ) 趣味 寝ること 音楽ゲーム 温泉地に一人旅 気になるツールの素振り 豆からコーヒーを淹れるのがマイブーム (全自動だけど…) 楽楽勤怠でフロントエンド開発を担当 最近はチーム内の調整や問い合わせ対応が多い Vue.js 日本ユーザーグループ コアスタッフ 未経験者向けハンズオン教材の作成 https://github.com/vuejs-jp/handson-vue3 趣味周りのアプリ開発 https://ddrdraw.surge.sh/
Slide 3
Slide 3 text
#RAKUSMeetup 下記課題感の参考になれば幸いです 🙋 ● コンポーネントの切り分けに悩んでいる ● Atomic Designなどうまくいかなかった ● 実装済コンポーネントの認識共有が大変 ● Vue CLI + VuetifyでStoryBookを動作させたい
Slide 4
Slide 4 text
#RAKUSMeetup コンポーネントのレイヤーや責務は 意識しよう! 本日一番お伝えしたいこと
Slide 5
Slide 5 text
#RAKUSMeetup アジェンダ ● 背景と問題の提示 ● 問題解決の試みと解決したこと ○ コンポーネント分類による認識共有 ○ StoryBookの導入によるカタログ・動くドキュメントの作成 ● 次に見えてきた問題とやりたい事
Slide 6
Slide 6 text
#RAKUSMeetup 背景 ● 機能開発優先によりコンポーネントの設計・構成について 見直す機会が少なかった ○ スピード感としては過去1年ほぼ月1リリース ● 設計・構成の指針が明示されていなかった ● チームの人数が毎月1人ペースで増加 ○ 2021年度4月〜9月で5人 -> 9人
Slide 7
Slide 7 text
#RAKUSMeetup 問題の表面化 ● 不具合の切り分け・修正が困難 ○ 同じ入力チェックが分散・重複している… 🤔 ● コンポーネントに実装済みの機能を再度実装してしまう ○ use-blank-item,hide-placeholder どちらも未選択項目のon/off… 🤔 ● prop,slotの入力で何が変わるのかわかりづらい ○ readonly,disabled 見た目が同じ… 🤔
Slide 8
Slide 8 text
#RAKUSMeetup コンポーネントを分類
Slide 9
Slide 9 text
#RAKUSMeetup コンポーネントを分類 以前の状態 ● ○ components ■ base -> 最小単位コンポーネント、PC/SPに分かれている ■ pc -> PC用のコンポーネント ■ sp -> SP用のコンポーネント ○ pages -> ページの親コンポーネント、PC/SPに分かれている
Slide 10
Slide 10 text
#RAKUSMeetup コンポーネントを分類 変更前 ● ○ components ■ base ■ pc ■ sp ○ pages 変更後 ● ○ components ■ base ● pc ● sp ■ parts ■ pages
Slide 11
Slide 11 text
#RAKUSMeetup コンポーネントを分類 変更後 ● ○ components ■ base -> 基底コンポーネント ■ parts -> ページの一部となるコンポーネント ■ pages -> ページの親コンポーネント ● それぞれの配下にpc/sp/mixinディレクトリを配置
Slide 12
Slide 12 text
#RAKUSMeetup baseコンポーネント ● Atomic DesignのAtoms,Moleculesに該当 ● 汎用的な機能を持つ ○ 必須入力判定機能、外部から渡された値や範囲の判定機能 ● 業務的な知識は持たない ○ 具体的な値や範囲の判定 ○ 時刻や期間が該当 ■ etc, 24時間、前後1ヶ月 コンポーネントを分類
Slide 13
Slide 13 text
#RAKUSMeetup コンポーネントを分類 partコンポーネント ● Atomic DesignのOrganismsに該当 ○ ページの一部を構成するコンポーネント ● 業務的な知識や機能を持つ ○ Moleculesと決定的に異なる点 ○ 画面固有の入力制限 ■ etc, 24時間、前後1ヶ月 ○ 入力による項目表示出しわけ
Slide 14
Slide 14 text
#RAKUSMeetup コンポーネントを分類 pageコンポーネント ● Atomic DesignのTemplates,Pagesに該当 ○ ページの親に該当するコンポーネント ● 業務的な知識や機能を持つ ○ 画面固有の入力制限 ■ etc, 24時間、前後1ヶ月 ○ 入力による項目出しわけ
Slide 15
Slide 15 text
#RAKUSMeetup コンポーネントを分類 解決したこと ● ロジック実装箇所の認識が統一された 🎉 ○ 指針ができる事によりどのロジックをどのコンポーネントに実装するか明確に なった
Slide 16
Slide 16 text
#RAKUSMeetup StoryBookを導入
Slide 17
Slide 17 text
#RAKUSMeetup StoryBookを導入 ● vue-cli-plugin-storybookを利用 ○ 楽楽勤怠はVue CLI,コンポーネント指向を用いて開発している ○ https://www.npmjs.com/package/vue-cli-plugin-storybook ○ 基本的にはこれで動作する ● Vuetifyやプロジェクト固有の対応 ○ main.js,preview.jsの編集 ○ 外部リソースの取得(preview-head.html)
Slide 18
Slide 18 text
#RAKUSMeetup StoryBookを導入 main.jsの編集 ● VuetifyLoaderPluginを設定 ○ ビルド時にVuetifyコンポーネントのimportを挿入する ○ プロダクトコードはvue-cli-plugin-vuetifyにて内部利用している
Slide 19
Slide 19 text
#RAKUSMeetup StoryBookを導入 preview.jsの編集 ● plugin, global directive, global mixinの登録 ○ プロダクトコードと同じように登録
Slide 20
Slide 20 text
#RAKUSMeetup StoryBookを導入 preview.jsの編集 ● Global decoratorsの登録 ○ Vuetifyコンポーネントの動作には,のラップが必要 https://vuetifyjs.com/ja/components/application/#api
Slide 21
Slide 21 text
#RAKUSMeetup StoryBookを導入 preview-head.htmlの編集 ● 外部リソースの取得 ○ スタイルやフォントなど外部リソースが必要な場合は用意 https://storybook.js.org/docs/vue/configure/story-rendering
Slide 22
Slide 22 text
#RAKUSMeetup StoryBookを導入 無事動作 🎉
Slide 23
Slide 23 text
#RAKUSMeetup StoryBookを導入 解決したこと ● コンポーネントの仕様把握 🎉 ○ 機能実装時に同様の機能が実装済みであるかを確認できる ○ 実際の操作やpropsの変更でコンポーネントの感触を確認
Slide 24
Slide 24 text
#RAKUSMeetup StoryBookを導入 下記のような効果も… ● コードのドキュメンテーション 🎉 ○ @storybook/addon-docsによりJSDoc/TSDocがdescriptionとなるため、 結果的にJSDoc/TSDocを書くようになった ■ 厳密にはVue Styleguidist ■ https://vue-styleguidist.github.io/docs/Documenting.html
Slide 25
Slide 25 text
#RAKUSMeetup 次に見えてきた問題とやりたいこと ● storiesをどう実装するか ○ コンポーネントの仕様策定が必要 ● PC/SP同名で別のコンポーネントのstoriesが実装できない ○ プロダクトではUAにより適したものをグローバルインポートしている ○ StoryBookには全てを載せたいが上記機構を変えないといけない ● StoryBookとコンポーネントテストの統合 ○ CSF3.0のPlay Function+@storybook/testing-vueに期待 ■ https://storybook.js.org/addons/@storybook/testing-vue