主要区别
- 安装与项目构建
- 项目目录变化
- 项目配置变化
安装&项目构建
CLI安装
cli的包名变更
# cli 2.x
npm install -g vue-cli
# cli 3.x
# 3.x 安装时,如果之前安装了2.x需要卸载2.x再安装
npm install -g @vue/cli
复制代码
项目构建
cli2.x
vue init
npm i
npm run dev
复制代码
cli3.x
- 安装新增
TypeScript
配置选项- 新增
图形化安装
方法- 保留了2.x之前的安装方法
vue create hello-world
npm i
npm run serve
# 使用vue ui创建新项目(3.x新增)
vue ui
# 使用旧版(2.X)创建
npm install -g @vue/cli-init
# 'vue init'的运行效果与‘[email protected]’相同
vue init webpack projectname
复制代码
3.x后目录结构变化[替换2.x功能的新特性]
config
目录删除,使用模式的.env
文件代替[模式
]
cli3
新增模式
概念,每个模式在项目中都有对应的配置文件,项目启动时,对应的文件就会加载,与环境变量不同,一个模式可以包括多个环境变量
Vue CLI
项目默认有三个模式:development
模式用于vue-cli-service serve
production
模式用于vue-cli-service build
和vue-cli-service test:e2e
test
模式用于vue-cli-service test:unit
- 模式需要在启动项目时使用
--mode
指定
NODE_ENV=development npm run serve --mode mymode # 模式包含多个环境变量
复制代码
- 每个模式有多个环境变量,
cli3.x
为模式与环境变量指定了一个.env
配置文件
.env # 所有环境
.env.mode # mode模式加载的配置文件[优先级高于.env]
.env.mode.development # mode模式下,development环境所加载的配置文件[优先级最高]
复制代码
.env
文件详细信息- 这些文件是用来代替
config
目录的 - 以
VUE_APP_
开头的变量可以再代码中通过process.env
访问,其他的变量不可访问 - process.env始终含有两个特殊变量
NODE_ENV
和BASE_URL
- 这些文件是用来代替
3.x
版本的config
目录虽然删除,但是如果不习惯.env
的方式,可以不设置任何模式,只指定NODE_ENV,按2.x的config方法配置参数
删除static目录[新增public目录]
删除了static
目录,它的静态资源转移到public
目录中,通过/xx.xx
可以直接访问
public
详细信息
index.html
入口文件从根目录转到public
目录下,它拥有3个特殊插值<%= VALUE %>
用来做不转义插值;<%- VALUE %>
用来做 HTML 转义插值;<% expression %>
用来描述 JavaScript 流程控制
- 静态资源被转移到
public
目录存放 cli3
项目的静态资源有两种处理方式- 在J
avaScript
或template/css(vue)
中通过相对路径导入。这类资源会被webpack处理(不在public
目录) - 放在
public
目录或者使用绝对路径被导入的静态资源。这类资源会被直接拷贝,不会经过webpack
处理
- 在J
cli3.x
项目配置的不同(build
目录删除)
2.x
版本的项目配置是在config
和build
中完成,但是,到了3.x
版本,这两个目录都被删除,如果需要自定义配置,需要自己新建vue.config.js
文件
publicPath
- 部署应用包时的基本URL,即
webpack
的output.publicPath
- 但,
vue
项目中其他地方会用到publicPath
,所以不要修改webpack
的output.publicPath
- 用来取代
baseUrl
的,baseUrl 3.3
后已弃用
- 部署应用包时的基本URL,即
outputDir
build
构建的文件存放的目录- 即
output.path
,但只能修改outputDir
,不能修改output.path
assetsDir
编译后,在outputDir
目录中存放静态资源的目录lintOnSave
配置eslint
后,是否每次保存lint
代码,默认启动runtimeCompiler
是否使用包含运行时编译器的 Vue 构建版本,默认不启动configureWebpack
&chainWebpack
- 这两个选项是用来配置
webpack
内容的,前者是合并对象,后者是链式调用 - [
cli3.6
]webpack
的build
代码压缩默认不开启,需要设置环境变量为productio
n才会开启
- 这两个选项是用来配置
devServer
支持所有webpack-dev-server
选项- 配置项目端口、域名
host、port、https
- 配置项目跨域代理
proxy
module.exports = { port: 8100, devServer: { proxy: 'http://localhost:4000' } } 复制代码
- 配置项目端口、域名
新增功能特性
快速原型开发
在cli3.x
中可以使用vue serve
和vue build
命令对单个*.vue
文件进行快速原型开发
vue serve 的缺点就是它需要安装全局依赖,这使得它在不同机器上的一致性不能得到保证。因此这只适用于快速原型开发
安装全局依赖
npm install -g @vue/cli-service-global
复制代码
单个文件
<template>
<h1>Hello!h1>
template>
复制代码
vue serve
运行文件
vue serve myComponent.vue
Usage: serve [options] [entry]
在开发环境模式下零配置为 .js 或 .vue 文件启动一个服务器
Options:
-o, --open 打开浏览器
-c, --copy 将本地 URL 复制到剪切板
-h, --help 输出用法信息
复制代码
vue build
编译文件
vue build myComponent.vue
Usage: build [options] [entry]
在生产环境模式下零配置构建一个 .js 或 .vue 文件
Options:
-t, --target 构建目标 (app | lib | wc | wc-async, 默认值:app)
-n, --name 库的名字或 Web Components 组件的名字 (默认值:入口文件名)
-d, --dest 输出目录 (默认值:dist)
-h, --help 输出用法信息
复制代码
图形化界面
vue cli3
新增一个UI图形化管理页面,可以通过它新建项目、管理原有项目的插件
创建新项目
vue ui # 启动图形化界面
复制代码
创建项目名称、管理工具等
选择是默认、自定义设置、从远程仓库拉取
第一、第三种选择后直接创建项目,第二种执行下一步,且功能与配置页的信息与之前命令行安装的相同
管理原有项目(包括2.X项目)
- 插件管理(更新,查看)(3.x)
- 依赖(module)管理(删除、安装、更新、查看)(2.x、3.x)
- 项目配置修改 (3.x)
- 项目任务(项目script命令启动、停止操作)(2.x、3.x)
cli
插件
什么是插件
vue cli3.x
使用了一套基于插件的架构,cli的相关依赖都是以@vue/cli-plugin-
开头的- 插件可以修改内部的
webpack
配置,也可以向vue-cli-service
注入命令 - 在项目创建的过程中列出的特性,绝大部分都是通过插件来实现的
vue add
插件的安装
cli3.x
项目提供了vue add
命令来安装插件
vue add @vue/cli-plugin-eslint
复制代码
同时,该命令可以识别下列写法,命令与上一行的命令等价
vue add eslint
vue add @vue/eslint
复制代码
该命令也可以在一个指定的范围内安装第三方插件
# 插件名:@foo/vue-cli-plugin-bar
vue add @foo/bar
复制代码
也可以向插件传递生成器选项
这样会跳过命令提示
vue add @vue/eslint --config airbnb --lintOn save
复制代码
特殊的vue-router
和vuex
它们没有对应的插件,但是依旧可以使用vue add
在项目中添加它们
vue add router
vue add vuex
复制代码
vue invoke
调用生成器
该命令会跳过安装过程直接调用插件的生成器,接收和vue add一致的参数
vue invoke @foo/bar
复制代码
本地插件读取
如果只需要在项目中直接访问插件API,而不需要创建完整的插件 可以使用vuePlugin.service配置
{
"vuePlugins": {
"service": ["my-commands.js"]
}
}
复制代码
或者 vuePlugin.ui 添加为UI插件
{
"vuePlugins": {
"ui": ["my-ui.js"]
}
}
复制代码
预设配置
什么是预设配置
预设配置是一个包含创建新项目时所需的预定义选项和插件的JSON对象,只要在创建项目时,选中这个对象文件,就能安装文件的JSON内容常见项目,实现快速自定义创建项目
{
"useConfigFiles": true,
"router": true,
"vuex": true,
"cssPreprocessor": "sass",
"plugins": {
"@vue/cli-plugin-babel": {},
"@vue/cli-plugin-eslint": {
"config": "airbnb",
"lintOn": ["save", "commit"]
}
},
"configs": {
"vue": {...},
"postcss": {...},
"eslintConfig": {...},
"jest": {...}
}
}
复制代码
预设配置包括插件生成器配置和集成工具的配置等待 这些配置会根据useConfigFiles
合并到package.json
或相应的配置文件中,如当 "useConfigFiles": true
的时候,configs
的值将会被合并到 vue.config.js
中
预设配置插件的版本管理
预设配置中的插件可以显示的指定版本范围,如果没有值是由registry中最新版本(官方推荐指定)
{
"plugins": {
"@vue/cli-plugin-eslint": {
"version": "^3.0.0",
// ... 该插件的其它选项
}
}
}
复制代码
允许插件的命令提示
每个插件在项目创建的过程中都可以注入它自己的命令提示,不过当你使用了预设配置,这些命令提示就会被跳过,如果需要展示命令提示,则需要设置"prompts": true
即可
{
"plugins": {
"@vue/cli-plugin-eslint": {
// 让用户选取他们自己的 ESLint 配置
"prompts": true
}
}
}
复制代码
预设配置的使用
同时加载多个预设配置,选择使用
vue create过程中保存的预设配置默认存放在~/.vuerc 将预设配置写在vuerc的'presets'属性中可以再创建项目时,可以显示多个预设配置。直接选择需要的创建项目即可
{
"useTaobaoRegistry": false,
"packageManager": "npm",
"presets": { // 预设配置添加的地方,可添加多个预设配置
"my_sets": { // 名为‘my_sets’的预设配置
"useConfigFiles": true,
"router": true,
"vuex": true,
"cssPreprocessor": "sass",
"plugins": {
"@vue/cli-plugin-babel": {},
"@vue/cli-plugin-eslint": {
"config": "airbnb",
"lintOn": ["save", "commit"]
}
}
}
}
}
复制代码
在vue create
命令中使用--preset
指定预设配置
该种形式只能加载json形式的文件,它有两种形式:本地预设和远程预设
本地预设
如果--preset
选项的值是一个相对或绝对文件路径,或是以 .json
结尾,则加载本地预设,否则加载远程预设
# ./my-preset 应当是一个包含 preset.json 的文件夹
vue create --preset ./my-preset my-project
# 或者,直接使用当前工作目录下的 json 文件:
vue create --preset my-preset.json my-project
复制代码
远程预设
从git上获取别人分享的预设
- 发布预设配置:通过发布
git repo
将一个预设配置分享给其他开发者,repo
应该包含以下文件: *preset.json
: 包含预设配置数据的主要文件(必需)。generator.js
: 一个可以注入或是修改项目中文件的 Generator。prompts.js
:一个可以为generator
收集选项的prompts
文件
- 拉取配置
# 从 GitHub repo 使用预设配置
vue create --preset username/repo my-project
复制代码
GitLab
和BitBucke
t 也是支持的。如果要从私有 repo 获取,请确保使用--clone
选项:
vue create --preset gitlab:username/repo --clone my-project
vue create --preset bitbucket:username/repo --clone my-project
# 自托管的 repo
vue create --preset gitlab:my-gitlab-server.com:group/projectname --clone my-project
vue create --preset direct:ssh://[email protected]/group/projectname.git --clone my-project
复制代码
配置文件样例
const path = require('path')
function resolve (dir) {
return path.join(__dirname, dir)
}
module.exports = {
publicPath: '/',
assetsDir: 'static',
productionSourceMap: false,
configureWebpack: config => {
if (process.env.VUE_APP_NODE_ENV === 'production') {
// 为生产环境修改配置...
} else {
// 为开发环境修改配置...
}
},
// 解析别名处理
chainWebpack: config => {
config.resolve.alias
.set('@img', resolve('src/assets/img'))
.set('@c', resolve('src/components'))
.set('@m', resolve('src/mixins'))
.set('@v', resolve('src/views'))
.set('@s', resolve('src/store'))
},
// 配置高于chainWebpack中关于 css loader 的配置
css: {
// 是否开启支持 foo.module.css 样式
modules: false,
// 是否使用 css 分离插件 ExtractTextPlugin,采用独立样式文件载入,不采用