-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathvue.config.js
181 lines (167 loc) · 5.5 KB
/
vue.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
'use strict'
const path = require('path')
const resolve = dir => path.join(__dirname, dir)
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV)
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
const defaultSettings = require('./src/config/index.js')
const name = defaultSettings.title || 'vue mobile template'
// CDN外链,会插入到index.html中
const cdn = {
// 开发环境
dev: {
css: [],
js: []
},
// 生产环境
build: {
css: [],
js: [
'https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js',
'https://cdn.jsdelivr.net/npm/[email protected]/dist/vue-router.min.js',
'https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js',
'https://cdn.jsdelivr.net/npm/[email protected]/dist/vuex.min.js'
]
}
}
module.exports = {
productionSourceMap: false,
publicPath: './',
assetsDir: "static", // outputDir的静态资源(js、css、img、fonts)目录
lintOnSave: true, //是否在保存的时候使用 `eslint-loader` 进行检查。
devServer: {
open: true, // npm run serve后自动打开页面
port: 9527, // 开发服务器运行端口号
compress: true, // 是否开启gzip压缩
overlay: {
// 当出现编译器错误或警告时,在浏览器中显示全屏覆盖层
warnings: false,
errors: true
},
proxy: {
'/apis': {
target: 'https://api.muxiaoguo.cn',
changeOrigin: true, // 支持跨域 是否修改请求头中的host
pathRewrite: {
'^/apis': ''
}
}, // 可以跨域多个
// '/test': {
// target: 'https://api.xxxx.cn',
// changeOrigin: true, // 支持跨域
// pathRewrite: {
// '^/test': ''
// }
// }
}
},
/**
* 导入公共scss
* 可以在css中拼接 $cdn 图片路径
*/
css: {
extract: IS_PROD,
sourceMap: false,
loaderOptions: {
scss: {
prependData: `
@import "@assets/css/index.scss";
$cdn: "${defaultSettings.$cdn}";
`
}
}
},
configureWebpack: config => {
// 为生产环境修改配置...
if (IS_PROD) {
/**
* externals 为引入cdn准备
* 决定是否使用cdn时 请注意这里的代码注释 不然打包的时候会报错
*/
// config.externals = {
// vue: 'Vue',
// 'vue-router': 'VueRouter',
// vuex: 'Vuex',
// axios: 'axios'
// }
}
},
chainWebpack: config => {
// 移除 prefetch 插件 html页面
config.plugins.delete('prefetch')
// 移除 preload 插件 html页面
config.plugins.delete('preload')
// https://webpack.js.org/configuration/devtool/#development
config.when(!IS_PROD, config => config.devtool('cheap-source-map'))
// 设置快捷路径, @ 表示 'src' ,components 表示 'src/components'
config.resolve.alias
// .set('@', resolve('src'))
.set('@assets', resolve('src/assets'))
.set('@components', resolve('src/components'))
.set('@views', resolve('src/views'))
.end();
// 注入cdn路径 需要在public index.html里面展开
config.plugin('html').tap(args => {
args[0].cdn = cdn.build // 这里只是为html模板展开提供数据,最终打包cdn起效果的还是 config.externals,打包时报错请注意config.externals
args[0].title = name // 注入html title
return args
})
// 拆分第三方模块并单独打包
config.when(IS_PROD, config => {
config
.plugin('ScriptExtHtmlWebpackPlugin')
.after('html')
.use('script-ext-html-webpack-plugin', [
{
// 将 runtime 作为内联引入不单独存在
inline: /runtime\..*\.js$/
}
]).end()
config.optimization.splitChunks({
chunks: 'all',
cacheGroups: {
// cacheGroups 下可以可以配置多个组,每个组根据test设置条件,符合test条件的模块
commons: {
name: 'chunk-commons',
test: resolve('src/components'),
minChunks: 3, // 被至少用三次以上打包分离
priority: 5, // 优先级
reuseExistingChunk: true // 表示是否使用已有的 chunk,如果为 true 则表示如果当前的 chunk 包含的模块已经被抽取出去了,那么将不会重新生成新的。
},
node_vendors: {
name: 'chunk-libs',
chunks: 'initial', // 只打包初始时依赖的第三方
test: /[\\/]node_modules[\\/]/,
priority: 10
},
vantUI: {
name: 'chunk-vantUI', // 单独将 vantUI 拆包
priority: 20, // 数字大权重到,满足多个 cacheGroups 的条件时候分到权重高的
test: /[\\/]node_modules[\\/]_?vant(.*)/
}
}
})
config.optimization.runtimeChunk('single')
})
// 压缩图片
config.module
.rule("images")
.test(/\.(gif|png|jpe?g|svg)$/i)
.use("image-webpack-loader")
.loader("image-webpack-loader")
.options({
mozjpeg: { progressive: true, quality: 65 },
optipng: { enabled: false },
pngquant: { quality: [0.65, 0.9], speed: 4 },
gifsicle: { interlaced: false }
// webp: { quality: 75 } // 支不支持webp
});
if (IS_PROD) {
// 打包分析
config.plugin("webpack-report").use(BundleAnalyzerPlugin, [
{
analyzerMode: "static"
}
]);
}
}
}