使用vue-cli构建的vue+webpack的项目可以说是把一切东西都给搭建好了,简直就是开箱即用.也不用过多的关注其中的配置文件,但是当真要去修改的时候反而又是一知半解的,还要去反复的去查文档,所以最近就通读了webpack的官方文档和vue-cli的文档配置,然后对vue+webpack的配置做了一次比较完整的注释.
使用的版本
node版本:6.10.2
npm版本:3.10.10
vue版本:^2.3.3
webpack版本:^2.6.1
在介绍文件内容之前建议大家去读一下webpack的中文官网,最好通读里面的概念,指南,文档,你还需要去了解一下nodejs的process对象和path对象,这对你理解注释内容有很大的帮助.
npm的指令相信大家都比较熟悉了,那接下来就直接根据命令开始介绍了.
1 npm run dev
这个指令你看一下package.json文件就会发现它执行了dev-server.js,那我们就从dev-server.js开始.
dev-server.js
1 | require('./check-versions')()//检查node和npm的版本 |
这个文件引用了三个配置文件,分别是config/index.js,webpack.prod.conf.js,
webpack.dev.conf.js,那我们就直接按照先后顺序来吧.
index.js
1 | // see http://vuejs-templates.github.io/webpack for documentation. |
注:更详细的配置项请参考gitbook上的介绍
webpack.base.conf.js
之所以这里先介绍base是因为这是webpack的一个高级用法,webpack-merge,它可以把基本配置和不同环境的配置合并到一起,避免代码重复.所以就先介绍一下基础的配置项.
1 | var path = require('path')// 使用 NodeJS 自带的文件路径插件 |
注:详细的loader列表可以到webpack的loaders去查看
webpack.prod.conf.js
1 | var path = require('path')//... |
webpack.dev.conf.js
1 | var utils = require('./utils')//封装了一些方法的工具 |
接下来是1
npm run build
build.js
1 | require('./check-versions')()// 检查 Node 和 npm 版本 |
build.js依赖的webpack.prod.conf.js已经在上面介绍了,所以翻上去看看吧.
dev.env.js, prod.env.js, test.env.js
这三个js里面的代码比较简单,就是输出了三个不同的node环境, 分别对应开发环境, 生产环境, 测试环境.
check-versions.js
这里面的代码主要是通过调用shell去打印出node和npm的版本信息,同时会给出版本依赖的警告信息.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
51var chalk = require('chalk')// 用于在控制台输出高亮字体的插件
var semver = require('semver')// 语义化版本检查插件
var packageConfig = require('../package.json')// 引入package.json
var shell = require('shelljs')//引入shelljs
// 开辟子进程执行指令cmd并返回结果
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
// node和npm版本需求
var versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
},
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function () {
var warnings = []
// 依次判断版本是否符合要求
for (var i = 0; i < versionRequirements.length; i++) {
var mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
// 如果有警告则将其输出到控制台
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (var i = 0; i < warnings.length; i++) {
var warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}
dev-client.js
这里主要是开发服务器热重载脚本,用来实现开发阶段的页面自动刷新.