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

vueで中規模以上のフロントエンドを組んでいて 役に立ったtips

Avatar for Nkowne63 Nkowne63
January 28, 2020

vueで中規模以上のフロントエンドを組んでいて 役に立ったtips

自社サービスを構築する際に実施した施策の簡単な解説です

Avatar for Nkowne63

Nkowne63

January 28, 2020
Tweet

More Decks by Nkowne63

Other Decks in Technology

Transcript

  1. 自己紹介 張 たいよ (GitHub: @neutron63zf) 東京大学理学部物理学科 4年 • ventus-inc ◦

    JavaScript ( Vue.js / Nuxt.js ) ◦ Golang / Firebase • (元)東京大学五月祭常任委員会 ◦ AWS / Nginx / Docker ◦ Node.js ( Express )
  2. 前提知識 • Vue ◦ 表示をコンポーネントという単位に分割して書くことができる • Vuex ◦ (すごくざっくり言うと) Storeというものに状態をまとめ、それに対して操作をする。

    ◦ 「一方向のデータフロー」を課すことで、挙動を予測しやすくする。 • Nuxt ◦ Vueでサーバーサイド・レンダリング( SSR)をするときに便利なフレームワーク ◦ ほとんど普通の Vueを書く感覚でSSRができる反面、制約がきついところも
  3. 結論:しんどい • ストアが使いづらいことこの上ないので、ストアのステートからではなく、毎回ストアのアクションの返り値を 直接コンポーネントにセットするコードが多発 ◦ ストアを使う意味 ... • 上と並行して、ストアにデータを記録することなくレスポンスをパースするだけのコードも多発 •

    たまに変なデータ変換をかけている部分は逆変換をかけないと使えないことも →デザインのリニューアルついでに大幅にリファクタリングするぞ! (このスライドはその時にいろいろ試した施策をいくつか抜粋して紹介している)
  4. viewに依存するストアの部分 基本的に注意すべき部分はあまりないが、以下の 2ルールだけ課した。 • ステートは最低限必要なものにすること(何でもかんでもつめこまない) ◦ ページをまたがって引き継ぐ必要のあるデータ。そして、 props渡しだと不可能なデータの運搬(モーダルなど) ◦ そうで無いデータはコンポーネントのステートとして処理できるので、あまりストアの旨味がない

    • アクション・ミューテーションも最低限必要なものにすること ◦ つまり、複数のアクションのうち共通する処理であっても、ストアの内部でしか使われないのならば、「アクショ ン」や「ミューテーション」ではなく、関数として切り出す 特に2つ目のルールは、ストアが大きくなったときにスパゲッティーコード化することを多少は緩和してくれる。
  5. Atomic Designを導入する(1) デザインをリニューアルする際に、「 Atomic Design」 を導入し、コンポーネントの再利用性を高めることにし た。 だが、右の図にあるような「よくネットである Atomic Design」の他にも、会社ごとにたくさんの「オレオレ

    Atomic Design」なるものがあり、どれもよさげで迷っ た。 結局、厳密でなくても、「階層的にコンポーネントを構 築していく」というコンセプトの元で自分たちなりにルー ルを決めることにした。
  6. どの層かの判断基準 Atomic Designでおそらくいちばん困るのが 「このコンポーネントはどの層に属するのか」という判断 で、実際 に運用をしたい場合はここを ある程度スムーズに判断できるような基準を設けておく とかなりやりやすい。 whooopでは現在以下のように区分けしている。 •

    Atoms … これ以上分解すると機能として成り立たない単位(チェックボックス等) • Molecules … 特定のオブジェクトに依存しないが、 Atomsを複数組み合わせて実現できる単位(カ ルーセルや、検索窓等) • Organisms … 特定の種類の、単一のオブジェクトを表示する単位(ユーザーの持つカード等) • Layouts … 複数種類や、複数個のオブジェクトを表示する単位(ユーザーの持つカードの一覧)