-
Notifications
You must be signed in to change notification settings - Fork 0
/
vue.config.js
177 lines (159 loc) · 5.12 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
const path = require('path');
const fs = require('fs');
const processArgs = require('minimist')(process.argv.slice(2));
const resolve = (dir) => path.resolve(__dirname, dir);
// 入口页面基础配置
const pageBaseConfig = {
root: resolve('src/pages'),
entry: 'main.ts',
template: 'public/index.html',
filename: 'index.html'
};
// https://www.npmjs.com/package/webpack-bundle-analyzer
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
// https://www.npmjs.com/package/git-revision-webpack-plugin
const GitRevisionPlugin = require('git-revision-webpack-plugin');
const gitRevisionPlugin = new GitRevisionPlugin({
branch: true
});
const package = require('./package.json');
const gitInfo = {
VERSION: gitRevisionPlugin.version(),
COMMITHASH: gitRevisionPlugin.commithash(),
BRANCH: gitRevisionPlugin.branch()
};
// 模板参数,应用 template html
// 可在html 使用如: <%=webpackConfig.externals.gitInfo.BRANCH%>
const templateParameters = {
nowTimeString: new Date().toISOString(),
// package.json信息
package,
// 进程信息
process: {
env: process.env
},
// git信息
gitInfo
};
// multi-page 模式, 获取所有page
const getPages = () => {
// 同步读取pages下的文件
const files = fs.readdirSync(pageBaseConfig.root);
const pages = {};
for (let i = 0; i < files.length; i++) {
const pageInfo = { name: files[i] };
pageInfo.path = path.join(pageBaseConfig.root, pageInfo.name);
if (fs.lstatSync(pageInfo.path).isFile()) {
continue;
}
// 如果没有入口文件,则跳过
pageInfo.entry = path.join(pageInfo.path, pageBaseConfig.entry);
if (!fs.existsSync(pageInfo.entry)) {
continue;
}
// 如果对应page下有index模板,则使用该模板,否则使用默认
const templatePath = path.join(pageInfo.path, 'index.html');
const template = fs.existsSync(templatePath) ? templatePath : pageBaseConfig.template;
pages[pageInfo.name] = {
entry: pageInfo.entry,
template,
filename: pageInfo.name === 'index' ? 'index.html' : `${pageInfo.name}.html`,
title: pageInfo.name
};
}
return pages;
};
/**
* 如果以单模块启动,则只构建单页面
*/
let entryPages = getPages();
if (processArgs.action === 'module' && processArgs.name && entryPages[processArgs.name]) {
const tmpPage = {};
tmpPage[processArgs.name] = entryPages[processArgs.name];
entryPages = tmpPage;
}
module.exports = {
pages: entryPages,
// 使用相对路径
publicPath: '',
// 将 lint 错误输出为编译警告
lintOnSave: 'warning',
// 输出文件夹
outputDir: 'dist',
// 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录。
assetsDir: 'static',
// 指定生成的 index.html 的输出路径 (相对于 outputDir)。也可以是一个绝对路径。
indexPath: 'index.html',
// 文件名hash
filenameHashing: true,
// 生产环境不生成sourcemap
productionSourceMap: false,
// 设置生成的 HTML 中 <link rel="stylesheet"> 和 <script> 标签的 crossorigin 属性。
// crossorigin: 'anonymous',
devServer: {
open: process.env.NODE_ENV === 'development',
host: '0.0.0.0',
port: '2085',
overlay: {
warnings: false,
errors: true
},
// 代理设置
proxy: {
// detail:https://github.com/chimurai/http-proxy-middleware#proxycontext-config
'/api': {
target: 'https://request.worktile.com/6n6gHbBDL',
changeOrigin: true,
pathRewrite: {
'^/api/1': '/api/3', // rewrite path
'^/api/remove/path': '/path' // remove base path
}
}
}
},
// webpack 配置
configureWebpack: (config) => {
// config.resolve.alias['@'] = 'src'
// 注入变量
config.externals = { ...config.externals, ...templateParameters };
if (process.env.NODE_ENV === 'production') {
// 为生产环境修改配置...
} else {
config.plugins.push(new BundleAnalyzerPlugin());
config.plugins.push(gitRevisionPlugin);
}
},
// 是一个函数,会接收一个基于 webpack-chain 的 ChainableConfig 实例。允许对内部的 webpack 配置进行更细粒度的修改。
// https://cli.vuejs.org/zh/guide/webpack.html#%E9%93%BE%E5%BC%8F%E6%93%8D%E4%BD%9C-%E9%AB%98%E7%BA%A7
chainWebpack: (config) => {
config.module
.rule('vue')
.use('vue-loader')
.tap((options) => options);
// https://webpack.docschina.org/plugins/split-chunks-plugin/#splitchunkscachegroups
// config.optimization.splitChunks({
// chunks: 'all',
// minSize: 1000,
// minChunks: 1,
// maxAsyncRequests: 30,
// maxInitialRequests: 30,
// cacheGroups: {
// libs: {
// name: 'chunk-libs',
// test: /[\\/]node_modules[\\/]/,
// priority: 30,
// chunks: 'initial' // only package third parties that are initially dependent
// },
// page: {
// name: 'page',
// priority: 20,
// chunks: 'initial'
// },
// }
// })
},
// css 配置
css: {
sourceMap: process.env.NODE_ENV !== 'production'
}
};