-
Notifications
You must be signed in to change notification settings - Fork 0
/
webpack.config.js
90 lines (83 loc) · 2.22 KB
/
webpack.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
const {merge} = require('webpack-merge');
const {DefinePlugin} = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ESLintPlugin = require('eslint-webpack-plugin');
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
const devConfig = require('./webpack.dev');
const prodConfig = require('./webpack.prod');
const {getEnv, resolver} = require('./common');
/**
*
* @param {object} webpack_env
* @returns {import('webpack').Configuration}
*/
module.exports = (webpack_env) => {
const env = getEnv(webpack_env);
const isdev = webpack_env.WEBPACK_SERVE;
/**
* @type {import('webpack').Configuration['entry']}
*/
const entry = {
index: resolver('src/index.tsx')
};
/**
* @type {import('webpack').Configuration['plugins']}
*/
const plugins = [
new HtmlWebpackPlugin({
publicPath: isdev ? '.' : env.PUBLIC_URL,
template: resolver('public/index.html')
}),
new DefinePlugin({'process.env': JSON.stringify(env)}),
new ESLintPlugin({
overrideConfigFile: resolver('config/.eslintrc'),
extensions: ['.ts', '.tsx', '.js', '.jsx']
}),
new ForkTsCheckerWebpackPlugin()
];
/**
* @type {import('webpack').Configuration['resolve']}
*/
const resolve = {
plugins: [new TsconfigPathsPlugin()],
extensions: ['.js', '.jsx', '.ts', '.tsx']
};
/**
* @type {import('webpack').Configuration['optimization']}
*/
const optimization = {
splitChunks: {
chunks: 'all',
cacheGroups: {
defaultVendors: {
test: /node_modules/,
filename: 'static/js/vendor.[contenthash:10].js',
reuseExistingChunk: true,
maxSize: 500000
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
};
/**
* @type {import('webpack').Configuration}
*/
const config = {
mode: 'development',
target: 'web',
entry,
plugins,
resolve,
optimization
};
if (!webpack_env.WEBPACK_SERVE) {
config.mode = 'production';
return merge(config, prodConfig(env));
}
return merge(config, devConfig(env));
};