vue-cli

# vue-cli

[TOC]

# 一、项目环境

  • node.js
    • npm包管理工具
  • MIT License
  • vue-cil脚手架工具
    • 怎么安装,具体看官网。
# 全局安装 vue-cli
$ npm install --global vue-cli
# 创建一个基于 webpack 模块的新项目
$ vue init webpack my-project
# 安装依赖,走你
Install vue-router? (Y/n) n
? Install vue-router? No
? Use ESLint to lint your code? (Y/n) Y
? Use ESLint to lint your code? Yes
? Pick an ESLint preset (Use arrow keys)
? Pick an ESLint preset Standard
? Set up unit tests (Y/n) n
? Set up unit tests No
? Setup e2e tests with Nightwatch? (Y/n) n
? Setup e2e tests with Nightwatch? No
$ cd my-project
$ npm install
$ npm run dev
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 二、项目结构

.
|-- build                            // 项目构建(webpack)相关代码
|   |-- build.js                     // 生产环境构建代码
|   |-- check-version.js             // 检查node、npm等版本
|   |-- dev-client.js                // 热重载相关
|   |-- dev-server.js                // 构建本地服务器
|   |-- utils.js                     // 构建工具相关
|   |-- webpack.base.conf.js         // webpack公共环境基础配置
|   |-- webpack.dev.conf.js          // webpack开发环境配置
|   |-- webpack.prod.conf.js         // webpack生产环境配置


|-- config                           // 项目开发环境配置
|   |-- dev.env.js                   // 开发环境变量
|   |-- index.js                     // 项目一些配置变量
|   |-- prod.env.js                  // 生产环境变量
|   |-- test.env.js                  // 测试环境变量


|-- src                              // 源码目录
|   |-- assets                   	// 图片类资源
|   |-- components                     // vue公共组件
|   |-- rounter
	// 路由文件
|   |-- store                          // vuex的状态管理
|   |-- App.vue                        // 最原始的根组件
|   |-- main.js                        // 整个项目的入口文件,加载各种公共组件


|-- node_modules                     // 依赖的第三方node包 npm i进行安装
|-- static                           // 静态文件,比如一些图片,json数据等
|   |-- data                           // 群聊分析得到的数据用于数据可视化


|-- .babelrc                         // ES6语法编译配置
|-- .editorconfig                    // 定义代码格式
|-- .gitignore                       // git上传需要忽略的文件格式
|-- README.md                        // 项目说明
|-- favicon.ico 
|-- index.html                       // 入口页面(首页模板文件)
|-- package.json                     // 项目基本信息
|-- package-lock.json
  // 项目具体信息
|-- LICENSE
  // 开源协议说明
|-- postcssrc.js
  // css配置
|-- .eslintrc.js
  // 代码规范
|-- .eslintignore
  // 可避免检测的代码文件
.
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

# 2.1 package.json

scripts:npm相关命令缩写
dependencies:指定项目运行时所依赖的模块
devDependencies:指定项目开发时所依赖的模块	npm i XXX -D

版本问题:
"koa": "^2.6.1" // 兼容2.6.1的版本
"koa": "2.6.*" // 2.6.*的最高版本
"koa": "latest"	// 最新版本

npm安装出错的时候会生成package-lock.json
1
2
3
4
5
6
7
8
9
10

# 2.2 build/webpack.base.confg.js

...
...
module.export = {
    // 编译入口文件
    entry: {},
    // 编译输出路径
    output: {},
    // 一些解决方案配置
    resolve: {
    	// 自动补全的扩展名
    	extensions: ['.js', '.vue', '.json'],
    	// 默认路径代理
    	// 例如 import Vue from 'vue',会自动到 'vue/dist/vue.common.js'中寻找
    	alias: {
        	'@': resolve('src'),
        	'@config': resolve('config'),
        	'vue$': 'vue/dist/vue.common.js'
    	}
    },
    resolveLoader: {},
    module: {
        // 各种不同类型文件加载器配置
        loaders: {
        ...
        ...
        // js文件用babel转码
        {
            test: /\.js$/,
            loader: 'babel',
            include: projectRoot,
            // 哪些文件不需要转码
            exclude: /node_modules/
        },
        ...
        ...
        }
    },
    // vue文件一些相关配置
    vue: {}
}
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

# 2.3 .babelrc

{
  //设定转码规则
  "presets": [
    ["env", { "modules": false }],
    "stage-2"
  ],
  //转码用的插件
  "plugins": ["transform-runtime"],
  "comments": false,
  //对BABEL_ENV或者NODE_ENV指定的不同的环境变量,进行不同的编译操作
  "env": {
    "test": {
      "presets": ["env", "stage-2"],
      "plugins": [ "istanbul" ]
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 2.4 .editorconfig

root = true
 
[*]    // 对所有文件应用下面的规则
charset = utf-8                    // 编码规则用utf-8
indent_style = space               // 缩进用空格
indent_size = 2                    // 缩进数量为2个空格
end_of_line = lf                   // 换行符格式
insert_final_newline = true        // 是否在文件的最后插入一个空行
trim_trailing_whitespace = true    // 是否删除行尾的空格
1
2
3
4
5
6
7
8
9

# 2.5 .gitgnore

我把package.json和package-lock.json加入.gitignore,避免github警告。

### 通配符忽略规则
# 忽略.class的所有文件
*.class

# 忽略名称中末尾为ignore的文件夹
*ignore/

# 忽略名称中间包含ignore的文件夹
*ignore*/
1
2
3
4
5
6
7
8
9
  • 忽略操作系统自动生成的文件,比如缩略图等;

  • 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;

  • 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

# 2.6 .eslintignore

//根目录下的这些文件不受eslint检测
/build/
/config/
/dist/
/*.js
1
2
3
4
5

# 三、模板操作

# 3.1 npm run build

  • 自动进行项目发布打包

    • 根目录生成dist文件夹,里面的文件就是传到服务器的文件
    # dist文件目录
    index.html主页文件(单页web应用)
    static静态资源文件夹:js、css、img
    
    1
    2
    3

# 3.2 文件解读

# 3.2.1 src/main.js

// 整个项目的入口文件
// 优先找.vue文件
import Vue from 'vue'      
import App from './App'
import router from './router'
 
Vue.config.productionTip = false   //生产环境提示,这里设置成了false
 
/* eslint-disable no-new */
new Vue({
  // 挂载点就在根目录下的index.html
  el: '#app',
  // 等价于router: router
  router,
  template: '<App/>',
  // es6语法:键和值一样的情况下,写一个即可
  // 想当于components: { App: App }
  // 表示项目里有一个名为App的组件,然后在这个vue实例里,给这个局部组件也取名为App
  components: { App }
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 3.2.2 src/App.vue

// 单文件组件
<template>
  <div id="app">
    <img src="./assets/logo.png">
    // 使用了路由机制
    // 显示的是当前路由地址所对应的内容
    <router-view></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>
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

# 3.2.3 router/index.js

// 路由文件
// 路由就是根据网址的不同,返回不同的内容给用户
import Vue from 'vue'
import Router from 'vue-router'
// 访问网站时显示的Hello.vue内容
// @是webpack定义的别名
// @这里配置的是src目录
import Hello from '@/components/Hello'
 
Vue.use(Router)
 
export default new Router({
  routes: [
    {
      // 根路径
      // 当用户访问根路径的时候,展示的是Hello.vue这个组件
      path: '/',
      name: 'Hello',
      component: Hello
    }
  ]
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 3.2.4 components/Hello.vue

<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://gitter.im/vuejs/vue" target="_blank">Gitter 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: 'hello',
  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>
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