@@ -12,13 +12,16 @@ import webpack from 'webpack';
12
12
import AssetsPlugin from 'assets-webpack-plugin' ;
13
13
import nodeExternals from 'webpack-node-externals' ;
14
14
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' ;
15
+ import overrideRules from './lib/overrideRules' ;
15
16
import pkg from '../package.json' ;
16
17
17
18
const isDebug = ! process . argv . includes ( '--release' ) ;
18
19
const isVerbose = process . argv . includes ( '--verbose' ) ;
19
20
const isAnalyze = process . argv . includes ( '--analyze' ) || process . argv . includes ( '--analyse' ) ;
20
21
21
- const stylesRegExp = / \. ( c s s | l e s s | s c s s | s s s ) $ / ;
22
+ const reScript = / \. j s x ? $ / ;
23
+ const reStyle = / \. ( c s s | l e s s | s c s s | s s s ) $ / ;
24
+ const reImage = / \. ( b m p | g i f | j p e ? g | p n g | s v g ) $ / ;
22
25
const staticAssetName = isDebug ? '[path][name].[ext]?[hash:8]' : '[hash:8].[ext]' ;
23
26
24
27
//
@@ -49,8 +52,9 @@ const config = {
49
52
strictExportPresence : true ,
50
53
51
54
rules : [
55
+ // Rules for JS / JSX
52
56
{
53
- test : / \. j s x ? $ / ,
57
+ test : reScript ,
54
58
loader : 'babel-loader' ,
55
59
include : [
56
60
path . resolve ( __dirname , '../src' ) ,
@@ -94,18 +98,32 @@ const config = {
94
98
} ,
95
99
} ,
96
100
97
- // Handle internal/project styles (from src folder)
101
+ // Rules for Style Sheets
98
102
{
99
- // Internal Styles
100
- test : stylesRegExp ,
101
- include : [
102
- path . resolve ( __dirname , '../src' ) ,
103
- ] ,
104
- use : [
103
+ test : reStyle ,
104
+ rules : [
105
+ // Convert CSS into JS module
105
106
{
106
- loader : 'isomorphic-style-loader' ,
107
+ issuer : { not : [ reStyle ] } ,
108
+ use : 'isomorphic-style-loader' ,
107
109
} ,
110
+
111
+ // Process external/third-party styles
108
112
{
113
+ exclude : path . resolve ( __dirname , '../src' ) ,
114
+ loader : 'css-loader' ,
115
+ options : {
116
+ sourceMap : isDebug ,
117
+ minimize : ! isDebug ,
118
+ discardComments : { removeAll : true } ,
119
+ } ,
120
+ } ,
121
+
122
+ // Process internal/project styles (from src folder)
123
+ {
124
+ include : [
125
+ path . resolve ( __dirname , '../src' ) ,
126
+ ] ,
109
127
loader : 'css-loader' ,
110
128
options : {
111
129
// CSS Loader https://github.com/webpack/css-loader
@@ -132,7 +150,7 @@ const config = {
132
150
] ,
133
151
} ,
134
152
{
135
- test : stylesRegExp ,
153
+ test : reStyle ,
136
154
exclude : [ / t h e m e .s c s s $ / ] ,
137
155
use : [
138
156
'isomorphic-style-loader' ,
@@ -142,43 +160,50 @@ const config = {
142
160
] ,
143
161
} ,
144
162
{
145
- test : / \. ( b m p | g i f | j p e ? g | p n g ) $ / ,
146
- issuer : stylesRegExp ,
147
- loader : 'url-loader' ,
148
- options : {
149
- name : staticAssetName ,
150
- limit : 4096 , // 4kb
151
- } ,
152
- } ,
163
+ test : reImage ,
164
+ oneOf : [
165
+ // Inline lightweight images into CSS
166
+ {
167
+ issuer : reStyle ,
168
+ oneOf : [
169
+ // Inline lightweight SVGs as UTF-8 encoded DataUrl string
170
+ {
171
+ test : / \. s v g $ / ,
172
+ loader : 'svg-url-loader' ,
173
+ options : {
174
+ name : staticAssetName ,
175
+ limit : 4096 , // 4kb
176
+ } ,
177
+ } ,
153
178
154
- // Inline small SVGs into CSS as UTF-8 encoded DataUrl string
155
- {
156
- test : / \. s v g $ / ,
157
- issuer : stylesRegExp ,
158
- loader : 'svg-url-loader' ,
159
- options : {
160
- name : staticAssetName ,
161
- limit : 4096 , // 4kb
162
- } ,
163
- } ,
179
+ // Inline lightweight images as Base64 encoded DataUrl string
180
+ {
181
+ loader : 'url-loader' ,
182
+ options : {
183
+ name : staticAssetName ,
184
+ limit : 4096 , // 4kb
185
+ } ,
186
+ } ,
187
+ ] ,
188
+ } ,
164
189
165
- // Return public URL to large images otherwise
166
- {
167
- test : / \. ( b m p | g i f | j p e ? g | p n g | s v g ) $ / ,
168
- issuer : { not : [ stylesRegExp ] } ,
169
- loader : 'file-loader' ,
170
- options : {
171
- name : staticAssetName ,
172
- } ,
190
+ // Or return public URL to image resource
191
+ {
192
+ loader : 'file-loader' ,
193
+ options : {
194
+ name : staticAssetName ,
195
+ } ,
196
+ } ,
197
+ ] ,
173
198
} ,
174
199
175
- // Convert plain text into module
200
+ // Convert plain text into JS module
176
201
{
177
202
test : / \. t x t $ / ,
178
203
loader : 'raw-loader' ,
179
204
} ,
180
205
181
- // Convert markdown into html
206
+ // Convert Markdown into HTML
182
207
{
183
208
test : / \. m d $ / ,
184
209
loader : path . resolve ( __dirname , './lib/markdown-loader.js' ) ,
@@ -188,10 +213,10 @@ const config = {
188
213
// DO NOT FORGET to update `exclude` list when you adding a new loader
189
214
{
190
215
exclude : [
191
- / \. j s x ? $ / ,
216
+ reScript ,
217
+ reStyle ,
218
+ reImage ,
192
219
/ \. j s o n $ / ,
193
- stylesRegExp ,
194
- / \. ( b m p | g i f | j p e ? g | p n g | s v g ) $ / ,
195
220
/ \. t x t $ / ,
196
221
/ \. m d $ / ,
197
222
] ,
@@ -346,8 +371,8 @@ const serverConfig = {
346
371
module : {
347
372
...config . module ,
348
373
349
- // Override babel-preset-env configuration for Node.js
350
- rules : config . module . rules . map ( ( rule ) => {
374
+ rules : overrideRules ( config . module . rules , ( rule ) => {
375
+ // Override babel-preset-env configuration for Node.js
351
376
if ( rule . loader === 'babel-loader' ) {
352
377
return {
353
378
...rule ,
@@ -365,6 +390,7 @@ const serverConfig = {
365
390
} ;
366
391
}
367
392
393
+ // Override paths to static assets
368
394
if ( rule . loader === 'file-loader' || rule . loader === 'url-loader' || rule . loader === 'svg-url-loader' ) {
369
395
return {
370
396
...rule ,
@@ -384,7 +410,8 @@ const serverConfig = {
384
410
'./assets.json' ,
385
411
nodeExternals ( {
386
412
whitelist : [
387
- stylesRegExp ,
413
+ reStyle ,
414
+ reImage ,
388
415
] ,
389
416
} ) ,
390
417
] ,
0 commit comments