# vue-cli4-config
**Repository Path**: mirrors_singod/vue-cli4-config
## Basic Information
- **Project Name**: vue-cli4-config
- **Description**: vue-cli3配置vue.config.js持续更新
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-25
- **Last Updated**: 2026-03-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# vue-cli3 全面配置(持续更新)
### 其他系列
★ [Nuxt.js 全面配置](https://github.com/staven630/nuxt-config)
目录
- [√ 配置多环境变量](#env)
- [√ 配置基础 vue.config.js](#base)
- [√ 配置 proxy 跨域](#proxy)
- [√ 修复 HMR(热更新)失效](#hmr)
- [√ 修复 Lazy loading routes Error: Cyclic dependency](#lazyloading)
- [√ 添加别名](#alias)
- [√ 压缩图片](#compressimage)
- [√ 去除多余无效的 css](#removecss)
- [√ 添加打包分析](#analyze)
- [√ 配置 externals](#externals)
- [√ 去掉 console.log](#log)
- [√ 利用splitChunks单独打包第三方模块](#splitchunks)
- [√ 开启 gzip 压缩](#gzip)
- [√ 为 sass 提供全局样式,以及全局变量](#globalscss)
- [√ 为 stylus 提供全局变量](#globalstylus)
- [√ 预渲染prerender-spa-plugin](#prerender)
- [√ 添加 IE 兼容](#ie)
- [√ 文件上传 ali oss](#alioss)
- [√ 完整依赖](#allconfig)
### ☞ 配置多环境变量
通过在 package.json 里的 scripts 配置项中添加--mode xxx 来选择不同环境
在项目根目录中新建.env, .env.production, .env.analyz 等文件
只有以 VUE_APP 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧的包中,代码中可以通过 process.env.VUE_APP_BASE_API 访问
NODE_ENV 和 BASE_URL 是两个特殊变量,在代码中始终可用
##### .env serve 默认的环境变量
```
NODE_ENV = 'development'
VUE_APP_BASE_API = 'https://demo.cn/api'
```
##### .env.production build 默认的环境变量
如果开启 ali oss,VUE_APP_SRC 配置为 ali oss 资源 url 前缀,如:'https://staven.oss-cn-hangzhou.aliyuncs.com/demo'
```
NODE_ENV = 'production'
VUE_APP_BASE_API = 'https://demo.com/api'
VUE_APP_SRC = '/'
ACCESS_KEY_ID = ''
ACCESS_KEY_SECRET = ''
REGION = 'oss-cn-hangzhou'
BUCKET = 'staven'
PREFIX = 'demo'
```
##### .env.analyz 用于 webpack-bundle-analyzer 打包分析
如果开启 ali oss,VUE_APP_SRC 配置为 ali oss 资源 url 前缀,如:'https://staven.oss-cn-hangzhou.aliyuncs.com/demo'
```
NODE_ENV = 'production'
IS_ANALYZ = 'analyz'
VUE_APP_BASE_API = 'https://demo.com/api'
VUE_APP_SRC = '/'
ACCESS_KEY_ID = ''
ACCESS_KEY_SECRET = ''
REGION = 'oss-cn-hangzhou'
BUCKET = 'staven'
PREFIX = 'demo'
```
修改 package.json
```
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"analyz": "vue-cli-service build --mode analyz",
"lint": "vue-cli-service lint"
}
```
[▲ 回顶部](#top)
### ☞ 配置基础 vue.config.js
```
const IS_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, // 生产环境的 source map
parallel: require('os').cpus().length > 1,
pwa: {}
};
```
[▲ 回顶部](#top)
### ☞ 配置 proxy 跨域
```$xslt
const IS_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
}
}
}
}
```
[▲ 回顶部](#top)
### ☞ 修复 HMR(热更新)失效
```$xslt
module.exports = {
chainWebpack: config => {
// 修复HMR
config.resolve.symlinks(true);
}
}
```
[▲ 回顶部](#top)
### ☞ 修复 Lazy loading routes Error: Cyclic dependency [https://github.com/vuejs/vue-cli/issues/1669](https://github.com/vuejs/vue-cli/issues/1669)
```$xslt
module.exports = {
chainWebpack: config => {
config.plugin('html').tap(args => {
args[0].chunksSortMode = 'none';
return args;
});
}
}
```
[▲ 回顶部](#top)
### ☞ 添加别名
```$xslt
const path = require('path');
const resolve = (dir) => path.join(__dirname, dir);
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
module.exports = {
chainWebpack: config => {
// 添加别名
config.resolve.alias
.set('vue$', 'vue/dist/vue.esm.js')
.set('@', resolve('src'))
.set('@assets', resolve('src/assets'))
.set('@scss', resolve('src/assets/scss'))
.set('@components', resolve('src/components'))
.set('@plugins', resolve('src/plugins'))
.set('@views', resolve('src/views'))
.set('@router', resolve('src/router'))
.set('@store', resolve('src/store'))
.set('@layouts', resolve('src/layouts'))
.set('@static', resolve('src/static'));
}
}
```
[▲ 回顶部](#top)
### ☞ 压缩图片
```
npm i -D image-webpack-loader
```
```
module.exports = {
chainWebpack: config => {
config.module
.rule("images")
.use("image-webpack-loader")
.loader("image-webpack-loader")
.options({
mozjpeg: { progressive: true, quality: 65 },
optipng: { enabled: false },
pngquant: { quality: "65-90", speed: 4 },
gifsicle: { interlaced: false },
webp: { quality: 75 }
});
}
}
```
[▲ 回顶部](#top)
### ☞ 去除多余无效的 css
- 方案一:@fullhuman/postcss-purgecss
```
npm i -D postcss-import @fullhuman/postcss-purgecss
```
更新 postcss.config.js
```
const autoprefixer = require('autoprefixer')
const postcssImport = require('postcss-import')
const purgecss = require('@fullhuman/postcss-purgecss')
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV)
let plugins = []
if (IS_PROD) {
plugins.push(postcssImport)
plugins.push(
purgecss({
content: [
'./layouts/**/*.vue',
'./components/**/*.vue',
'./pages/**/*.vue'
],
extractors: [
{
extractor: class Extractor {
static extract(content) {
const validSection = content.replace(
/