-
Notifications
You must be signed in to change notification settings - Fork 0
/
webpack.build.js
136 lines (136 loc) · 4.52 KB
/
webpack.build.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
126
127
128
129
130
131
132
133
134
135
136
const CopyPlugin = require('copy-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const ImageminPlugin = require('imagemin-webpack');
const imageminWebp = require('imagemin-webp');
const imageminMozjpeg = require('imagemin-mozjpeg');
const merge = require('webpack-merge');
const baseConfig = require('./webpack.common.js');
/* 1
Используется расширение для редактора, из-за которого код внутри вызова
функции выделяется одним цветом, вследствие чего комментарии сливаются с кодом
при нахождении на одном уровне по отступам. По этой причине комментарии
отделяются двумя пробелами от основного содержимого в таких областях, а также
в областях, где будет наблюдаться такая же ситуация, например в вызове
конструктора
*/
module.exports = merge(baseConfig, {
// Показывалось предупреждение о превышенном размере js и css файлов
// в бандле
performance: { hints: false },
optimization: {
minimizer: [
new TerserPlugin({
cache: true,
parallel: true,
}),
],
},
module: {
rules: [
{
test: /\.scss$/,
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
importLoaders: 1,
},
},
'postcss-loader',
'fast-sass-loader',
{
loader: 'sass-resources-loader',
options: {
// Сделать содержимое этих файлов доступным для каждого SFC
// без их импорта
resources: [
'./src/scss/helpers/variables.scss',
'./src/scss/helpers/functions/*.scss',
'./src/scss/helpers/mixins/*.scss',
],
},
},
],
},
{
test: /\.(woff|woff2)$/,
use: [
{
loader: 'file-loader',
options: {
// Файлы находились не в той папке в бандле
context: 'src/',
name: '[path][name].[ext]',
},
},
],
},
{
test: /\.(jpg|webp)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 10000,
context: 'src/',
name: '[path][name].[ext]',
},
},
],
},
{
test: /\.svg$/,
use: [
{
loader: 'svg-sprite-loader',
options: {
// Добавляет отдельный файл svg спрайта в бандл
extract: true,
},
},
{
// Минификатор
loader: 'svgo-loader',
options: {
externalConfig: 'svgo.config.yml',
},
},
],
},
],
},
plugins: [
new MiniCssExtractPlugin({
filename: 'style.[hash].css',
}),
// JSON файлы статичные
new CopyPlugin([
{ from: 'src/data', to: 'data/' },
]),
// Только этот плагин может минифицировать изображения, заинлайненные url
// загрузчиком
new ImageminPlugin({
// Контролировать только эти форматы, тем самым исключив svg,
// поскольку им занимается svgo-loader
test: /\.(jpg|webp)$/i,
name: '[path][name].[ext]',
context: 'src/',
imageminOptions: {
plugins: [
// Картинки товаров на главной странице уже сжаты, так что это по
// большей части просто демонстрация использования минификатора
imageminMozjpeg({
quality: 100,
}),
imageminWebp({
quality: 70,
}),
],
},
}),
new CleanWebpackPlugin(),
],
});