vue-cliでテンプレートを作って中を見てみる

前回([vue.js最初の一歩](https://qiita.com/mkiuchi/items/45c54009d9dc1ce06f62))に引き続き、vue.jsを使っていく。今回から vue-cli を使ってボイラープレートを作り、vue-routerでルーティングさせることをやってみる。自分のために書いているんだと言い聞かせて誤解をおそれずじゃんじゃん書いていく。

# vue.js使うといいこと

人によっていろいろあると思うけど、最近流行ってるSPA(Single Page Application)を作るのにいい環境みたい。ユーザの操作によってデータの状況が変化したらそれを反映したりというものにもいい感じに対応してくれる。

実はこういうフレームワークはいろいろある。React, Angular.jsとかもそう。meteor( https://www.meteor.com )は使ったことがあって、今回はそれとは違うものを使ってみようということで、Vue.jsに手を出したという成り行き。

# vue-cliってなに

vue.js のテンプレートを自動生成してくれて、たぶん本格的なSPAを作成することができる。たぶん使い込めば他にも色々できると思う。

# やってみる

[Vue.js を vue-cli を使ってシンプルにはじめてみる - https://qiita.com/567000/items/dde495d6a8ad1c25fa43](https://qiita.com/567000/items/dde495d6a8ad1c25fa43)

```shell
# su -
# npm install -g @vue/cli
(中略: 膨大な依存パッケージと一緒にインストールされる)
# npm install -g @vue/cli-init
(中略: こちらも膨大な依存パッケージと一緒にインストールされる)
```

## プロジェクトの作成

で、インストールできたのでプロジェクトを作成する

いくつか質問が出てくるが全てデフォルトの選択肢を選ぶ

```shell
$ vue init webpack 04-vuejs-spa-example2

? Project name 04-vuejs-spa-example2
? Project description A Vue.js project
? Author 
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Standard
? Set up unit tests Yes
? Pick a test runner jest
? Setup e2e tests with Nightwatch? Yes
? Should we run `npm install` for you after the project has been created? (recommended) npm

   vue-cli · Generated "04-vuejs-spa-example2".


# Installing project dependencies ...
# ========================

Downloading https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.zip
Saving to /tmp/chromedriver/chromedriver_linux64.zip
Received 781K...
Received 1568K...
Received 2352K...
Received 3136K...
Received 3852K total.
Extracting zip contents
Copying to target path /home/kiuchi/vuejs/04-vuejs-spa-example2/node_modules/chromedriver/lib/chromedriver
Fixing file permissions
Done. ChromeDriver binary available at /home/kiuchi/vuejs/04-vuejs-spa-example2/node_modules/chromedriver/lib/chromedriver/chromedriver

Running eslint --fix to comply with chosen preset rules...
# ========================


> 04-vuejs-spa-example2@1.0.0 lint /home/kiuchi/vuejs/04-vuejs-spa-example2
> eslint --ext .js,.vue src test/unit test/e2e/specs "--fix"


# Project initialization finished!
# ========================

To get started:

  cd 04-vuejs-spa-example2
  npm run dev
  
Documentation can be found at https://vuejs-templates.github.io/webpack

```

作成されたディレクトリの下には膨大なファイルが作成されている。 ほとんどのファイルは `node_modules` 以下にあるのでそこは無視してもよいが、それを除いても諸々とファイルが生成されている。

```shell
./04-vuejs-spa-example2/
├── README.md
├── build
│   ├── build.js
│   ├── check-versions.js
│   ├── logo.png
│   ├── utils.js
│   ├── vue-loader.conf.js
│   ├── webpack.base.conf.js
│   ├── webpack.dev.conf.js
│   └── webpack.prod.conf.js
├── config
│   ├── dev.env.js
│   ├── index.js
│   ├── prod.env.js
│   └── test.env.js
├── index.html
├── node_modules
│   └── (とにかくここにファイルが大量にある) 
├── package-lock.json
├── package.json
├── src
│   ├── App.vue
│   ├── assets
│   │   └── logo.png
│   ├── components
│   │   └── HelloWorld.vue
│   ├── main.js
│   └── router
│       └── index.js
├── static
└── test
    ├── e2e
    │   ├── custom-assertions
    │   │   └── elementCount.js
    │   ├── nightwatch.conf.js
    │   ├── runner.js
    │   └── specs
    │       └── test.js
    └── unit
        ├── jest.conf.js
        ├── setup.js
        └── specs
            └── HelloWorld.spec.js

```

とりあえずは言われたとおりに `04-vuejs-spa-example2` ディレクトリに移動し `npm run dev` を実行する

```shell
$ cd 04-vuejs-spa-example2
$ npm run dev
 DONE  Compiled successfully in 5119ms                                                                                                                         04:43:11

 I  Your application is running here: http://localhost:8080
```

ブラウザで http://localhost:8080 を開けと言われるので言われたとおりに開いてみると、デフォルトのページが表示される。

![04-01.jpg](https://qiita-image-store.s3.amazonaws.com/0/52237/9cf4491d-16df-8bf4-157d-2dc0ad1cfdf6.jpeg)

## デフォルトの状態から何を変えていけばいいのか

qiitaの記事では `npm run dev` を実行すると `./dist` というディレクトリが作成されて `./dist/index.html` が生成される旨記述されていたが、私の環境では特にそのようなことはなく、いまいちどこから実際のファイルが送信されているのかよくわからない。

`./src/App.vue` が実際に編集する内容の起点になる。内容は以下のような感じ

```html
<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
```

template タグの中に `router-view` というタグがある。

ソースコードの中の、 `src/router/index.js` の内容を見てみる。

```javascript
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    }
  ]
})
```

ルートディレクトリ、つまり http://localhost:8080/ にアクセスすると、 `HelloWorld` というルートにルーティングされることがわかる。

ではその `HelloWorld` のルーティング先の `./src/components/HelloWorld.vue` を見てみると以下のようになっている。

```html
<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <h2>Essential Links</h2>
    <ul>
      <li>
        <a href="https://vuejs.org" target="_blank">Core Docs</a>
      </li>
      <li>
        <a href="https://forum.vuejs.org" target="_blank">Forum</a>
      </li>
      <li>
        <a href="https://chat.vuejs.org" target="_blank">Community Chat</a>
      </li>
      <li>
        <a href="https://twitter.com/vuejs" target="_blank">Twitter</a>
      </li>
      <br>
      <li>
        <a href="http://vuejs-templates.github.io/webpack/" target="_blank">Docs for This Template</a>
      </li>
    </ul>
    <h2>Ecosystem</h2>
    <ul>
      <li>
        <a href="http://router.vuejs.org/" target="_blank">vue-router</a>
      </li>
      <li>
        <a href="http://vuex.vuejs.org/" target="_blank">vuex</a>
      </li>
      <li>
        <a href="http://vue-loader.vuejs.org/" target="_blank">vue-loader</a>
      </li>
      <li>
        <a href="https://github.com/vuejs/awesome-vue" target="_blank">awesome-vue</a>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  }
}
</script>

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

つまり今見ている画面は以下のような構造になっている。

![04-02.jpg](https://qiita-image-store.s3.amazonaws.com/0/52237/9259da0d-fc7b-c93c-0ba0-01f99cdcb78e.jpeg)

ということで基本的には `./src/components` の下に `XXX.vue` ファイルを作成して、 `./src/App.vue`, `./src/router/index.js` を編集すればページに到達できるということになる。

## それでは改修していく

[次回](https://qiita.com/daredeshow/items/1bdbc07c7cbf2868a7fd)に続く