-
Notifications
You must be signed in to change notification settings - Fork 0
/
webpack.config.js
147 lines (143 loc) · 3.57 KB
/
webpack.config.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
137
138
139
140
141
142
143
144
145
146
147
// Node import
const path = require('path');
// Plugins de traitement pour dist/
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const HtmlWebPackPlugin = require('html-webpack-plugin');
// Config pour le devServer
const host = 'localhost';
const port = 8080;
const devMode = process.env.NODE_ENV !== 'production';
// Config de Webpack
module.exports = {
// Passe le build par dèfaut en déeveloppement
mode: 'development',
// Source maps
devtool: devMode ? 'eval-source-map' : undefined,
// Expose le dossier src/ pour les imports
resolve: {
alias: {
src: path.resolve(__dirname, 'src/'),
},
},
// Points d'entrée pour le travail de Webpack
entry: {
app: [
// JS
'./src/index.js',
],
},
// Sortie
output: {
// Nom du bundle
filename: 'app.js',
// Nom du bundle vendors si l'option d'optimisation / splitChunks est activée
chunkFilename: 'vendors.js',
// Cible des bundles
path: path.resolve(__dirname, 'dist'),
publicPath: '/',
},
// Optimisation pour le build
optimization: {
// Code spliting
splitChunks: {
chunks: 'all',
},
// Minification
minimizer: [
new UglifyJsPlugin({
cache: true,
parallel: true,
sourceMap: false, // passer à true pour JS source maps
}),
new OptimizeCSSAssetsPlugin({}),
],
},
// Modules
module: {
rules: [
// JS
{
test: /\.js$/,
exclude: /node_modules/,
use: [
// babel avec une option de cache
{
loader: 'babel-loader',
options: {
cacheDirectory: true,
},
},
],
},
// CSS / SASS / SCSS
{
test: /\.(sa|sc|c)ss$/,
use: [
// style-loader ou fichier
devMode ? 'style-loader' : MiniCssExtractPlugin.loader,
// Chargement du CSS
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: () => [require('autoprefixer')],
sourceMap: true,
},
},
// SASS
'sass-loader',
],
},
// Images
{
test: /\.(png|svg|jpg|gif)$/,
use: [
{
loader: 'file-loader',
options: {
outputPath: 'assets/',
},
},
],
},
// fonts
{
test: /\.(ttf|otf|eot|woff2?)(\?[a-z0-9]+)?$/,
exclude: /medias/,
use: [
{
loader: 'file-loader',
options: {
outputPath: 'fonts/',
name: '[name][hash].[ext]',
},
},
],
},
],
},
devServer: {
overlay: true, // Overlay navigateur si erreurs de build
stats: 'minimal', // Infos en console limitées
progress: true, // progression du build en console
inline: true, // Rechargement du navigateur en cas de changement
open: true, // on ouvre le navigateur
historyApiFallback: true,
host: host,
port: port,
},
plugins: [
// Permet de prendre le index.html de src comme base pour le fichier de dist/
new HtmlWebPackPlugin({
template: './src/index.html',
filename: './index.html',
}),
// Permet d'exporter les styles CSS dans un fichier css de dist/
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css',
}),
],
};