vue cli是一个基于vue.js进行快速开发的完整系统,通常包含三个组件,分别是:
@vue/cli
是全局安装的NPM包,提供终端vue命令,比如vue create
、vue serve
、vue ui
等命令。@vue/cli-service
是开发环境以来,构建在webpack和webpack-dev-server之上,提供诸如serve
、build
、inspect
等命令。Babel/TypeScript
转译、ESLint
集成、UNIT和E2E测试等。安装
vue-cli
改为@vue/cli
,如果已安装vue-cli1.x或2.x,可先通过npm uninstall -g vue-cli
卸载。# 查看Node.js版本
$ node -v
v12.14.0
# 卸载vue-cli
$ npm uninstall -g vue-cli
# 安装vue脚手架
$ npm i -g @vue/cli
# 查看vue版本
$ vue --version
2.9.6
# 使用脚手架创建项目
$ vue create chat
$ cd chat
$ npm run serve
浏览器访问 http://127.0.0.1:8080
创建Vue项目会提示选取一个preset预设,可选默认包含基本的Babel + ESLint
设置的预设,也可手工选择特性。
Vue CLI v4.1.2
? Please pick a preset:
> default(babel, eslint)
Manually select features
default(babel, eslint)
默认设置适合快速创建新项目的原型,无任何辅助功能的NPM包。
Manually select features
手动配置,使用方向键控制,是所需面向生产环境的项目,提供可供选择功能的NPM包。
手动配置提供的NPM包
Vue CLI v4.1.2
? Please pick a preset: Manually select features
? Check the features needed for your project: (Press <space> to select, <a> to toggle all, <i> to invert selection)
>(*) Babel
( ) TypeScript
( ) Progressive Web App (PWA) Support
( ) Router
( ) Vuex
( ) CSS Pre-processors
(*) Linter / Formatter
( ) Unit Testing
( ) E2E Testing
VUE CLI使用一套基于插件的架构,打开package.jsoon
会发现依赖都是以@vue/cli-plugin-
开头。插件可以修改webpack内部配置,也可以向vue-cli-service
注入命令。
例如:手工添加eslint
插件,命令会将@vue/eslint
解析为完整的包名@vue/cli-plugin-eslint
,然后从NPM安装并调用其生成器。若不带@vue
前缀,命令会换做解析一个unscoped包,可基于一个指定的scope使用。
$ vue add @vue/eslint
NPM包 | 描述 |
---|---|
Babel | 转码器,将ES6转换为ES5。 |
TypeScript | JS超集扩展了JS语法,需编译输出为JS。 |
PWA | 渐进式Web应用程序 |
Router | Vue路由 |
Vuex | Vue状态管理模式 |
CSS Pre-processors | CSS预处理器 |
Linter/Formatter | 代码风格检查和格式化 |
Unit Testing | 单元测试 |
E2E Testing | e2e测试 |
Babel是一个JavaScript编译器,用于将ECMAScript2015+版本的代码转换为先后兼容的JavaScript语句。
vue-router默认采用hash模式,也可选择history模式。vue-router利用浏览器自身的hash模式和history模式的特性来实现前端路由,通过了浏览器提供的接口。
#
符号,hash不被包括在HTTP请求中,对后端完全没有影响,因此改变hash不会重新加载页面。pushState()
和replaceState()
方法,需特定浏览器支持,适用于单页客户端应用。history mode徐后台配置支持。vue cli 3中采用src/router.js
文件替代了vue cli 2的src/router/index.js
文件
vuex用于状态管理,vue cli 3中默认使用store.js
代替原vue cli 2种store文件夹中的三个JS文件action、mutations、state以及store的getters用法。
css预处理器用于解决浏览器兼容并简化css代码等问题
文件 | 描述 |
---|---|
.browserslistrc | 用于指定项目的目标浏览器范围 |
package.json | 定义项目所需模块及项目信息 |
package-lock.json | 锁定安装时的包版本号 |
tsconfig.json | TypeScript配置文件 |
babel.config.js | Babel配置文件 |
.eslintrc.js | eslint检测规则配置 |
.gitignore | GIT配置文件 |
public | 配置ico和index.html |
src | vue项目文件夹 |
src/assets/ | 用于存放项目静态文件,包括图片、JS、SVG等,生产环境下会被WebPack复制。 |
src/components/ | 存放公用Vue组件页面 |
src/styles | 存放重写reset.css以及字体图标CSS文件 |
src/views | 存放较大模块,比如登录页、注册页、首页等。 |
vue cli 3摒弃vue cli2的static文件夹新增了public文件夹,vue cli 2中static文件夹是webpack存放默认静态资源的文件夹,打包时会直接复制一份到dist文件夹中,且不会经过webpack编译。vue cli 3中静态资源有两种处理方式:
template/css
中通过相对路径被引用的资源会编译并压缩。vue cli 3中public/index.html
模板会被html-webpack-plugin
处理。
vue cli 3的src文件夹中新增了views文件夹用于存放页面,用于区分components组件。
项目中通常包含多种模式,常见比如开发模式development
、生产模式production
、测试模式test
等,开发中会根据环境变量process.env.NODE_ENV
进行区分。
通过在package.json
的scripts
配置项中添加 --mode xxx
来选择不同环境。
$ vim package.json
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"test:unit": "vue-cli-service test:unit",
"lint": "vue-cli-service lint"
}
"scripts": {
"serve": "vue-cli-service serve --mode development",
"build": "vue-cli-service build --mode development",
"test:unit": "vue-cli-service test:unit --mode development",
"lint": "vue-cli-service lint --mode development"
},
在根目录下创建.env.production
生产环境配置和.env.development
开发环境配置,配置文件以键值对的方式,配置项必须以VUE_APP_
以前缀。NODE_ENV
和BASE_URL
是两个特殊变量,在代码中始终可用。
$ vim .env.development
NODE_ENV = "development"
VUE_APP_API = "http://127.0.0.1:8080/api"
$ vim .env.production
NODE_ENV = "production"
VUE_APP_API = "http://127.0.0.1:8080/api"
vue.config.js
是一个可选的配置文件,若项目根目录中存在此文件,则会被@vue/cli-service
自动加载。
vue-cli 3.x 创建的目录下看不到WebPack配置。手工配置webpack可在根目录下创建vue.config.js
文件。在根目录下创建vue.config.js
文件作为Vue项目配置文件,其中配置输出路径名、根目录、预处理、devServer配置、PWA、DLL、第三方插件等。
$ vim vue.config.js
module.exports = {
configureWebpack:config=>{
if(process.env.NODE_ENV === "production"){
}else{
}
}
};
选项 | 描述 |
---|---|
publicPath | 部署应用宝的基本URL,和webpack的output.publicPath一致。 |
outputDir | 运行vue-cli-service build 时生成的生产环境构建文件的目录,目标目录在够坚强会被清除。 |
assetsDir | 静态资源目录 |
indexPath | 指定生成的index.html 的输出路径 |
filenameHashing | 是否在生成的静态资源文件名中包含hash以控制缓存 |
pages | 在多页模式下构建应用,每个页面对应一个入口文件。 |
lintOnSave | 是否在开发环境下通过eslint-loader在每次保存时lint代码 |
runtimeCompiler | 是否使用包含运行时编译器的vue构建版本 |
VUE CLI支持CSS Modules、PostCSS和SASS、LESS、Stylus在内的预处理器。所有编译后的CSS会通过 css-loader 来解析其中的url()
引用,并将应用作为模块请求来处理。这意味着可以根据本地文件结构使用相对路径引用静态资源。若要应用NPM以来中的文件,或使用webpack alias,则需在路径前添加 ~
前缀来避免歧义。
安装TypeScript
$ npm i -S typescript
$ npm i -S @vue/cli-plugin-typescript
配置TypeScript
若目录下存在tsconfig.json
文件则意味着该目录是TypeScript项目的根目录,tsconfig.json
文件中指定了用来编译项目的根文件和编译选项。项目可使用tsconfig.json
来编译。
tsc
文件,编译器会从当前目录开始查找tsconfig.json
文件,并逐级向上搜索父级目录。tsc
文件且使用命令行参数--project
或-p
指定一个包含tsconfig.json
文件的目录。tsconfig.json
文件会被忽略。根目录下创建tsconfig.json
,默认情况下typescript只负责静态检查,即使遇到错误也仅仅在编译时报错并不会中断编译,最终还是会生成一份JS文件,如果想要在报错时终止JS文件的生成,可在tsconfig.json
配置中设置noEmitOnError
选项为true
。
$ vim tsconfig.json
{
//编译选项
"compilerOptions": {
//编译目标版本
"target": "esnext",
//指定模块系统
"module": "esnext",
//是否启用严格类型检查
"strict": true,
//在.tsx文件中支持JSX
"jsx": "preserve",
//从tslib导入辅助工具函数
"importHelpers": true,
//模块处理方式,默认classic
"moduleResolution": "node",
//是否启用实验性的ES装饰器
"experimentalDecorators": true,
//报错时不生成输出文件
"noEmitOnError":true,
//通过为所有导入创建名称空间对象,支持CommonJS和ES模块之间的互操作性。意味着allowSyntheticDefaultImports。
"esModuleInterop": true,
//是否允许从没有设置默认导出的模块中默认导入,仅用于类型检查。
"allowSyntheticDefaultImports": true,
//是否生成map文件
"sourceMap": true,
//工作根目录
"baseUrl": ".",
//指定引入的类型声明文件,默认自动引入所有声明文件,一旦指定则会禁用自动引入,只引入指定的类型。
"types": [
"webpack-env",
"mocha",
"chai"
],
//指定模块的路径,和baseUrl有关联,和webpack中resolve.alias配置一样。
"paths": {
"@/*": [
"src/*"
]
},
//编译过程中需引入的库文件列表
"lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
},
//指定匹配列表,属于自动指定该路径下所有TS相关文件。
"include": [
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.vue",
"tests/**/*.ts",
"tests/**/*.tsx"
],
//指定排除列表,include的反向操作。
"exclude": [
"node_modules"
]
}