1.项目结构
精简了很多,但还是和vue2.0有很多区别的,基本的用法变化不是特别大
① vuex(状态管理):
vue cli 2 中 :vuex是搭建完成后自己npm install的,并不包括在搭建过程中。可以看到vue cli 2的vuex默认文件夹(store)又包含了三个js文件:action(存放一些调用外部API接口的异步执行的的方法,然后commit mutations改变mutations 数据)、index(初始化mutations 数据,是store的出口)、mutations(处理数据逻辑的同步执行的方法的集合,Vuex中store数据改变的唯一方法commit mutations)
vue cli 3 中:vuex是包含在搭建过程供选择的预设。vue cli 3 中默认只用一个store.js代替了原来的store文件夹中的三个js文件。action、mutations、state以及store 的 getters 的用法有很多
② router (路由):
vue cli 2 :“ router/index.js ”
vue cli 3:“router.js”(用法和做的事都一样)
③ 去掉 static 、 新增 public 文件夹
vue cli 2 :static 是 webpack 默认存放静态资源的文件夹,打包时会直接复制一份到dist文件夹不会经过 webpack 编译
vue cli 3 :摒弃 static 新增了 public 。vue cli 3 中“静态资源”两种处理方式:
经webpack 处理:在 JavaScript 被导入或在 template/CSS 中通过“相对路径”被引用的资源会被编译并压缩
不经webpack 处理:放置在public目录下或通过绝对路径被引用的资源将会“直接被拷贝”一份,不做任何编译压缩处理
④ index.html :
vue cli 2:“index.html ”
vue cli 3:“public/index.html ”此模板会被html-webpack-plugin 处理的
⑤ src/views:
vue cli 3的 src文件夹 新增 views文件夹 用来存放 “页面”,区分 components(组件)
⑥ 去掉 build(根据config中的配置来定义规则)、config(配置不同环境的参数)文件夹 :
vue cli 3中,这些配置 你可以通过 命令行参数、或vue.config.js(在根目录 新建一个 vue.config.js 同名文件)里的devServer 字段配置开发服务器
⑦ babel.config.js:
配置Babel 。Vue CLI 使用了 Babel 7 中的新配置格式babel.config.js。和.babelrc或package.json中的babel字段不同,这个配置文件不会使用基于文件位置的方案,而是会一致地运用到项目根目录以下的所有文件,包括node_modules内部的依赖。官方推荐在 Vue CLI 项目中始终使用babel.config.js取代其它格式。
⑧ 根目录的一些其他文件的改变:
之前所有的配置文件都在vue create 搭建时preset预设 或者 后期可以通过 命令参数 、vue.config.js 中配置
根据需要在根目录下新建 vue.config.js自行配置,eg:(简单配置,更多配置详情参见官网:https://cli.vuejs.org/zh/config/)
module.exports = {
baseUrl: '/',// 部署应用时的根路径(默认'/'),也可用相对路径(存在使用限制)
outputDir: 'dist',// 运行时生成的生产环境构建文件的目录(默认''dist'',构建之前会被清除)
assetsDir: '',//放置生成的静态资源(s、css、img、fonts)的(相对于 outputDir 的)目录(默认'')
indexPath: 'index.html',//指定生成的 index.html 的输出路径(相对于 outputDir)也可以是一个绝对路径。
pages: {//pages 里配置的路径和文件名在你的文档目录必须存在 否则启动服务会报错
index: {//除了 entry 之外都是可选的
entry: 'src/index/main.js',// page 的入口,每个“page”应该有一个对应的 JavaScript 入口文件
template: 'public/index.html',// 模板来源
filename: 'index.html',// 在 dist/index.html 的输出
title: 'Index Page',// 当使用 title 选项时,在 template 中使用:<title><%= htmlWebpackPlugin.options.title %></title>
chunks: ['chunk-vendors', 'chunk-common', 'index'] // 在这个页面中包含的块,默认情况下会包含,提取出来的通用 chunk 和 vendor chunk
},
subpage: 'src/subpage/main.js'//官方解释:当使用只有入口的字符串格式时,模板会被推导为'public/subpage.html',若找不到就回退到'public/index.html',输出文件名会被推导为'subpage.html'
},
lintOnSave: true,// 是否在保存的时候检查
productionSourceMap: true,// 生产环境是否生成 sourceMap 文件
css: {
extract: true,// 是否使用css分离插件 ExtractTextPlugin
sourceMap: false,// 开启 CSS source maps
loaderOptions: {},// css预设器配置项
modules: false// 启用 CSS modules for all css / pre-processor files.
},
devServer: {// 环境配置
host: 'localhost',
port: 8080,
https: false,
hotOnly: false,
open: true, //配置自动启动浏览器
proxy: {// 配置多个代理(配置一个 proxy: 'http://localhost:4000' )
'/api': {
target: '<url>',
ws: true,
changeOrigin: true
},
'/foo': {
target: '<other_url>'
}
}
},
pluginOptions: {// 第三方插件配置
// ...
}
};
vue-cli升级到3之后,减少了很多的配置文件,将所有的配置项都浓缩到了vue.config.js这个文件中,所以学懂并会用vue.config.js文件很重要。
这里有一篇关于vue-cli3的全面配置的文章供大家参考,https://segmentfault.com/a/119000001700869
2.热更新配置
在vue.config.js添加
chainWebpack: config => {
// 修复HMR
config.resolve.symlinks(true);
}
运行发现css没有执行热更新,然后再在vue.config.js添加并修改
css: {
// 是否使用css分离插件
//extract: true,
// 开启 CSS source
ExtractTextPluginsourceMap:false,
// css预设器配置项
mapsloaderOptions: {},
// 启用 CSS modules for all css / pre-processor files
modules:false,
}
下面是我自己的vue.config.js配置
//引入gzip
const CompressionPlugin =require('compression-webpack-plugin');
//引入cdn
const cdn = {
js: [
'https://lib.baomitu.com/vue/2.6.10/vue.min.js',
'https://lib.baomitu.com/vuex/3.1.0/vuex.min.js',
'https://lib.baomitu.com/vue-router/3.0.6/vue-router.min.js',
'https://cdn.jsdelivr.net/npm/vue',
'https://cdn.jsdelivr.net/npm/ant-design-vue@1.6.5/dist/antd.min.js',
'https://lib.baomitu.com/moment.js/2.29.1/moment.min.js',
'https://lib.baomitu.com/moment.js/2.20.1/locale/zh-cn.js'
],
css: ['https://cdn.jsdelivr.net/npm/ant-design-vue@1.6.5/dist/antd.min.css']
}
module.exports = {
devServer: {
proxy: {
"/api": {
// 木木
// target: 'http://192.168.3.108:8090/',
// target: "http://42.192.157.203:80/",
// target: "http://mumu.cn1.utools.club",
// target: 'http://127.0.0.1:8090/',
ws:true,
changeOrigin:true,
autoOpenBrowser:true,
}
},//新版的webpack-dev-server出于安全考虑,默认检查hostname,如果hostname不是配置内的,将中断访问。解决方法:
disableHostCheck: true
},
// 查看打包文件体积大小
chainWebpack: config => {
config
.plugin('webpack-bundle-analyzer')
.use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
.end();
config.plugins.delete('prefetch')
},
// cdn处理
chainWebpack(config) {
config.plugin('html').tap(opts => {
opts[0].cdn = cdn;
return opts
})
},
//css分离
css:{
// 是否使用css分离插件ExtractTextPlugin
extract:false,
// 开启CSS source maps?
sourceMap:false,
// css预设器配置项
loaderOptions:{},
// 启用CSS modules for all css / pre-processor files.
requireModuleExtension:false,
},
// 再次打包就没有.map文件了
productionSourceMap:false,
// 在 vue.congig.js中引入gzip并修改 webpack配置
configureWebpack: {
// 用cdn方式引入
externals:{
'vue': 'Vue',
'vuex': 'Vuex',
'vue-router': 'VueRouter',
'ant-design-vue': 'antd',
"moment": "moment",
},
plugins: [
new CompressionPlugin({
test:/\.js$|\.html$|\.css/,// 哪些文件要压缩
// filename: '[path].gz[query]', // 压缩后的文件名
threshold:0,//对只有大小大于该值的资源会被进行压缩
algorithm:'gzip', // 使用gzip压缩
minRatio:0.8, // 压缩率小于0.8才会压缩
deleteOriginalAssets:false // 删除未压缩的文件,谨慎设置,如果希望提供非gzip的资源,可不设置或者设置为false
})
],
//分割代码
optimization : {
splitChunks: {
// chunks: 'all',
cacheGroups: {
vendor: {
chunks:'all',
test:/node_modules/,
name:'vendor',
minChunks:1,
maxInitialRequests:5,
minSize:0,
priority:100
},
common: {
chunks:'all',
test:/[\\/]src[\\/]js[\\/]/,
name:'common',
minChunks:2,
maxInitialRequests:5,
minSize:0,
priority:60
},
styles: {
name:'styles',
test:/\.(sa|sc|c)ss$/,
chunks:'all',
enforce:true
},
runtimeChunk: {
name:'manifest'
}
}
}
},
//上诉为公共代码抽离
},
};