Vue.js で初めて SPA を開発する際に考えたこと

# はじめに
MVVM フレームワーク初心者の筆者がVue.jsを使ってSPAを開発する際に考えたことを掲載していきます。本記事を通して、これからSPAを開発する人にとっての**足掛かり**となれば幸いです。

* 対象読者
    * HTML, CSS, JavaScript の経験あり、また jQuery などのJSライブラリの使用経験あり
    * React, Angular といった今時のJSフレームワークによるSPA開発未経験

# Vue.js に入門したい
Vue.js を使い始める場合、大きく分けて２つの方法があります。

* `<script>` タグを使ってjQuery感覚で使用できる環境を整える
* vue-cli を使って[単一ファイルコンポーネント](https://jp.vuejs.org/v2/guide/single-file-components.html)に特化した環境を整える

環境を整える手間は同じぐらいなので、どちらでも良いと思いますが Vue.js の真価を発揮するなら vue-cli を使った方法を取るのが良いと思います(参考：[vue-cliによるVue.js環境の構築(公式サイト)](https://jp.vuejs.org/v2/guide/installation.html#CLI))。公式では、npm に精通している必要があるとありますが、とりあえず使用する分には知識がなくても問題ありません（勉強したほうが良いのはよいですが…）。

環境を構築したら、早速何か作りましょう！
JSフレームワークの入門アプリケーションとしては、**TODOリスト**がおすすめです。個人的にモダンなJSフレームワークはデータ操作が重要なので、TODOリストのようなCRUDアプリケーションが入門として好まれている印象です。

記事をいくつかはっておきますので、参考にしてください。

* [Simple Todo App with Vue](https://codesandbox.io/s/o29j95wx9)
* [TodoAppでVue.js入門(1)](https://qiita.com/lucidfrontier45/items/b4f6083d03feac602386)
* [Vue.jsミニハンズオン（TODOリスト作成）](https://qiita.com/moonglows76/items/358ef3cd1566c38ece3a)

# ブラウザ用の開発ツールがほしい
Google Chrome の拡張機能として [Vue.js devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd) というものがありますので、これを使うと良いと思います。この拡張機能を導入すると、Vue.jsで開発されたアプリケーションの場合、開発者ツールにVueタブが表示されるようになります。

# ページを遷移させたい
公式でライブラリに[vue-router](https://router.vuejs.org/ja/)というのがあるので、それを利用すると良いです。vue-cliを使って環境を整えた場合は最初から入ってます。

# コンポーネント名の規則や記述スタイルに統一性が欲しい
触り始めると気付くのですが、コンポーネント名の規則や記述するスタイルにいわゆるルールが欲しくなります。そういったときは、

* [公式スタイルガイド](https://jp.vuejs.org/v2/style-guide/index.html)
* [Vue.js コンポーネント スタイル ガイド](https://pablohpsilva.github.io/vuejs-component-style-guide/#/japanese)

この辺りを読んでおくと幸せになれます。
いきなりすべてを取り入れるにはボリュームがあるので、Progressive に取り入れていくことをおすすめします。

# コンポーネントが乱立しないように整理したい
開発が進みコンポーネントが増え始めると、似たコンポーネントが出現したり、再利用できなくなったり、**「そもそも増えすぎたコンポーネントをどう管理したらいいんだ？」**と様々な悩みが出始めます。そんな時は、[Atomic Design](http://bradfrost.com/blog/post/atomic-web-design/) を参考にしてみてください。詳細は省きますが、Atomic Design とはページのコンポーネントを5段階で分けて整理するデザイン手法です。

記事をいくつかはっておきますので、参考にして下さい。

* [Atomic Design を
分かったつもりになる](http://design.dena.com/design/atomic-design-%E3%82%92%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A4%E3%82%82%E3%82%8A%E3%81%AB%E3%81%AA%E3%82%8B/)
* [Atomic Designの考え方と利点・欠点](http://blog.kubosho.com/entry/using-atomic-design)
* [珍しいワークフロー：Atomic Designの原則とSketchでデザインからプログラミングまで](http://postd.cc/the-unicorn-workflow-design-to-code-with-atomic-design-principles-and-sketch/)

# コンポーネント間で共通処理が出てくるので整理したい
[mixin](https://jp.vuejs.org/v2/guide/mixins.html)という方法が公式で用意されています。それを使用するのが良いと思います。ただ、あくまで**コンポーネントに依存する共通処理**をまとめる方法なので、コンポーネント依存しないものは、クラス化するほうがいいんじゃないかと個人的には思います(余談)。

# データのバケツリレーを解消したい
[Vuex](https://vuex.vuejs.org/ja/intro.html)の使用を検討してください。Vuexはアプリケーションの状態管理パターン＋ライブラリです。これはツールであり、概念でもあるのでそれを理解する必要があります。公式でも解説されていますが(参考：[Vuex とは何か？](https://vuex.vuejs.org/ja/intro.html)）、その背景である Flux について学ぶと良いと思います。

記事をいくつかはっておきますので、参考にしてください。

* [Fluxとはなんなのか](https://qiita.com/knhr__/items/5fec7571dab80e2dcd92)
* [【React.js】Fluxの概念を勉強するときにとっても役に立った記事まとめ](https://qiita.com/funaota/items/aa0b23472775ace2842d)

# 複雑になったSPAが開発者の意図通りに描画されるか保証が欲しい
今著者が欲しい情報です。特にテスト設計の部分について…

# おわりに
今回、モダンなJSフレームワークであるVue.jsで初めてSPAを開発する際に考えたことを書きました（あと初Advent Calendarです笑）。Vue.jsはモダンなフレームワークの中でも学習しやすく、日本語の情報も豊富なので初心者でも比較的簡単に使えるなと感じた一方、情報が多いので **「こういう時どうしたらいいんだろう？」** という情報を探すのが大変だったり、そもそも初心者だから意味がよくわからなかったりと感じることがありました。今回の記事で、少しでも同じような状況な方に対して役立つロードマップ的なものになれたら幸いです。

明日は @kokoe さんです。初心者向けのコンポーネント作成に関する記事です！！