-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebpack.parts.js
125 lines (111 loc) · 2.6 KB
/
webpack.parts.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
const autoprefixer = require('autoprefixer');
const cssnano = require('cssnano');
const webpack = require('webpack');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const GitRevisionPlugin = require('git-revision-webpack-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const PurifyCSSPlugin = require('purifycss-webpack');
const UglifyWebpackPlugin = require('uglifyjs-webpack-plugin');
exports.attachRevision = () => ({
plugins: [
new webpack.BannerPlugin({
banner: new GitRevisionPlugin().version(),
}),
],
});
exports.autoprefix = () => ({
loader: 'postcss-loader',
options: {
plugins: () => [autoprefixer()],
},
});
exports.clean = path => ({
plugins: [new CleanWebpackPlugin([path])],
});
// https://webpack.js.org/configuration/dev-server/
exports.devServer = ({ host, port } = {}) => ({
devServer: {
stats: 'errors-only',
host,
port,
overlay: true,
historyApiFallback: true,
},
});
exports.extractCSS = ({ include, exclude, use } = {}) => {
// Output extracted CSS to a file
const plugin = new ExtractTextPlugin({
allChunks: true,
filename: '[name].[chunkhash:4].css',
});
return {
module: {
rules: [
{
test: /\.less$/,
include,
exclude,
use: plugin.extract({
fallback: 'style-loader',
use,
}),
},
],
},
plugins: [plugin],
};
};
exports.extractFont = () => ({
module: {
rules: [
{
test: /\.css$/,
loader: ['style-loader', 'css-loader'],
},
{
test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
loader: 'file-loader',
},
{
test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
loader: 'file-loader',
},
],
},
});
exports.generateSourceMaps = ({ type }) => ({
devtool: type,
});
exports.loadImages = ({ include, exclude, options } = {}) => ({
module: {
rules: [
{
test: /\.(png|jpg)$/,
include,
exclude,
use: {
loader: 'url-loader',
options,
},
},
],
},
});
exports.minifyCSS = ({ options }) => ({
plugins: [
new OptimizeCSSAssetsPlugin({
cssProcessor: cssnano,
cssProcessorOptions: options,
canPrint: false,
}),
],
});
exports.minifyJavaScript = () => ({
optimization: {
minimizer: [new UglifyWebpackPlugin({ sourceMap: true })],
},
});
exports.purifyCSS = ({ paths }) => ({
plugins: [new PurifyCSSPlugin({ paths })],
});