const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = (env, argv) => {
const isProduction = argv.mode === 'production';
return {
entry: './src/index.tsx',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
clean: true,
// Empty string generates relative paths that work through proxies
publicPath: '',
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx'],
},
module: {
rules: [
{
test: /\.tsx?$/,
exclude: /node_modules/,
use: 'ts-loader',
},
{
test: /\.css$/,
use: [
isProduction ? MiniCssExtractPlugin.loader : 'style-loader',
'css-loader',
'postcss-loader',
],
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
}),
...(isProduction ? [new MiniCssExtractPlugin()] : []),
],
devServer: {
port: 3000,
allowedHosts: 'all',
historyApiFallback: {
index: 'index.html',
},
// Disable WebSocket-based HMR for proxy compatibility
// VS Code web proxy sends WebSocket messages as Blobs which breaks HMR
webSocketServer: false,
hot: false,
liveReload: false,
proxy: [
{
context: ['/api'],
target: 'http://localhost:8001',
},
],
},
};
};