Skip to content

Commit 3ac870a

Browse files
committed
feat(app): use mini-css plugin
mainly for CSS extraction in prod, includes CSS minification
1 parent 8f22699 commit 3ac870a

File tree

2 files changed

+83
-17
lines changed

2 files changed

+83
-17
lines changed

Diff for: templates/app/_package.json

+10
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,9 @@
155155
"extract-text-webpack-plugin": "4.0.0-beta.0",
156156
"html-webpack-plugin": "^3.2.0",
157157
"html-webpack-harddisk-plugin": "~0.2.0",
158+
"mini-css-extract-plugin": "~0.4.0",
159+
"optimize-css-assets-webpack-plugin": "^4.0.2",
160+
"uglifyjs-webpack-plugin": "^1.2.5",
158161
<%_ if(filters.pug) { _%>
159162
"pug-html-loader": "^1.1.5",<% } %>
160163
"typescript": "~2.9.0",
@@ -236,5 +239,12 @@
236239
"start:client": "webpack-dev-server --config webpack.dev.js",
237240
"start:server": "node server"
238241
},
242+
"sideEffects": [
243+
"*.css",
244+
"*.less",
245+
"*.sass",
246+
"*.scss",
247+
"*.styl"
248+
],
239249
"private": true
240250
}

Diff for: templates/app/webpack.make.js

+73-17
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ const _ = require('lodash');
33
const CompressionPlugin = require('compression-webpack-plugin');
44
const HtmlWebpackPlugin = require('html-webpack-plugin');
55
const HtmlWebpackHarddiskPlugin = require('html-webpack-harddisk-plugin');
6+
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
7+
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
68
const path = require('path');
9+
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
710
const webpack = require('webpack');
811

