准备
安装命令行工具(CLI)
Vue.js 提供了很人性化的命令行工具,在全局安装了依赖以后,便能轻松的在文件系统任意角落利用脚手架创建并启动一个配备了带热重载、保存时静态检查以及可用于生产环境的构建配置的项目,具体命令如下:
1 | # 全局安装 vue-cli |
查看安装结果
1 | vue -V |
项目组成
目录结构
├── build
│ ├── build.js
│ ├── check-versions.js
│ ├── dev-client.js
│ ├── dev-server.js
│ ├── utils.js
│ ├── vue-loader.conf.js
│ ├── webpack.base.conf.js
│ ├── webpack.dev.conf.js
│ ├── webpack.test.conf.js
│ └── webpack.prod.conf.js
├── config
│ ├── dev.env.js
│ ├── index.js
│ ├── test.env.js
│ └── prod.env.js
├── node_modules
├── src
│ ├── App.vue
│ ├── assets
│ │ └── img.png
│ ├── components
│ │ └── Hello.vue
│ └── main.js
├── static
├── test
│ └── unit
│ │ ├─── coverage
│ │ ├─── specs
│ │ ├─── .eslintrc
│ │ ├─── index.js
│ │ └── karma.conf.js
│ └── e2e
├── .babelrc
├── .editorconfig
├── .gitignore
├── .postcssrc.js
├── index.html
├── package.json
└── README.md
/build
build.js
在执行 npm run build
的时候,执行的 js 脚本,主要是加载了生产环境下的 webpack 配置,并根据 webpack 配置重新构建出生产环境下使用的压缩项目,最终资源文件会生成到根目录下 dist
文件中。
check-version.js
在 build 之前的一个 check 步骤,作为构建生产项目包之前的一个校验处理。
dev-client.js
1 | require('eventsource-polyfill') |
加载了热重载插件,并在监听到事件的 action
变化为 reload
的时候,实现网页 reload。
dev-server.js
1 | var app = express(); |
利用了 express 实现了一个本地开发的服务,同时配置了热重载功能以配合本地开发浏览器端自动 reload 刷新。
utils.js
utils.js
主要是对外给响应的 webpack 配置使用的工具方法,包含了对外提供静态资源 asset 路径:
1 | exports.assetsPath = function(_path) { |
对外提供各种 loaders 的配置,如 cssLoaders, css/postcss/less/sass/scss/stylus/styl 等预处理或后处理器配置等:
1 | return { |
vue-loader.conf.js
顾名思义,该文件就是为 vue 单文件所用的配置,主要是一些单文件内使用 css 预处理的配置,还有一些文件资源的转化配置项。
webpack.base.conf.js
webpack 的通用配置文件,即无论环境是 test
,develop
还是 production
,都需要加载的 webpack 配置,该文件很重要,也时长需要修改配置:
入口文件 entry
1 | entry: { |
默认只有 app 为入口的main.js
,utils 为自定义入口,通过配置多个文件入口,可以减少 build 后的文件大小,同时也可以配合 CommonsChunkPlugin
插件进行项目分包。
输出文件 output
config 的配置在 config/index.js 文件中
1 | output: { |
文件解析 resolve
主要设置模块如何被解析。
1 | resolve: { |
其中默认定义了vue$
为 vue.esm.js
文件的别名, @
为 /src
目录的别名,通过 @/xxx.js
或者 @/xxx.vue
可以快速引入文件,注意 vue 文件内只有.js 和.vue 文件可以使用@去寻址,scss 或者 less 等文件是不被允许的使用@
去找寻文件的。
模块解析机制 module
该模块主要用于定义不同文件后缀的文件,应该使用何种 loaders(加载器)进行加载解析,与 webpack 1.x 不同的是,原来的 loaders
被替换为 rules
;这里需要注意,默认的 vue-cli 已经为你配备了.vue
,.js
,img类
,媒体类
,字体类
等的文件的解析,同时,.vue
组件中如需用到的预处理语言,则需要在 <style>
标签上增加 lang
属性即可,如
1 | <style lang="scss" scoped> |
webpack.dev.conf.js
通过 merge 方法合并 webpack.base.conf.js 基础配置
1 | var merge = require('webpack-merge') |
模块配置
1 | module: { |
这里引用了刚才 utils.js 中 styleLoaders 方法,自动生成的配置如下
1 | exports.styleLoaders = function(options) { |
上面的代码中调用了 exports.cssLoaders(options),主要用于对各类 css 预处理的 loaders 实现,具体实现如下
1 | exports.cssLoaders = function(options) { |
插件配置
1 | plugins: [ |
webpack.prod.conf.js
该文件是生产环境打包用到的配置文件,同样使用 merge 的方式合并了基础配置,形成了生产要用的配置:
判断环境
1 | //判断环境,如果是testing的话,则加载test.env |
加载样式处理器
1 | module: { |
输出文件
1 | output: { |
注意,这里的异步文件块,系统会根据自己在 router
下 index.js
当中引入的异步组件自动生成,所以我们无需重命名这部分的文件,否则容易导致文件索引出错,出现 404 错误。
插件
1 | //这里定义全局环境为生产 |
注意,这里通过 CommonsChunkPlugin
插件将 vue, vuex 等包文件统一打在了名为:vendor 的 js 中,最后会生成一个类似叫 vendor.7d0bcfcc47ab773ebe20834b27a0927a.js
,当然为了防止 app 打包的 hash 的每次变化,导致资源无法缓存,我们需要增加一个 manifest
,去将运行时的代码单独编译到 manifest 文件,以防每次编译都导致 vendor.js 的 hash 改变:
1 | new webpack.optimize.CommonsChunkPlugin({ |
有时候,我们需要将我们引入的第三发库 js,单独打包另外一个文件,假如叫 utils.js,我们同样可以使用CommonsChunkPlugin
进行处理:
1 | new webpack.optimize.CommonsChunkPlugin({ |
别忘了我们需要为它加入 manifest 处理,只需在已有的基础上简单修改:
1 | new webpack.optimize.CommonsChunkPlugin({ |
当然,我们需要为其增加一个入口文件,
1 | entry: { |
其他插件
此外,还有其他的一些插件,如 compression-webpack-plugin
,用于根据正则匹配进行压缩处理的; webpack-bundle-analyzer
可以为你的包的尺寸优化等的,自己可以摸索一下。
/config
环境变量定义
该部分定义了生产,开发和测试的全局环境变量,以调整在不同环境下使用不同的 webpack 配置,通过定义 NODE_ENV
变量:
1 | var merge = require('webpack-merge') |
/node_modules
npm 安装的第三包
这里估计使用过 npm 的同学都不会陌生,这里放置的都是我们通过npm install
方式安装的第三方工具类,可供我们通过 require 关键字快速引入。
/test
unit
该文件主要是对 vue-cli 建立的项目配备了 unit-test 的配套,可以让用户快速编写组件级别的单元测试,并通过在根目录下使用 npm run unit
命令去进行代码的单元测试:
index.js
1 | const testsContext = require.context('./specs', true, /\.spec$/) |
通过 require 当前目录下 specs
中的用例文件,去进行.vue 单元测试
1 | const srcContext = require.context('../../src', true, /^\.\/(?!main(\.js)?$)/) |
这里定义了读取的源文件目录,第一行通过正则的方式去读取../../src
下,除了main.js
以外的文件进行遍历,我么如果只需对局部的文件进行单元测试,我们可以把路径范围缩小 如只对 src 下的 components 进行单元测试:
1 | const srcContext = require.context('../../src/components', true, /^\.\/(?!main(\.js)?$)/) |
karma.conf.js
由于 vue-cli 配备的单元测试,使用了 karma.js,这里我们只需要使用默认的配置即可,一般不用更改。
specs
这里是测试用例当中的 断言
部分,通过编写 *.spec.js
去对组件中的逻辑部分进行断言判断,达到单元测试的效果,下面是一个对组件实例化,并对组件中的视图文字进行断言的例子:
1 | import Vue from 'vue' |
coverage
karma 的单元测试,同时提供了 coverage Rate
即单元测试的覆盖率,会根据不同文件,从行数到函数的数量,描述你的单元测试是否完整,通过 npm run unit
完成后,查看 coverage\lcov-report\index.html
可以看到覆盖率结果:
根目录
.babelrc
1 | { |
制定了 babel 的配置,定义了加载的插件和测试运行时所需的插件 istanbul
.editorconfig
1 | root = true |
定义了编辑格式:利用utf-8
编码, 空格缩进方式 space
, 行缩进 两个字符
还有 结尾插入新行,处理字符首尾空白字符。
.gitignore
很熟悉的配置,即 git 仓库同步时需要忽略提交的文件,可以通过准确和正则的方式进行所需要忽略,不赘述。
1 | .DS_Store |
.postcssrc.js
新版的 webpack 只要配备了 postcss 的 loaders,都会检查根目录是否有该配置文件,通过导出 plugins
,进行配置你所需要的,下面是我使用了 autoprefixer
和 postcss-sprites
的配置
1 | module.exports = { |
index.html
1 |
|
html 模板,可以供 htmlPlugins 插件使用,后面编译好的脚本会自动 injected 到注释行内。
package.json
估计用过 npm 的同学,也应该了解了,这个文件是用于记录和管理 npm 包的依赖和版本号,不赘述。
README.md
文件如其名,就是阅读说明,你们可以在里面对项目的一些使用或者命令行进行描述,以作记录。