-
Notifications
You must be signed in to change notification settings - Fork 0
/
vue.config.js
218 lines (201 loc) · 6.25 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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
const path = require('path')
const resolve = (dir) => path.join(__dirname, dir)
//骨架屏
const HtmlWebpackPlugin = require('html-webpack-plugin')
const SkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin');
//zip压缩
const CompressionPlugin = require("Compression-webpack-plugin")
//去除多余css
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: ["./src/**/*.vue"],
extractors: [{
extractor: class Extractor {
static extract(content) {
const validSection = content.replace(
/<style([\s\S]*?)<\/style>+/gim,
""
);
return validSection.match(/[A-Za-z0-9-_:/]+/g) || [];
}
},
extensions: ["vue"]
}]
})
);
}
// 打包分析
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
// 项目部署的基础路径
// 我们默认假设你的应用将会部署在域名的根部,
// 比如 https://www.my-app.com/
// 如果你的应用时部署在一个子路径下,那么你需要在这里
// 指定子路径。比如,如果你的应用部署在
// https://www.foobar.com/my-app/
// 那么将这个值改为 `/my-app/`
publicPath: process.env.NODE_ENV === 'production' ?
'./' : './',
// 将构建好的文件输出到哪里
outputDir: 'dist',
// 放置静态资源的地方 (js/css/img/font/...)
assetsDir: './static',
// 默认起始页文件
indexPath: 'index.html',
// 默认在生成的静态资源文件名中包含hash以控制缓存
filenameHashing: true,
// 是否在保存的时候使用 `eslint-loader` 进行检查。
// 有效的值:`ture` | `false` | `"error"`
// 当设置为 `"error"` 时,检查出的错误会触发编译失败。
lintOnSave: true,
// 使用带有浏览器内编译器的完整构建版本
// 查阅 https://cn.vuejs.org/v2/guide/installation.html#运行时-编译器-vs-只包含运行时
// compiler: false,
// 是否为生产环境构建生成 source map?
productionSourceMap: false,
// 调整内部的 webpack 配置。
// 查阅 https://github.com/vuejs/vue-docs-zh-cn/blob/master/vue-cli/webpack.md
chainWebpack: config => {
config.resolve.alias
.set('@', resolve('src'))
.set('components', resolve('src/components'))
.set('@a', resolve('src/assets'))
.set('@api', resolve('src/axios/api'))
.set('libs', resolve('src/libs'))
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
}
});
//打包分析
if (process.env.IS_ANALYZ) {
config.plugin('webpack-report')
.use(BundleAnalyzerPlugin, [{
analyzerMode: 'static',
}]);
}
config.output.chunkFilename(`js/[name].[chunkhash:8].js`)
},
configureWebpack: (config) => {
//开启页面 骨架屏 : 基于自定义页面 不根据页面元素生成 需要手动写骨架屏
config.plugins.push(new SkeletonWebpackPlugin({
webpackConfig: {
entry: {
app: path.join(__dirname, './src/skeleton/skeleton.config.js'),
},
},
router: {
mode: 'hash',
routes: [{
path: '/',
skeletonId: 'Skeleton1'
},
{
path: '/about',
skeletonId: 'Skeleton2'
}
]
},
minimize: true,
quiet: true,
}))
if (process.env.NODE_ENV === 'production') {
// 为生产环境修改配置...
// 开启压缩
config.plugins.push(new CompressionPlugin({
test: /\.js$|\.html$|\.css/, //匹配的文件
threshold: 10240, //对超过10k的进行压缩
deleteOriginalAssets: true //是否删除文件
}))
} else if (process.env.NODE_ENV === 'development') {
// 为开发环境修改配置...
console.log('开发环境')
} else if (process.env.NODE_ENV === 'testing') {
// 为测试环境修改配置...
console.log('测试环境')
}
},
// CSS 相关选项
css: {
//css分离 开发环境注释掉避免css热更新 失效
//extract: true,
// 是否开启 CSS source map?
sourceMap: process.env.NODE_ENV !== 'production',
// 为预处理器的 loader 传递自定义选项。比如传递给
loaderOptions: {
less: {
javascriptEnabled: true
},
postcss: { //pc 需要关掉
plugins: [
require("postcss-px2rem")({
remUnit: 37.5,
})
]
}
},
// 为所有的 CSS 及其预处理文件开启 CSS Modules。
// 这个选项不会影响 `*.vue` 文件。
modules: false,
},
// 在生产环境下为 Babel 和 TypeScript 使用 `thread-loader`
// 在多核机器下会默认开启。
parallel: require('os').cpus().length > 1,
// 配置 webpack-dev-server 行为。
devServer: {
host: 'localhost',
port: 8023,
https: false,
hotOnly: false,
open: 'Chrome',
// 查阅 https://github.com/vuejs/vue-docs-zh-cn/blob/master/vue-cli/cli-service.md#配置代理
// proxy: {
// '/api': {
// target: 'http://127.0.0.1:7001',
// changeOrigin: true,
// pathRewrite: {
// '^/api': ''
// }
// }
// }
},
// 第三方插件的选项
pluginOptions: {
env: {
TEST: 'vue.config.js-->pluginOptions.env:TEST Global Parameters'
},
'style-resources-loader': {
preProcessor: 'less',
patterns: [
path.resolve(__dirname, './src/assets/less/settings.less')
]
}
},
// presets: [["@vue/app",{"useBuiltIns": "entry"}]],// ie 兼容配置
// plugins: [...plugins, autoprefixer] //去除多余css 插件入口
}