チーム開発におけるコンポーネントシステムの問題と解決施策
by
nal
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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