Webpack Config Guide
Webpack 5 Config Template
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = (env, argv) => {
const isProd = argv.mode === 'production'
return {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: isProd ? '[name].[contenthash:8].js' : '[name].js',
clean: true,
},
module: {
rules: [
// JavaScript / TypeScript
{ test: /\.[jt]sx?$/, use: 'babel-loader', exclude: /node_modules/ },
// CSS / Sass
{ test: /\.scss$/, use: [
isProd ? MiniCssExtractPlugin.loader : 'style-loader',
'css-loader', 'sass-loader'
]},
// Images
{ test: /\.(png|jpg|svg|gif|webp)$/, type: 'asset/resource' },
],
},
plugins: [
new HtmlWebpackPlugin({ template: './public/index.html' }),
...(isProd ? [new MiniCssExtractPlugin({ filename: '[name].[contenthash:8].css' })] : []),
],
optimization: {
splitChunks: { chunks: 'all' },
runtimeChunk: 'single',
},
devServer: {
port: 3000,
historyApiFallback: true,
proxy: { '/api': 'http://localhost:8080' },
},
}
}
Common Loaders
| Loader | Handles |
|---|---|
| babel-loader | JS/JSX/TS → modern JS |
| ts-loader / esbuild-loader | TypeScript |
| css-loader | CSS imports |
| style-loader | Inject CSS into DOM |
| sass-loader | SCSS → CSS |
| file-loader / asset/resource | Images, fonts |
| url-loader / asset/inline | Small files → base64 |