912
module.exports = function makeWebpackConfig(options) {
@@ -193,7 +196,11 @@ module.exports = function makeWebpackConfig(options) {
193196
// Reference: https://github.com/postcss/postcss-loader
194197
// Postprocess your css with PostCSS plugins
195198
test: /\.css$/,
196-
use: ['style-loader', 'css-loader', 'postcss-loader'],
199+
use: [
200+
DEV ? 'style-loader' : MiniCssExtractPlugin.loader,
201+
'css-loader',
202+
'postcss-loader',
203+
],
197204
include: [
198205
path.resolve(__dirname, 'node_modules/bootstrap/dist/css/*.css'),
199206
path.resolve(__dirname, 'client/app/app.css')
@@ -202,7 +209,11 @@ module.exports = function makeWebpackConfig(options) {
202209
// CSS LOADER
203210
// Reference: https://github.com/webpack/css-loader
204211
test: /\.css$/,
205-
use: ['to-string-loader', 'css-loader?sourceMap', 'postcss-loader'],
212+
use: [
213+
'to-string-loader',
214+
'css-loader?sourceMap',
215+
'postcss-loader',
216+
],
206217
include: [
207218
path.resolve(__dirname, 'client')
208219
],
@@ -211,7 +222,12 @@ module.exports = function makeWebpackConfig(options) {
211222
// SASS LOADER
212223
// Reference: https://github.com/jtangelder/sass-loader
213224
test: /\.(scss|sass)$/,
214-
use: ['style-loader', 'css-loader?sourceMap', 'sass-loader'],
225+
use: [
226+
DEV ? 'style-loader' : MiniCssExtractPlugin.loader,
227+
'css-loader?sourceMap',
228+
'postcss-loader',
229+
'sass-loader',
230+
],
215231
include: [
216232
path.resolve(__dirname, 'node_modules/bootstrap-sass/assets/stylesheets/*.scss'),
217233
path.resolve(__dirname, 'client/app/app.scss')
@@ -220,39 +236,64 @@ module.exports = function makeWebpackConfig(options) {
220236
// SASS LOADER
221237
// Reference: https://github.com/jtangelder/sass-loader
222238
test: /\.(scss|sass)$/,
223-
use: ['to-string-loader?sourceMap', 'css-loader?sourceMap', 'sass-loader?sourceMap'],
239+
use: [
240+
'to-string-loader?sourceMap',
241+
'css-loader?sourceMap',
242+
'postcss-loader',
243+
'sass-loader?sourceMap',
244+
],
224245
include: [
225246
path.resolve(__dirname, 'client')
226247
],
227248
exclude: [/app\.scss$/]
228249
}<% } else if(filters.less) { %>, {
229250
// LESS LOADER
230251
test: /\.less$/,
231-
use: ['style-loader', 'css-loader?sourceMap', 'less-loader'],
252+
use: [
253+
DEV ? 'style-loader' : MiniCssExtractPlugin.loader,
254+
'css-loader?sourceMap',
255+
'postcss-loader',
256+
'less-loader',
257+
],
232258
include: [
233259
path.resolve(__dirname, 'node_modules/bootstrap/less/*.less'),
234260
path.resolve(__dirname, 'client/app/app.less')
235261
]
236262
}, {
237263
// LESS LOADER
238264
test: /\.less$/,
239-
use: ['to-string-loader?sourceMap', 'css-loader?sourceMap', 'less-loader'],
265+
use: [
266+
'to-string-loader?sourceMap',
267+
'css-loader?sourceMap',
268+
'postcss-loader',
269+
'less-loader',
270+
],
240271
include: [
241272
path.resolve(__dirname, 'client')
242-
],
273+
],
243274
exclude: [/app\.less$/]
244275
}<% } else if(filters.stylus) { %>, {
245276
// Stylus LOADER
246277
test: /\.styl$/,
247-
use: ['style-loader', 'css-loader?sourceMap', 'stylus-loader'],
278+
use: [
279+
DEV ? 'style-loader' : MiniCssExtractPlugin.loader,
280+
'css-loader?sourceMap',
281+
'postcss-loader',
282+
'stylus-loader',
283+
],
248284
include: [
249285
path.resolve(__dirname, 'node_modules/bootstrap-styl/bootstrap/*.styl'),
250286
path.resolve(__dirname, 'client/app/app.styl')
251287
]
252288
}, {
253289
// Stylus LOADER
254290
test: /\.styl$/,
255-
use: ['to-string-loader?sourceMap', 'css-loader?sourceMap', 'stylus-loader'],
291+
use: [
292+
'to-string-loader?sourceMap',
293+
'css-loader?sourceMap',
294+
'postcss-loader',
295+
'stylus-loader',
296+
],
256297
include: [
257298
path.resolve(__dirname, 'client')
258299
],
@@ -275,14 +316,6 @@ module.exports = function makeWebpackConfig(options) {
275316
path.resolve(__dirname, '../src')
276317
),
277318

278-
// Reference: https://github.com/webpack/extract-text-webpack-plugin
279-
// Extract css files
280-
// Disabled when in test mode or not in build mode
281-
new ExtractTextPlugin({
282-
filename: '[name].[hash].css',
283-
disable: !BUILD || TEST,
284-
}),
285-
286319
new webpack.LoaderOptionsPlugin({
287320
options: {
288321
context: __dirname
@@ -364,6 +397,29 @@ module.exports = function makeWebpackConfig(options) {
364397

365398
config.cache = DEV;
366399

400+
if(BUILD) {
401+
config.optimization = {
402+
splitChunks: {
403+
cacheGroups: {
404+
styles: {
405+
name: 'styles',
406+
test: /\.css$/,
407+
chunks: 'all',
408+
enforce: true
409+
},
410+
},
411+
},
412+
minimizer: [
413+
new UglifyJsPlugin({
414+
cache: true,
415+
parallel: true,
416+
sourceMap: true // set to true if you want JS source maps
417+
}),
418+
new OptimizeCssAssetsPlugin({}),
419+
],
420+
};
421+
}
422+
367423
if(TEST) {
368424
config.stats = {
369425
colors: true,

0 commit comments

Comments
 (0)