This repository was archived by the owner on Jul 18, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebpack.config.js
217 lines (212 loc) · 6.67 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
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
const path = require('path');
const argv = require('yargs').argv;
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const merge = require('webpack-merge');
// plugins used by production build
function prodPlugins() {
return [
// compresses JS
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
}),
// extracts all CSS into separate file
new ExtractTextPlugin({
filename: 'css/[name].[contenthash].css',
allChunks: true
}),
// optimizes CSS to reduce size
new OptimizeCSSPlugin({
cssProcessorOptions: {
safe: true // disables risky aggregations
}
}),
// injects generated files into template HTML file
// can also be configured to reduce HTML file size
new HtmlWebpackPlugin({
filename: path.resolve('./build/index.html'),
template: 'index.html',
inject: true,
chunksSortMode: 'dependency'
}),
// divides common code into separate files
// optimizes caching
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: (module, count) => {
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.resolve('./node_modules')
) === 0
)
}
}),
// creates separated file for webpack's bootstrap
// avoid using it in every file
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
chunk: ['vendor']
})
];
}
// plugins used by development build
function devPlugins() {
return [
// extracts all CSS into separate file
new ExtractTextPlugin({
filename: 'css/[name].css',
allChunks: true
}),
// injects generated files into template HTML file
new HtmlWebpackPlugin({
filename: path.resolve('./build/index.html'),
template: 'index.html',
inject: true,
chunksSortMode: 'dependency'
}),
// divides common code into separate files
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: (module, count) => {
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.resolve('./node_modules')
) === 0
)
}
}),
// creates separated file for webpack's bootstrap
// avoid using it in every file
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
chunk: ['vendor']
})
];
}
// base webpack configuration
var webpackBaseConfig = {
// main file
entry: {
main: path.resolve('./js/main.js')
},
// destination path
// file names merged afterwards
output: {
path: path.resolve('./build')
},
// shortcut to project root
resolve: {
extensions: ['.js', '.json'],
alias: {
'~': path.resolve('./')
}
},
module: {
rules: [
// pure-CSS loader
// without preprocessors
{
test: /\.css$/,
// being extracted
use: ExtractTextPlugin.extract({
use: [
{
loader: 'css-loader',
options: {
minimize: {
safe: true
},
sourceMap: false
}
},
{
loader: 'postcss-loader' // adds required vendor prefixes
}
]
})
},
// SCSS loader
{
test: /\.scss$/,
// also being extracted
use: ExtractTextPlugin.extract({
use: [
{
loader: 'css-loader',
options: {
minimize: {
safe: true
},
sourceMap: false
}
},
{
loader: 'postcss-loader'
},
{
loader: 'sass-loader',
options: {
// paths where to look for @import's
includePaths: ['scss', 'node_modules']
}
}
]
})
},
// HTML loader
{
test: /\.html$/,
use: [
{
loader: 'html-loader',
options: {
minimize: true,
attrs: false
}
}
]
}
]
}
};
// production build
if (!argv.dev) {
// merges base config with following specifics
module.exports = merge(webpackBaseConfig, {
// set to subfolder "js" using chunkhash to allow caching
output: {
filename: 'js/[name].[chunkhash].js',
chunkFilename: 'js/[id].[chunkhash].js'
},
// get all production plugins
plugins: prodPlugins()
});
}
// dev build
else {
// merges base config with following specifics
module.exports = merge(webpackBaseConfig, {
// set to subfolder "js" without chunkhash
// this will make webpack overwrite the files on every build
// preventing lots of files from being created
output: {
filename: 'js/[name].js',
chunkFilename: 'js/[id].js'
},
// get all development plugins
plugins: devPlugins(),
// sets up watch with 300ms interval between saving and recompiling
watch: true,
watchOptions: {
aggregateTimeout: 300
}
});
}