Vue CLI
为了能够更加便捷的创建Vue项目基础架构,Vue官方推出了Vue脚手架 (opens new window),用于快速生成Vue项目。
在之前我们在webpack项目中引入vue,但是发现需要手动配置需要信息,为了节约开发人员的配置环境的时间,我们通过Vue CLI来快速构建Vue项目基础架构,方便快速搭建环境。
# 安装和脚手架项目搭建
# 安装
安装3.x版本的Vue脚手架
npm install -g @vue/cli
# 脚手架项目搭建
基于交互命令行的方式
基于图形化界面方式
基于2.x的旧模板方式
# 脚手架项目结构分析
在搭建完脚手架项目后,其目录结构如下:
├── 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 # 项目说明文件
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"
}
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')
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>
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
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>
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>
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>
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文件夹主要是一些图片,字体静态资源等。