vue-cli3全面配置详解
本文介绍了vue-cli3全面配置详解,分享给大家,具体如下:
vue-cli3-config
创建项目
配置环境变量
通过在package.json里的scripts配置项中添加--modexxx来选择不同环境
在项目根目录中新建.env,.env.production,.env.analyz等文件
只有以VUE_APP_开头的变量会被webpack.DefinePlugin静态嵌入到客户端侧的包中,代码中可以通过process.env.VUE_APP_BASE_API访问
NODE_ENV和BASE_URL是两个特殊变量,在代码中始终可用
.envserve默认的环境变量
NODE_ENV='development' VUE_APP_BASE_API='https://demo.cn/api' VUE_APP_SRC='https://wechat-timg.oss-cn-hangzhou.aliyuncs.com/demo'
.env.productionbuild默认的环境变量
NODE_ENV='production' VUE_APP_BASE_API='https://demo.com/api' VUE_APP_SRC='https://img-wechat.oss-cn-hangzhou.aliyuncs.com/demo'
.env.analyz用于webpack-bundle-analyzer打包分析
NODE_ENV='production' IS_ANALYZ='analyz' VUE_APP_BASE_API='https://demo.com/api' VUE_APP_SRC='https://img-wechat.oss-cn-hangzhou.aliyuncs.com/demo'
修改package.json
"scripts":{
"serve":"vue-cli-serviceserve",
"build":"vue-cli-servicebuild",
"analyz":"vue-cli-servicebuild--modeanalyz",
"lint":"vue-cli-servicelint"
}
配置vue.config.js
constIS_PROD=['production','prod'].includes(process.env.NODE_ENV);
module.exports={
baseUrl:'./',//默认'/',部署应用包时的基本URL
outputDir:process.env.outputDir||'dist',//'dist',生产环境构建文件的目录
assetsDir:'',//相对于outputDir的静态资源(js、css、img、fonts)目录
lintOnSave:false,
runtimeCompiler:true,//是否使用包含运行时编译器的Vue构建版本
productionSourceMap:false,//生产环境的sourcemap
parallel:require('os').cpus().length>1,
pwa:{}
};
配置proxy跨域
constIS_PROD=['production','prod'].includes(process.env.NODE_ENV);
module.exports={
devServer:{
//overlay:{
//warnings:true,
//errors:true
//},
open:IS_PROD,
host:'0.0.0.0',
port:8000,
https:false,
hotOnly:false,
proxy:{
'/api':{
target:process.env.VUE_APP_BASE_API||'http://127.0.0.1:8080',
changeOrigin:true
}
}
}
}
修复HMR(热更新)失效
module.exports={
chainWebpack:config=>{
//修复HMR
config.resolve.symlinks(true);
}
}
添加别名
constpath=require('path');
constresolve=(dir)=>path.join(__dirname,dir);
constIS_PROD=['production','prod'].includes(process.env.NODE_ENV);
module.exports={
chainWebpack:config=>{
//添加别名
config.resolve.alias
.set('@',resolve('src'))
.set('assets',resolve('src/assets'))
.set('components',resolve('src/components'))
.set('layout',resolve('src/layout'))
.set('base',resolve('src/base'))
.set('static',resolve('src/static'));
}
}
添加打包分析
constBundleAnalyzerPlugin=require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports={
chainWebpack:config=>{
//打包分析
if(process.env.IS_ANALYZ){
config.plugin('webpack-report')
.use(BundleAnalyzerPlugin,[{
analyzerMode:'static',
}]);
}
}
}
配置externals
防止将某些import的包(package)打包到bundle中,而是在运行时(runtime)再去从外部获取这些扩展依赖
module.exports={
configureWebpack:config=>{
config.externals={
'vue':'Vue',
'element-ui':'ELEMENT',
'vue-router':'VueRouter',
'vuex':'Vuex',
'axios':'axios'
}
}
}
去掉console.log
方法一:
constUglifyJsPlugin=require('uglifyjs-webpack-plugin');
module.exports={
configureWebpack:config=>{
if(IS_PROD){
constplugins=[];
plugins.push(
newUglifyJsPlugin({
uglifyOptions:{
compress:{
warnings:false,
drop_console:true,
drop_debugger:false,
pure_funcs:['console.log']//移除console
}
},
sourceMap:false,
parallel:true
})
);
config.plugins=[
...config.plugins,
...plugins
];
}
}
}
方法二:使用babel-plugin-transform-remove-console插件
npmi--save-devbabel-plugin-transform-remove-console
在babel.config.js中配置
constplugins=[];
if(['production','prod'].includes(process.env.NODE_ENV)){
plugins.push("transform-remove-console")
}
module.exports={
presets:[["@vue/app",{"useBuiltIns":"entry"}]],
plugins:plugins
};
开启gzip压缩
npmi--save-devcompression-webpack-plugin
constCompressionWebpackPlugin=require('compression-webpack-plugin');
constproductionGzipExtensions=/\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;
module.exports={
configureWebpack:config=>{
if(IS_PROD){
constplugins=[];
plugins.push(
newCompressionWebpackPlugin({
filename:'[path].gz[query]',
algorithm:'gzip',
test:productionGzipExtensions,
threshold:10240,
minRatio:0.8
})
);
config.plugins=[
...config.plugins,
...plugins
];
}
}
}
还可以开启比gzip体验更好的Zopfli压缩详见https://webpack.js.org/plugins/compression-webpack-plugin
npmi--save-dev@gfx/zopflibrotli-webpack-plugin
constCompressionWebpackPlugin=require('compression-webpack-plugin');
constzopfli=require("@gfx/zopfli");
constBrotliPlugin=require("brotli-webpack-plugin");
constproductionGzipExtensions=/\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;
module.exports={
configureWebpack:config=>{
if(IS_PROD){
constplugins=[];
plugins.push(
newCompressionWebpackPlugin({
algorithm(input,compressionOptions,callback){
returnzopfli.gzip(input,compressionOptions,callback);
},
compressionOptions:{
numiterations:15
},
minRatio:0.99,
test:productionGzipExtensions
})
);
plugins.push(
newBrotliPlugin({
test:productionGzipExtensions,
minRatio:0.99
})
);
config.plugins=[
...config.plugins,
...plugins
];
}
}
}
为sass提供全局样式,以及全局变量
可以通过在main.js中Vue.prototype.$src=process.env.VUE_APP_SRC;挂载环境变量中的配置信息,然后在js中使用$src访问。
css中可以使用注入sass变量访问环境变量中的配置信息
module.exports={
css:{
modules:false,
extract:IS_PROD,
sourceMap:false,
loaderOptions:{
sass:{
//向全局sass样式传入共享的全局变量
data:`@import"~assets/scss/variables.scss";$src:"${process.env.VUE_APP_SRC}";`
}
}
}
}
在scss中引用
.home{
background:url($src+'/images/500.png');
}
添加IE兼容
npmi--save@babel/polyfill
在main.js中添加
import'@babel/polyfill';
配置babel.config.js
constplugins=[];
module.exports={
presets:[["@vue/app",{"useBuiltIns":"entry"}]],
plugins:plugins
};
完整配置
安装依赖
npmi--save-devcompression-webpack-pluginbabel-plugin-transform-remove-console@gfx/zopflibrotli-webpack-plugin
package.json
"scripts":{
"serve":"vue-cli-serviceserve",
"build":"vue-cli-servicebuild",
"analyz":"vue-cli-servicebuild--modeanalyz",
"lint":"vue-cli-servicelint"
}
babel.config.js
constplugins=[];
//if(['production','prod'].includes(process.env.NODE_ENV)){
//plugins.push("transform-remove-console")
//}
module.exports={
presets:[["@vue/app",{"useBuiltIns":"entry"}]],
plugins:plugins
};
vue.config.js
constBundleAnalyzerPlugin=require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
constUglifyJsPlugin=require('uglifyjs-webpack-plugin');
constCompressionWebpackPlugin=require('compression-webpack-plugin');
//constzopfli=require("@gfx/zopfli");
//constBrotliPlugin=require("brotli-webpack-plugin");
constpath=require('path');
constresolve=(dir)=>path.join(__dirname,dir);
constIS_PROD=['production','prod'].includes(process.env.NODE_ENV);
constproductionGzipExtensions=/\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;
module.exports={
baseUrl:'./',//默认'/',部署应用包时的基本URL
outputDir:process.env.outputDir||'dist',//'dist',生产环境构建文件的目录
assetsDir:'',//相对于outputDir的静态资源(js、css、img、fonts)目录
lintOnSave:false,
runtimeCompiler:true,//是否使用包含运行时编译器的Vue构建版本
productionSourceMap:false,//生产环境的sourcemap
configureWebpack:config=>{
//config.externals={
//'vue':'Vue',
//'element-ui':'ELEMENT',
//'vue-router':'VueRouter',
//'vuex':'Vuex',
//'axios':'axios'
//}
if(IS_PROD){
constplugins=[];
plugins.push(
newUglifyJsPlugin({
uglifyOptions:{
compress:{
warnings:false,
drop_console:true,
drop_debugger:false,
pure_funcs:['console.log']//移除console
}
},
sourceMap:false,
parallel:true
})
);
plugins.push(
newCompressionWebpackPlugin({
filename:'[path].gz[query]',
algorithm:'gzip',
test:productionGzipExtensions,
threshold:10240,
minRatio:0.8
})
);
//Zopfli压缩https://webpack.js.org/plugins/compression-webpack-plugin/
//plugins.push(
//newCompressionWebpackPlugin({
//algorithm(input,compressionOptions,callback){
//returnzopfli.gzip(input,compressionOptions,callback);
//},
//compressionOptions:{
//numiterations:15
//},
//minRatio:0.99,
//test:productionGzipExtensions
//})
//);
//plugins.push(
//newBrotliPlugin({
//test:productionGzipExtensions,
//minRatio:0.99
//})
//);
config.plugins=[
...config.plugins,
...plugins
];
}
},
chainWebpack:config=>{
//修复HMR
config.resolve.symlinks(true);
//添加别名
config.resolve.alias
.set('@',resolve('src'))
.set('assets',resolve('src/assets'))
.set('components',resolve('src/components'))
.set('layout',resolve('src/layout'))
.set('base',resolve('src/base'))
.set('static',resolve('src/static'));
//打包分析
if(process.env.IS_ANALYZ){
config.plugin('webpack-report')
.use(BundleAnalyzerPlugin,[{
analyzerMode:'static',
}]);
}
//多页面配置,为js添加hash
//config.output.chunkFilename(`js/[name].[chunkhash:8].js`)
//修改图片输出路径
//config.module
//.rule('images')
//.test(/\.(png|jpe?g|gif|ico)(\?.*)?$/)
//.use('url-loader')
//.loader('url-loader')
//.options({
//name:path.join('../assets/','img/[name].[ext]')
//})
},
css:{
modules:false,
extract:IS_PROD,
//为css后缀添加hash
//extract:{
//filename:'css/[name].[hash:8].css',
//chunkFilename:'css/[name].[hash:8].css'
//},
sourceMap:false,
loaderOptions:{
sass:{
//向全局sass样式传入共享的全局变量
//data:`@import"~assets/scss/variables.scss";$src:"${process.env.VUE_APP_SRC}";`
data:`$src:"${process.env.VUE_APP_SRC}";`
},
//px转换为rem
//postcss:{
//plugins:[
//require('postcss-pxtorem')({
//rootValue:1,//换算的基数
//selectorBlackList:['weui','el'],//忽略转换正则匹配项
//propList:['*']
//})
//]
//}
}
},
pluginOptions:{
//安装vue-cli-plugin-style-resources-loader插件
//添加全局样式global.scss
//"style-resources-loader":{
//preProcessor:"scss",
//patterns:[
//resolve(__dirname,"./src/scss/scss/variables.scss")
//]
//}
},
parallel:require('os').cpus().length>1,
pwa:{},
devServer:{
//overlay:{
//warnings:true,
//errors:true
//},
open:IS_PROD,
host:'0.0.0.0',
port:8000,
https:false,
hotOnly:false,
proxy:{
'/api':{
target:process.env.VUE_APP_BASE_API||'http://127.0.0.1:8080',
changeOrigin:true
}
}
}
};
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。