Vue CLI

2/21/2020

为了能够更加便捷的创建Vue项目基础架构,Vue官方推出了Vue脚手架 (opens new window),用于快速生成Vue项目。

在之前我们在webpack项目中引入vue,但是发现需要手动配置需要信息,为了节约开发人员的配置环境的时间,我们通过Vue CLI来快速构建Vue项目基础架构,方便快速搭建环境。

# 安装和脚手架项目搭建

# 安装

安装3.x版本的Vue脚手架

npm install -g @vue/cli
1

# 脚手架项目搭建

# 脚手架项目结构分析

在搭建完脚手架项目后,其目录结构如下:

vue脚手架目录

├── node_modules     # 项目依赖包目录
├── public			# 静态资源目录
│   ├── favicon.ico  # ico图标
│   └── index.html   # 首页模板
├── src 			#源码目录
│   ├── assets       # 样式图片目录
│   ├── components   # 组件目录
│   ├── router       # 路由配置目录
│   ├── views        # 页面目录
│   ├── App.vue      # 父组件
│   ├── main.js      # 入口文件
├── .gitignore       # git忽略文件
├── babel.config.js  # babel配置文件
├── package.json     # 包管理文件
├── .eslintrc.js     # eslintrc语法规范文件
└── README.md	     # 项目说明文件 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

接下来对package.json、main.js、App.vue、vue.config.js等几个核心文件和router、views、components等几个核心文件夹进行解析

# package.json

package.json配置文件用于描述项目基本信息、启动信息和依赖信息等。

例如在脚手架项目搭建完成后,运行npm run serve命令,即可启动项目,实际运行了package.json中的scripts脚本中的serve内容。

"scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
}
1
2
3
4
5

# main.js

main.js作为项目的入口js文件,其内容如下:

import Vue from 'vue'
import App from './App.vue'
import router from './router'

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

1
2
3
4
5
6
7
8
9
10
11

说明:导入了vue,vue-router以及App父组件。实例化Vue对象,挂载路由,并渲染了App父组件,最后指定了vue管理区域。

解释render的存在:由于vue在脚手架项目内使用的是阉割版的vue(没有配置模板解析器),所以不能使用template配置项,因此需要使用render函数来处理视图解析。

# App.vue

App.vue作为项目的父组件,其内容如下:

<template>
  <div id="app">
    <div id="nav">
      <router-link to="/">Home</router-link> |
      <router-link to="/about">About</router-link>
    </div>
    <router-view/>
  </div>
</template>

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

#nav {
  padding: 30px;
}

#nav a {
  font-weight: bold;
  color: #2c3e50;
}

#nav a.router-link-exact-active {
  color: #42b983;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

说明:在<template></template>模板中,定义项目的根节点<div id="app"></div>,在其中定了两个路由链接和路由占位符。

# router

router文件夹主要是路由配置信息,其内容如下:

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({
  routes
})

export default router
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

说明:导入vue,vue-router,Home子组件。通过使用Vue路由,配置了两个路由项,//about,前者将import导入的子组件放入,后者通过箭头函数方式放入About子组件,然后实例化VueRouter,加载routes规则,并暴露router实例。

# views

views文件夹主要是页面单文件,用于指定应用有几个页面构成,项目初始化时只有Home和About两个页面,其内容如下:

Home页面

<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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

说明:Home页面中导入HelloWorld子组件,局部注册组件。

About页面

<template>
  <div class="about">
    <h1>This is an about page</h1>
  </div>
</template>
1
2
3
4
5

说明:About页面,仅仅展示一段话,无其他子组件引入。

# components

components文件夹主要是组件目录,用于放置项目使用的单文件组件。项目初始化时只有HelloWorld子组件,用于在Home组件中引入,其内容如下:

<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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

说明:在<template></template>中,定义了组件的DOM结构;<script></script>中,声明组件名称和属性,并暴露;<style scoped></style>中,定义组件的样式,并且scoped关键字限制样式仅在该组件中使用。

# assets

assets文件夹主要是一些图片,字体静态资源等。

Last Updated: 8/23/2023, 2:39:40 PM