11// Libraries
2+ require ( '../postcss.config' ) ;
3+
24const path = require ( 'path' ) ;
35const webpack = require ( 'webpack' ) ;
46const HtmlWebpackPlugin = require ( 'html-webpack-plugin' ) ;
57const WebpackNotifierPlugin = require ( 'webpack-notifier' ) ;
68const CopyWebpackPlugin = require ( 'copy-webpack-plugin' ) ;
79const MiniCssExtractPlugin = require ( 'mini-css-extract-plugin' ) ;
810const TerserPlugin = require ( 'terser-webpack-plugin' ) ;
11+ const OptimizeCSSAssetsPlugin = require ( 'optimize-css-assets-webpack-plugin' ) ;
12+
13+ const ASSET_PATH = process . env . ASSET_PATH || '/' ;
14+
915
1016// Files
1117const utils = require ( './utils' )
12- const plugins = require ( '../postcss.config' ) ;
1318
1419// Configuration
1520module . exports = env => {
1621
1722 return {
18- context : path . resolve ( __dirname , '../src' ) ,
23+ context : path . join ( __dirname , '../src' ) ,
1924 entry : {
20- app : './ app.js'
25+ app : path . join ( __dirname , '../src/ app.js') ,
2126 } ,
2227 output : {
23- path : path . resolve ( __dirname , '../dist' ) ,
24- filename : 'assets/js/[name].[hash:7].bundle.js'
28+ publicPath : ASSET_PATH ,
29+ path : path . join ( __dirname , '../dist' ) ,
30+ filename : 'assets/js/[name].[contenthash:7].bundle.js'
2531 } ,
2632 devServer : {
27- contentBase : path . resolve ( __dirname , '../src' ) ,
33+ contentBase : path . join ( __dirname , '../src' ) ,
34+ compress : true ,
35+ open : true
2836 } ,
2937 resolve : {
3038 extensions : [ '.js' ] ,
3139 alias : {
32- source : path . resolve ( __dirname , '../src' ) , // Relative path of src
33- images : path . resolve ( __dirname , '../src/assets/images' ) , // Relative path of images
34- fonts : path . resolve ( __dirname , '../src/assets/fonts' ) , // Relative path of fonts
40+ source : path . join ( __dirname , '../src' ) , // Relative path of src
41+ images : path . join ( __dirname , '../src/assets/images' ) , // Relative path of images
42+ fonts : path . join ( __dirname , '../src/assets/fonts' ) , // Relative path of fonts
3543 }
3644 } ,
3745
@@ -41,12 +49,12 @@ module.exports = env => {
4149 module : {
4250 rules : [
4351 {
44- test : / \. j s $ / ,
52+ test : / \. m ? j s $ / ,
4553 exclude : [ / n o d e _ m o d u l e s / ] ,
4654 use : [
4755 {
4856 loader : 'babel-loader' ,
49- options : { presets : [ 'es2015 ' ] }
57+ options : { presets : [ '@babel/preset-env ' ] }
5058 }
5159 ]
5260 } ,
@@ -69,7 +77,7 @@ module.exports = env => {
6977 test : / \. s c s s $ / ,
7078 use : [
7179 env === 'development' ? 'style-loader' : MiniCssExtractPlugin . loader , // creates style nodes from JS strings
72- { loader : 'css-loader' , options : { importLoaders : 1 , minimize : true , sourceMap : true , colormin : false } } , // translates CSS into CommonJS
80+ { loader : 'css-loader' , options : { importLoaders : 1 , sourceMap : true } } , // translates CSS into CommonJS
7381 'postcss-loader' ,
7482 'sass-loader' , // compiles Sass to CSS
7583 ] ,
@@ -87,41 +95,42 @@ module.exports = env => {
8795 loader : 'url-loader' ,
8896 options : {
8997 limit : 3000 ,
90- name : 'assets/images/[name].[hash :7].[ext]'
98+ name : 'assets/images/[name].[contenthash :7].[ext]'
9199 }
92100 } ,
93101 {
94102 test : / \. ( w o f f 2 ? | e o t | t t f | o t f ) ( \? .* ) ? $ / ,
95103 loader : 'url-loader' ,
96104 options : {
97- name : 'assets/fonts/[name].[hash:7].[ext]'
105+ limit : 5000 ,
106+ name : 'assets/fonts/[name].[contenthash:7].[ext]'
98107 }
99108 } ,
100- {
109+ /* {
101110 test: /\.(mp4)(\?.*)?$/,
102111 loader: 'url-loader',
103112 options: {
104113 limit: 10000,
105- name : 'assets/videos/[name].[hash :7].[ext]'
114+ name: 'assets/videos/[name].[contenthash :7].[ext]'
106115 }
107- }
116+ } */
108117 ]
109118 } ,
110119 optimization : {
120+ minimize : true ,
111121 minimizer : [
112122 new TerserPlugin ( {
113- cache : true ,
114123 parallel : true ,
115- sourceMap : true ,
116124 } ) ,
125+ new OptimizeCSSAssetsPlugin ( { } )
117126 ] ,
118127 splitChunks : {
119128 cacheGroups : {
120129 default : false ,
121130 vendors : false ,
122131 // vendor chunk
123132 vendor : {
124- filename : 'assets/js/vendor.[hash :7].bundle.js' ,
133+ filename : 'assets/js/vendor.[chunkhash :7].bundle.js' ,
125134 // sync + async chunks
126135 chunks : 'all' ,
127136 // import file path containing node_modules
@@ -132,30 +141,33 @@ module.exports = env => {
132141 } ,
133142
134143 plugins : [
135- new CopyWebpackPlugin ( [
136- { from : '../manifest.json' , to : 'manifest.json' } ,
137- { from : '../browserconfig.xml' , to : 'browserconfig.xml' } ,
138- { from : 'assets/images/favicons/android-chrome-192x192.png' , to : 'assets/images/android-chrome-192x192.png' } ,
139- { from : 'assets/images/favicons/android-chrome-256x256.png' , to : 'assets/images/android-chrome-256x256.png' } ,
140- { from : 'assets/images/favicons/mstile-150x150.png' , to : 'assets/images/mstile-150x150.png' }
141- ] ) ,
144+ new CopyWebpackPlugin ( {
145+ patterns : [
146+ { from : '../manifest.json' , to : 'manifest.json' } ,
147+ { from : '../browserconfig.xml' , to : 'browserconfig.xml' } ,
148+ { from : 'assets/images/favicons/android-chrome-192x192.png' , to : 'assets/images/android-chrome-192x192.png' } ,
149+ { from : 'assets/images/favicons/android-chrome-256x256.png' , to : 'assets/images/android-chrome-256x256.png' } ,
150+ { from : 'assets/images/favicons/mstile-150x150.png' , to : 'assets/images/mstile-150x150.png' }
151+ ]
152+ } ) ,
142153 new MiniCssExtractPlugin ( {
143- filename : 'assets/css/[name].[hash :7].bundle.css' ,
154+ filename : 'assets/css/[name].[chunkhash :7].bundle.css' ,
144155 chunkFilename : '[id].css' ,
145156 } ) ,
146157
147158 /*
148159 Pages
149160 */
150161
151- // // Desktop page
162+ // Desktop page
152163 new HtmlWebpackPlugin ( {
164+ minify : ! env === 'development' ,
153165 filename : 'index.html' ,
154166 template : 'views/index.pug' ,
155167 inject : true
156168 } ) ,
157169
158- ...utils . pages ( env ) ,
170+ ...utils . pages ( env ) , // env, public path, parent folder
159171 ...utils . pages ( env , 'blog' ) ,
160172
161173 new webpack . ProvidePlugin ( {
0 commit comments