接触过vue的同学应该都知道,用vue-cli开发vue的项目十分方便,它可以帮你快速构建一个具有强大构建能力的Vue.js项目。今天不谈什么是vue-cli,而是来说说用vue-cli构建的项目结构是什么样的并分析部分文件。这里以我之前写的一个小项目为参考,项目是用vue-cli的webpack模板构建的,项目地址:https://github.com/hieeyh/tong2-family 。
项目结构 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
.
|-- 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 // 源码目录
| |-- components // vue公共组件
| |-- store // vuex的状态管理
| |-- App.vue // 页面入口文件
| |-- main.js // 程序入口文件,加载各种公共组件
|-- static // 静态文件,比如一些图片,json数据等
| |-- data // 群聊分析得到的数据用于数据可视化
|-- .babelrc // ES6语法编译配置
|-- .editorconfig // 定义代码格式
|-- .gitignore // git上传需要忽略的文件格式
|-- README.md // 项目说明
|-- favicon.ico
|-- index.html // 入口页面
|-- package.json // 项目基本信息
.
package.json package.json文件是项目根目录下的一个文件,定义该项目开发所需要的各种模块以及一些项目配置信息(如项目名称、版本、描述、作者等)。
scripts字段 package.json文件里有一个scripts字段。1
2
3
4
"scripts" : {
"dev" : "node build/dev-server.js" ,
"build" : "node build/build.js"
}
在开发环境下,在命令行中运行npm run dev
就相当于在执行node build/dev-server.js
。所以script字段是用来指定npm相关命令的缩写的。
dependencies字段和devDependencies字段 dependencies字段指定了项目运行时所依赖的模块,devDependencies字段指定了项目开发时所依赖的模块。在命令行中运行npm install命令,会自动安装dependencies和devDependencies字段中的模块。 package.json还有很多配置相关项,想进一步了解package.json的可参考:https://docs.npmjs.com/files/package.json
webpack配置相关 上面说到在命令行中npm run dev
就相当于在执行node build/dev-server.js
,想必dev-server.js这个文件是十分重要的,它是在开发环境下构建时第一个要运行的文件。掘金上已经有一篇对vue-cli#2.0 webpack配置的分析文章,里面详细讲解了webpack相关配置文件的每行代码的意思,我只做一些补充。链接在此(一定要仔细阅读,收获会很大):https://gold.xitu.io/post/584e48b2ac502e006c74a120 。
dev-server.js 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
...
var proxyMiddleware = require ('http-proxy-middleware' )
...
...
var hotMiddleware = require ('webpack-hot-middleware' )(compiler)
compiler.plugin('compilation' , function (compilation ) {
compilation.plugin('html-webpack-plugin-after-emit' , function (data, cb ) {
hotMiddleware.publish({ action : 'reload' })
cb()
})
})
webpack.base.conf.js 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
...
...
module.export = {
entry: {},
output: {},
resolve: {},
resolveLoader : {},
module : {
loaders: {
...
...
{
test : /\.js$/ ,
loader : 'babel' ,
include : projectRoot,
exclude: /node_modules/
},
...
...
}
},
vue: {}
}
check-version.js 这个文件主要是用来检测当前环境中的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
var semver = require ('semver' )
var chalk = require ('chalk' )
var packageConfig = require ('../package.json' )
var exec = function (cmd ) {
return require ('child_process' )
.execSync(cmd).toString().trim()
}
var versionRequirements = [
{
name : 'node' ,
currentVersion : semver.clean(process.version),
versionRequirement : packageConfig.engines.node
},
{
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)
)
}
}
...
}
想把webpack完全搞懂还是需要费很大功夫的,我感觉自己也只是入了一个门而已,要想深入了解webpack还是要去官网看说明文档。
http://webpack.github.io/docs/
https://webpack.js.org/configuration/
webpack学习之路
.babelrc Babel解释器的配置文件,存放在根目录下。Babel是一个转码器,项目里需要用它将ES6代码转为ES5代码。这里有一篇阮一峰老师写的相关文章供参考:Babel 入门教程 1
2
3
4
5
"presets" : ["es2015" , "stage-2" ],
"plugins" : ["transform-runtime" ],
"comments" : false
.editorconfig 该文件定义项目的编码规范,编辑器的行为会与.editorconfig 文件中定义的一致,并且其优先级比编辑器自身的设置要高,这在多人合作开发项目时十分有用而且必要。1
2
3
4
5
6
7
8
9
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 // 是否删除行尾的空格
了解更多请参考官方配置文档http://editorconfig.org/
接触vue并不久,很多东西也不是特别清楚,文章里有什么问题欢迎指出。