Vue.jsの良いところを紹介します

![download (1).png](https://qiita-image-store.s3.amazonaws.com/0/42540/5948ad63-f349-a88d-6b54-a58cb738df25.png)

ぼくは今年、[Vue.js](https://jp.vuejs.org/)に入門しました。
触れてみていい感じだったので、しばらく使ってみた感想をここにまとめます。

## いいとこ
1. 公式ドキュメントが充実（日本語対応）
2. 導入が簡単
2. HTML、JavaScript、CSSの知識だけでも使える
3. アトミックデザインに適してる

### 公式ドキュメントが充実
これは助かります。
こまったら公式ドキュメントを見にいけば大抵は解決できると思います。
日本語も対応しているので、英語が苦手でも問題ありません。

### 導入が簡単
これも公式ドキュメントに手順が書かれているのでわかりやすいです。

```
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
```
のようにCDNを読み込んで利用することもできますが、おすすめは開発に便利な[CLI](https://cli.vuejs.org/)（これは日本語非対応）をインストールして始める方法です。
理由はWebpackなどの開発支援ツールが利用できるようになるからです。そのための設定が必要になりますが、初めは気にせず公式に提供されている設定をそのまま使えばよいです。

簡単に、導入方法をまとめておきます。
#### 1. NPMかYarnでインストール

```
npm install -g @vue/cli
# OR
yarn global add @vue/cli
```

#### 2. パッケージを作成。

```
vue create [任意のパッケージ名]
```

GUIで作成する手段もあるみたいです（Vue 3.xから？）。

```
vue ui
```
こんなページが開くので、GUIでパッケージ作成する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/42540/6840b02c-dc68-8545-60d9-cf8da1d4994f.png)

#### 起動
```
npm run serve
```
http://localhost:8000 で以下のようなページが確認できます。

![Screen Shot 2018-12-04 at 21.44.36.png](https://qiita-image-store.s3.amazonaws.com/0/42540/84676009-99b6-2b0a-58d5-cdce9088562d.png)

簡単でしたね。

### HTML、JavaScript、CSSの知識だけでも使える
これはなぜか。
上で作成したプロジェクトの `src/HelloWorld.vue` というファイルを見てみましょう。

```
<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <p>
      For a guide and recipes on how to configure / customize this project,<br>
      check out the
      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
    </p>
    <h3>Installed CLI Plugins</h3>
    <ul>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
    </ul>
    <h3>Essential Links</h3>
    <ul>
      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
    </ul>
    <h3>Ecosystem</h3>
    <ul>
      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>
```

これはコンポーネントファイルと言って、ページを構成する部品の一つです。 （FYI: [単一ファイルコンポーネント](https://jp.vuejs.org/v2/guide/single-file-components.html)）
コンポーネントは、以下３つの要素でできています。

| 要素 | 概要 |
|:--|:--|
| `<template>` | HTML |
| `<script>` | JavaScript |
| `<style>` | CSS |

要は、１つのhtmlファイルを機能や目的ごとに、コンポーネントという単位に切り分けただけ。
なので、基本的にはコンポーネントの編集も従来のHTMLと変わりません。違うのは、 `<script>` の内容だけですね。

### アトミックデザインに適してる
アトミックデザイン（Atomic Design）は、コンポーネント単位に定義するUIデザイン手法です。
atomicという単語は「原子の」とかいった意味で、簡単に言えば、小さく定義するデザイン手法です。
前述したように、HTML、JavaScript、CSSをまとめてコンポーネントファイルとして分割しやすいため、アトミックデザインを保った開発がしやすいのです。

#### そもそも、なんでアトミックデザインか？
前で出てきた、 `Create a new project` のページを例に考えてみましょう。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34323534302f36383430623032632d646336382d383534352d363064392d6366386461316434393934662e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/42540/bca9a85f-3553-5ed5-57e1-305c4ebe8e70.png)

* 同色で囲ったパーツ
  * 同じようなCSSを当てられそうですね。
  * こういうものは１つ定義して、使いまわした方が楽です。
* オレンジ色で囲ったグローバルメニュー
  * これはJavaScriptの挙動もほぼ同じになりそうです。
  * CSSのクラスだけではなく、JavaScriptの定義もまとめるとより楽になります。
* 青色で囲ったボタン
  * これもスタイル・動作共に似ています。
  * 更に、複数のページで活用できそうです。

以上のように、ページ内には同じ性質、意思を持たせたい要素が沢山存在しています。これらを一つ一つ定義して、使い回すことでサイト全体の一貫性が保たれ、ユーザーの混乱を防ぐことに繋がります。管理しやすくなるので、開発者にとってもメリットがあります。

## おわり
以上、簡単にVue.jsの感想でした。
今年は残り26日。楽しんでいきましょう！