Vue.js スタイルガイド 分野別簡易リファレンス

こちらは [Vue.js #2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vuejs-2) の 24 日目です。

# スタイルガイドについて
[本家 Vue.js スタイルガイドはこちら](https://jp.vuejs.org/v2/style-guide/index.html)

これは、「Vue.js はこのように (書くべき|書いたほうがいい)ですよー」というものをまとめた、大変ありがたいドキュメントです。

公式が書いているソースコードは全てこれに則って書かれています（そのはずです）。そして、全世界の Vue.js ユーザもこれになるべく近い形でコーディングするべきです。

# ESLint プラグイン
こちらもありがたいことに、全てではないものの、スタイルガイドに則っているかをチェックしてくれる ESLint プラグインがあります。

機械的にチェックできるものは機械にやらせましょう！

https://github.com/vuejs/eslint-plugin-vue

今回のアドベントカレンダーで、プラグインのコラボレーターの方が記事を書かれています。チェケラ！

https://qiita.com/ota-meshi/items/85bf17494c8ea0be05d7

# この記事を書くきっかけ
コンポーネント外・テンプレートから呼ばれないメソッドの命名規則について、一部のローカルルールで「メソッド名の先頭に`_`をつける」というものがあるかと思います。

そちらを採用しようとしたところ、実は Vue.js スタイルガイドで禁止されていたため、「これは案外知られていない・意外なルールがあるのでは？」と思いました（しかも優先度 A）。

スタイルガイドを広めるということと、「今北一業」で一覧できるリファレンスがあると捗るなと感じたので、自分で書いてしまえと思った次第です。

また、さらっと調べた限りでは公式と同じ書き方をしているページしか見つけられなかったので、自分なりにわかりやすく、分野別に編集したものを書いてみようと思います。

# 簡易リファレンス
`内容（優先度）` としています。

自分がぱっと見で理解できるように書いたので、分かりづらい部分もあるかと思いますが、ご了承ください。（逆に「自分ならこう書く！」といったリファレンスを作るのもありです！）
※ 一部複数箇所に出てくる内容もあります。


## コンポーネント・ファイル
### 命名規則
* [コンポーネント名は常に複数単語にする（A）](https://jp.vuejs.org/v2/style-guide/index.html#%E8%A4%87%E6%95%B0%E5%8D%98%E8%AA%9E%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%90%8D-%E5%BF%85%E9%A0%88)
* [ファイル名はパスカルケース（もしくはケバブケース）にすべき（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E5%8D%98%E4%B8%80%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%AE%E5%BD%A2%E5%BC%8F-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [基底コンポーネントは専用のプレフィックスをつけるべき（`Base` `App` `V` など）（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E5%9F%BA%E5%BA%95%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E5%90%8D%E5%89%8D-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [インスタンスが一つしか存在しないなら、プレフィックスに `The` をつけるべき（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E5%8D%98%E4%B8%80%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%90%8D-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [密結合のコンポーネント名は、親コンポーネントの名前をプレフィックスにつけるべき（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E5%AF%86%E7%B5%90%E5%90%88%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E5%90%8D%E5%89%8D-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [コンポーネント名は「最高レベル」の単語から始めるべき（Template, Page 名など）（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%90%8D%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%8D%98%E8%AA%9E%E3%81%AE%E9%A0%86%E7%95%AA-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [コンポーネント名に略語を使用すべきではない（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E5%AE%8C%E5%85%A8%E3%81%AA%E5%8D%98%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%90%8D-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)

### その他
* [1 コンポーネント 1 ファイル（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [単一ファイルコンポーネントでは、`<template>` `<script>` `<style>` は一貫した順序にし、`<style>` は最後に記述すると良い（C）](https://jp.vuejs.org/v2/style-guide/index.html#%E5%8D%98%E4%B8%80%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E3%83%88%E3%83%83%E3%83%97%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AE%E5%B1%9E%E6%80%A7%E3%81%AE%E9%A0%86%E5%BA%8F-%E6%8E%A8%E5%A5%A8)


## テンプレート
### タグ
* [コンポーネントは、DOM テンプレート以外の場所では自己終了形式で書くべき（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E8%87%AA%E5%B7%B1%E7%B5%82%E4%BA%86%E5%BD%A2%E5%BC%8F%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [DOM テンプレートではケバブケースを利用すべき。DOM テンプレートと JS/JSX 以外の場所ではパスカルケースを利用しても良い（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E5%86%85%E3%81%A7%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%90%8D%E3%81%AE%E5%BD%A2%E5%BC%8F-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)

### プロパティ（属性）
* [`v-for` にはインデックス以外の `key` を指定する（A）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%82%AD%E3%83%BC%E4%BB%98%E3%81%8D-v-for-%E5%BF%85%E9%A0%88)
* [HTML の属性値はクォートすべき（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E5%BC%95%E7%94%A8%E7%AC%A6%E4%BB%98%E3%81%8D%E3%81%AE%E5%B1%9E%E6%80%A7%E5%80%A4-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [プロパティ名は、定義時はキャメルケース、テンプレートなどではケバブケースを利用すべき（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E5%90%8D%E3%81%AE%E5%9E%8B%E5%BC%8F-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [複数の属性がある場合は、それぞれを複数行に分けて書くべき（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E8%A4%87%E6%95%B0%E3%81%AE%E5%B1%9E%E6%80%A7%E3%82%92%E3%82%82%E3%81%A4%E8%A6%81%E7%B4%A0-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [ディレクティブの短縮記法は、使う・使わないを統一すべき（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%AE%E7%9F%AD%E7%B8%AE%E8%A8%98%E6%B3%95-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [コンポーネントの属性の記述順を統一すると良い（C）](https://jp.vuejs.org/v2/style-guide/index.html#%E8%A6%81%E7%B4%A0%E3%81%AE%E5%B1%9E%E6%80%A7%E3%81%AE%E9%A0%86%E5%BA%8F-%E6%8E%A8%E5%A5%A8)
    * 記述順の一覧は公式を参照
* [同じタグを使用している `v-if`, `v-else-if`, `v-else` には `key` を指定する（D）](https://jp.vuejs.org/v2/style-guide/index.html#key-%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84-v-if-v-else-if-v-else-%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F)

### その他
* [テンプレート内で複雑な式を利用すべきではない（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E5%86%85%E3%81%A7%E3%81%AE%E5%8D%98%E7%B4%94%E3%81%AA%E5%BC%8F-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)


## JavaScript
### データ
* [コンポーネントの`data`を関数にする（A）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF-%E5%BF%85%E9%A0%88)
* [`v-for` と `v-if` を同じ要素に使わず、`computed` でフィルタする（A）](https://jp.vuejs.org/v2/style-guide/index.html#v-for-%E3%81%A8%E4%B8%80%E7%B7%92%E3%81%AB-v-if-%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AE%E3%82%92%E9%81%BF%E3%81%91%E3%82%8B-%E5%BF%85%E9%A0%88)
* [複雑な算出プロパティは、複数の算出プロパティに分割すべき（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E5%8D%98%E7%B4%94%E3%81%AA%E7%AE%97%E5%87%BA%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [親子間のやり取りはプロパティとイベントを利用する（D）](https://jp.vuejs.org/v2/style-guide/index.html#%E6%9A%97%E9%BB%99%E7%9A%84%E3%81%AA%E8%A6%AA%E5%AD%90%E9%96%93%E3%81%AE%E3%82%84%E3%82%8A%E3%81%A8%E3%82%8A-%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F)
* [グローバルの状態管理は Vuex を利用する（D）](https://jp.vuejs.org/v2/style-guide/index.html#Flux-%E4%BB%A5%E5%A4%96%E3%81%AE%E7%8A%B6%E6%85%8B%E7%AE%A1%E7%90%86-%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F)

### 命名規則等
* [`props`はできるだけ（最低でも`type`は）詳細を定義する（A）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E5%AE%9A%E7%BE%A9-%E5%BF%85%E9%A0%88)
* [プライベートなプロパティは `$_` プレフィックスをつける（A）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%81%AA%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E5%90%8D-%E5%BF%85%E9%A0%88)
* [コンポーネントは、DOM テンプレート以外の場所では自己終了形式で書くべき（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E8%87%AA%E5%B7%B1%E7%B5%82%E4%BA%86%E5%BD%A2%E5%BC%8F%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [DOM テンプレートではケバブケースを利用すべき。DOM テンプレートと JS/JSX 以外の場所ではパスカルケースを利用しても良い（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E5%86%85%E3%81%A7%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%90%8D%E3%81%AE%E5%BD%A2%E5%BC%8F-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [JS/JSX 内ではパスカルケースを利用すべき（B）](https://jp.vuejs.org/v2/style-guide/index.html#JS-JSX-%E5%86%85%E3%81%A7%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%90%8D%E3%81%AE%E5%BD%A2%E5%BC%8F-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [プロパティ名は、定義時はキャメルケース、テンプレートなどではケバブケースを利用すべき（B）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E5%90%8D%E3%81%AE%E5%9E%8B%E5%BC%8F-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)
* [コンポーネント / インスタンスオプションの記述順を統一すると良い（C）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88-%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E9%A0%86%E5%BA%8F-%E6%8E%A8%E5%A5%A8)
    * 記述順の一覧は公式を参照
* [ファイルの行数が増えた場合は、コンポーネント / インスタンスオプションのうち複数行になるものは、空行を入れると良い（C）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88-%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E7%A9%BA%E8%A1%8C-%E6%8E%A8%E5%A5%A8)


## CSS
* [`<style scoped>` を使用する（ライブラリ作成時を除く）（A）](https://jp.vuejs.org/v2/style-guide/index.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97-%E5%BF%85%E9%A0%88)
* [`<style scoped>` 中で要素（タグ）セレクタは使用しない（D）](https://jp.vuejs.org/v2/style-guide/index.html#scoped-%E4%BB%98%E3%81%8D%E3%81%AE%E8%A6%81%E7%B4%A0%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF-%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F)

# まとめ
誰が見てもわかりやすく書くために、できるだけ公式のスタイルガイドに則った開発をしていきましょう！