Skip to content
This repository was archived by the owner on Nov 14, 2024. It is now read-only.

Commit e120426

Browse files
Reorganize webpack rules for proper handling interial and external assets
1 parent 4df3070 commit e120426

15 files changed

Lines changed: 80 additions & 75 deletions

File tree

build/app.config.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ module.exports = merge({
1212
paths: {
1313
root: path.resolve(__dirname, '../'),
1414
public: path.resolve(__dirname, '../public'),
15-
assets: path.resolve(__dirname, '../resources/assets')
15+
sass: path.resolve(__dirname, '../resources/assets/sass'),
16+
fonts: path.resolve(__dirname, '../resources/assets/fonts'),
17+
images: path.resolve(__dirname, '../resources/assets/images'),
18+
javascript: path.resolve(__dirname, '../resources/assets/javascript'),
19+
relative: '../',
20+
external: /node_modules|bower_components/
1621
},
1722

1823
/**
@@ -29,10 +34,10 @@ module.exports = merge({
2934
* @type {Object}
3035
*/
3136
outputs: {
32-
stylesheet: { filename: 'css/[name].css' },
33-
javascript: { filename: 'js/[name].js' },
37+
css: { filename: 'css/[name].css' },
38+
font: { filename: 'fonts/[name].[ext]' },
3439
image: { filename: 'images/[name].[ext]' },
35-
font: { filename: 'fonts/[name].[ext]' }
40+
javascript: { filename: 'js/[name].js' }
3641
},
3742

3843
/**

build/rules/asset.js

Lines changed: 0 additions & 16 deletions
This file was deleted.

build/rules/external.fonts.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const config = require('../app.config')
2+
3+
module.exports = {
4+
test: /\.(eot|woff|woff2|ttf|svg)(\?\S*)?$/,
5+
include: config.paths.external,
6+
loader: 'file-loader',
7+
options: {
8+
publicPath: config.paths.relative,
9+
name: config.outputs.font.filename
10+
}
11+
}

build/rules/external.images.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const config = require('../app.config')
2+
3+
module.exports = {
4+
test: /\.(png|jpe?g|gif|svg)$/,
5+
include: config.paths.external,
6+
loader: 'file-loader',
7+
options: {
8+
publicPath: config.paths.relative,
9+
name: config.outputs.font.filename
10+
}
11+
}

build/rules/fonts.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
const config = require('../app.config')
22

33
module.exports = {
4-
test: /\.(eot|ttf|woff|woff2)$/,
5-
include: config.paths.assets,
4+
test: /\.(eot|ttf|woff|woff2|svg)(\?\S*)?$/,
5+
include: config.paths.fonts,
66
loader: 'file-loader',
77
options: {
8+
publicPath: config.paths.relative,
89
name: config.outputs.font.filename,
910
}
1011
}

build/rules/images.js

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,13 @@
1-
const isdev = require('isdev')
2-
31
const config = require('../app.config')
42

53
module.exports = {
64
test: /\.(png|jpe?g|gif|svg)$/,
7-
include: config.paths.assets,
8-
use: [
9-
{
10-
loader: 'file-loader',
11-
options: {
12-
publicPath: '../',
13-
name: config.outputs.image.filename
14-
}
15-
},
16-
17-
{
18-
loader: 'img-loader',
19-
options: {
20-
enabled: !isdev
21-
}
22-
}
23-
]
5+
include: config.paths.images,
6+
loader: 'file-loader',
7+
options: {
8+
publicPath: config.paths.relative,
9+
name: config.outputs.image.filename,
10+
emitFile: false,
11+
limit: 10000
12+
}
2413
}

build/rules/javascript.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ const config = require('../app.config')
22

33
module.exports = {
44
test: /\.js$/,
5-
include: config.paths.assets,
6-
loader: ['babel-loader']
5+
include: config.paths.javascript,
6+
loader: 'babel-loader'
77
}

build/rules/sass.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const config = require('../app.config')
88

99
module.exports = {
1010
test: /\.s[ac]ss$/,
11-
include: config.paths.assets,
11+
include: config.paths.sass,
1212
loader: ExtractTextPlugin.extract({
1313
use: [
1414
{
@@ -21,15 +21,15 @@ module.exports = {
2121
{
2222
loader: 'postcss-loader',
2323
options: {
24-
sourceMap: isdev,
24+
sourceMap: true,
2525
plugins: () => [autoprefixer]
2626
}
2727
},
2828

2929
{
3030
loader: 'sass-loader',
3131
options: {
32-
sourceMap: isdev
32+
sourceMap: true
3333
}
3434
}
3535
],

build/rules/vendor.js

Lines changed: 0 additions & 17 deletions
This file was deleted.

build/webpack.config.js

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,19 @@ const isdev = require('isdev')
33
const webpack = require('webpack')
44
const autoprefixer = require('autoprefixer')
55

6-
const CleanWebpackPlugin = require('clean-webpack-plugin')
6+
const CopyPlugin = require('copy-webpack-plugin')
7+
const CleanPlugin = require('clean-webpack-plugin')
78
const StyleLintPlugin = require('stylelint-webpack-plugin')
8-
const ExtractTextPlugin = require("extract-text-webpack-plugin")
9-
const BrowserSyncPlugin = require("browser-sync-webpack-plugin")
9+
const ExtractTextPlugin = require('extract-text-webpack-plugin')
10+
const BrowserSyncPlugin = require('browser-sync-webpack-plugin')
11+
const { default: ImageminPlugin } = require('imagemin-webpack-plugin')
1012

1113
const sassRule = require('./rules/sass')
1214
const fontsRule = require('./rules/fonts')
1315
const imagesRule = require('./rules/images')
1416
const javascriptRule = require('./rules/javascript')
17+
const externalFontsRule = require('./rules/external.fonts')
18+
const externalImagesRule = require('./rules/external.images')
1519

1620
const config = require('./app.config')
1721

@@ -34,16 +38,26 @@ module.exports = {
3438
module: {
3539
rules: [
3640
sassRule,
37-
javascriptRule,
41+
fontsRule,
3842
imagesRule,
39-
fontsRule
43+
javascriptRule,
44+
externalFontsRule,
45+
externalImagesRule,
4046
]
4147
},
4248

4349
plugins: [
4450
new webpack.LoaderOptionsPlugin({ minimize: !isdev }),
45-
new ExtractTextPlugin(config.outputs.stylesheet),
46-
new CleanWebpackPlugin(config.paths.public, { root: config.paths.root }),
51+
new ExtractTextPlugin(config.outputs.css),
52+
new CleanPlugin(config.paths.public, { root: config.paths.root }),
53+
new CopyPlugin([{
54+
from: {
55+
glob: `${config.paths.images}/**/*`,
56+
flatten: true,
57+
dot: false
58+
},
59+
to: config.outputs.image.filename,
60+
}]),
4761
]
4862
}
4963

@@ -69,4 +83,14 @@ if (! isdev) {
6983
sourceMap: isdev
7084
})
7185
)
86+
87+
module.exports.plugins.push(
88+
new ImageminPlugin({
89+
test: /\.(jpe?g|png|gif|svg)$/i,
90+
optipng: { optimizationLevel: 7 },
91+
gifsicle: { optimizationLevel: 3 },
92+
pngquant: { quality: '65-90', speed: 4 },
93+
svgo: { removeUnknownsAndDefaults: false, cleanupIDs: false }
94+
})
95+
)
7296
}

0 commit comments

Comments
 (0)