1
1
// Libraries
2
+ require ( '../postcss.config' ) ;
3
+
2
4
const path = require ( 'path' ) ;
3
5
const webpack = require ( 'webpack' ) ;
4
6
const HtmlWebpackPlugin = require ( 'html-webpack-plugin' ) ;
5
7
const WebpackNotifierPlugin = require ( 'webpack-notifier' ) ;
6
8
const CopyWebpackPlugin = require ( 'copy-webpack-plugin' ) ;
7
9
const MiniCssExtractPlugin = require ( 'mini-css-extract-plugin' ) ;
8
10
const TerserPlugin = require ( 'terser-webpack-plugin' ) ;
11
+ const OptimizeCSSAssetsPlugin = require ( 'optimize-css-assets-webpack-plugin' ) ;
12
+
13
+ const ASSET_PATH = process . env . ASSET_PATH || '/' ;
14
+
9
15
10
16
// Files
11
17
const utils = require ( './utils' )
12
- const plugins = require ( '../postcss.config' ) ;
13
18
14
19
// Configuration
15
20
module . exports = env => {
16
21
17
22
return {
18
- context : path . resolve ( __dirname , '../src' ) ,
23
+ context : path . join ( __dirname , '../src' ) ,
19
24
entry : {
20
- app : './ app.js'
25
+ app : path . join ( __dirname , '../src/ app.js') ,
21
26
} ,
22
27
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'
25
31
} ,
26
32
devServer : {
27
- contentBase : path . resolve ( __dirname , '../src' ) ,
33
+ contentBase : path . join ( __dirname , '../src' ) ,
34
+ compress : true ,
35
+ open : true
28
36
} ,
29
37
resolve : {
30
38
extensions : [ '.js' ] ,
31
39
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
35
43
}
36
44
} ,
37
45
@@ -41,12 +49,12 @@ module.exports = env => {
41
49
module : {
42
50
rules : [
43
51
{
44
- test : / \. j s $ / ,
52
+ test : / \. m ? j s $ / ,
45
53
exclude : [ / n o d e _ m o d u l e s / ] ,
46
54
use : [
47
55
{
48
56
loader : 'babel-loader' ,
49
- options : { presets : [ 'es2015 ' ] }
57
+ options : { presets : [ '@babel/preset-env ' ] }
50
58
}
51
59
]
52
60
} ,
@@ -69,7 +77,7 @@ module.exports = env => {
69
77
test : / \. s c s s $ / ,
70
78
use : [
71
79
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
73
81
'postcss-loader' ,
74
82
'sass-loader' , // compiles Sass to CSS
75
83
] ,
@@ -87,41 +95,42 @@ module.exports = env => {
87
95
loader : 'url-loader' ,
88
96
options : {
89
97
limit : 3000 ,
90
- name : 'assets/images/[name].[hash :7].[ext]'
98
+ name : 'assets/images/[name].[contenthash :7].[ext]'
91
99
}
92
100
} ,
93
101
{
94
102
test : / \. ( w o f f 2 ? | e o t | t t f | o t f ) ( \? .* ) ? $ / ,
95
103
loader : 'url-loader' ,
96
104
options : {
97
- name : 'assets/fonts/[name].[hash:7].[ext]'
105
+ limit : 5000 ,
106
+ name : 'assets/fonts/[name].[contenthash:7].[ext]'
98
107
}
99
108
} ,
100
- {
109
+ /* {
101
110
test: /\.(mp4)(\?.*)?$/,
102
111
loader: 'url-loader',
103
112
options: {
104
113
limit: 10000,
105
- name : 'assets/videos/[name].[hash :7].[ext]'
114
+ name: 'assets/videos/[name].[contenthash :7].[ext]'
106
115
}
107
- }
116
+ } */
108
117
]
109
118
} ,
110
119
optimization : {
120
+ minimize : true ,
111
121
minimizer : [
112
122
new TerserPlugin ( {
113
- cache : true ,
114
123
parallel : true ,
115
- sourceMap : true ,
116
124
} ) ,
125
+ new OptimizeCSSAssetsPlugin ( { } )
117
126
] ,
118
127
splitChunks : {
119
128
cacheGroups : {
120
129
default : false ,
121
130
vendors : false ,
122
131
// vendor chunk
123
132
vendor : {
124
- filename : 'assets/js/vendor.[hash :7].bundle.js' ,
133
+ filename : 'assets/js/vendor.[chunkhash :7].bundle.js' ,
125
134
// sync + async chunks
126
135
chunks : 'all' ,
127
136
// import file path containing node_modules
@@ -132,30 +141,33 @@ module.exports = env => {
132
141
} ,
133
142
134
143
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
+ } ) ,
142
153
new MiniCssExtractPlugin ( {
143
- filename : 'assets/css/[name].[hash :7].bundle.css' ,
154
+ filename : 'assets/css/[name].[chunkhash :7].bundle.css' ,
144
155
chunkFilename : '[id].css' ,
145
156
} ) ,
146
157
147
158
/*
148
159
Pages
149
160
*/
150
161
151
- // // Desktop page
162
+ // Desktop page
152
163
new HtmlWebpackPlugin ( {
164
+ minify : ! env === 'development' ,
153
165
filename : 'index.html' ,
154
166
template : 'views/index.pug' ,
155
167
inject : true
156
168
} ) ,
157
169
158
- ...utils . pages ( env ) ,
170
+ ...utils . pages ( env ) , // env, public path, parent folder
159
171
...utils . pages ( env , 'blog' ) ,
160
172
161
173
new webpack . ProvidePlugin ( {
0 commit comments