LoginSignup
42
19

More than 3 years have passed since last update.

【Vue CLI】プロジェクトを作成した時につくられる[src/components]フォルダと[src/view]フォルダの違いって?

Posted at

実行環境

@vue/cli 4.1.2

1.vue createでプロジェクトを作成

vue create my-project

Routerを選択します。

? Please pick a preset: Manually select features
? Check the features needed for your project: 
 ◉ Babel
 ◯ TypeScript
 ◯ Progressive Web App (PWA) Support
❯◉ Router
 ◯ Vuex
 ◯ CSS Pre-processors
 ◉ Linter / Formatter
 ◯ Unit Testing
 ◯ E2E Testing

とりあえずプロジェクトの作成は完了しました。

作成したプロジェクトのフォルダを確認

srcフォルダ内の構成は次のようになっています。

└── src
    ├── App.vue
    ├── assets
    │   └── logo.png
    ├── components
    │   └── HelloWorld.vue
    ├── main.js
    ├── routersr
    │   └── index.js
    └── views
        ├── About.vue
        └── Home.vue

ここで気になるのがcomponentsフォルダとviewsフォルダ。

.vue拡張子からもわかるように、中身のファイルをみるとどちらも単一ファイルコンポーネントで構成されています。

src/views/Hello.vue
<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>

<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'

export default {
  name: 'Home',
  components: {
    HelloWorld
  }
}
</script>
src/components/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-router" target="_blank" rel="noopener">router</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>

これらのフォルダの違いはなんでしょうか?

viewsフォルダはルーティングに登録されるコンポーネント

viewsフォルダに置かれているコンポーネントはルーティングを構成します。

つまり、src/router/index.jsimportされるコンポーネントです。

src/router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  }
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

export default router

確かに、ルーター定義において、viesフォルダから呼び出されていることが確認できます。

componentsフォルダは再利用可能で、ページを構成する部品

対して、componentsフォルダのコンポーネントはルートとして使用されません。

コンポーネントは再利用可能な部品として扱われます。

さいごに

viewsフォルダとcomponentsフォルダの役割の違いを見てきました。
しかし、この指針に必ずしも従う必要はありません。

例えば、次のようなことが考えられます。

  • viewsフォルダをsrc/routerの下に配置する
  • viewsフォルダをpagesフォルダと呼ぶ
  • `すべてのコンポーネントを同じフォルダの中に配置する

結局、そのフォルダ構成はプロジェクトの好みによる部分が大きいでしょう。

vue/createで作り出されるフォルダ構成は、一つの指針にすぎません。

参考

vue.js - What is the difference between the views and components folders in a Vue project?

42
19
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
19