Add react HMR

This commit is contained in:
Andras Schmelczer 2026-02-07 13:25:37 +00:00
parent 392f73467b
commit ee73ab77fd
3 changed files with 1990 additions and 14 deletions

File diff suppressed because it is too large Load diff

View file

@ -31,11 +31,17 @@
"tailwindcss-animate": "^1.0.7" "tailwindcss-animate": "^1.0.7"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.29.0",
"@babel/preset-env": "^7.29.0",
"@babel/preset-react": "^7.28.5",
"@babel/preset-typescript": "^7.28.5",
"@pmmmwh/react-refresh-webpack-plugin": "^0.6.2",
"@types/react": "^18.2.0", "@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0", "@types/react-dom": "^18.2.0",
"@typescript-eslint/eslint-plugin": "^7.0.0", "@typescript-eslint/eslint-plugin": "^7.0.0",
"@typescript-eslint/parser": "^7.0.0", "@typescript-eslint/parser": "^7.0.0",
"autoprefixer": "^10.4.0", "autoprefixer": "^10.4.0",
"babel-loader": "^10.0.0",
"css-loader": "^7.0.0", "css-loader": "^7.0.0",
"eslint": "^8.57.0", "eslint": "^8.57.0",
"eslint-plugin-react": "^7.34.0", "eslint-plugin-react": "^7.34.0",
@ -46,6 +52,7 @@
"postcss-loader": "^8.0.0", "postcss-loader": "^8.0.0",
"prettier": "^3.2.0", "prettier": "^3.2.0",
"puppeteer": "^24.0.0", "puppeteer": "^24.0.0",
"react-refresh": "^0.18.0",
"style-loader": "^4.0.0", "style-loader": "^4.0.0",
"tailwindcss": "^3.4.0", "tailwindcss": "^3.4.0",
"ts-loader": "^9.5.0", "ts-loader": "^9.5.0",

View file

@ -1,6 +1,7 @@
const path = require('path'); const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin');
module.exports = (env, argv) => { module.exports = (env, argv) => {
const isProduction = argv.mode === 'production'; const isProduction = argv.mode === 'production';
@ -12,18 +13,28 @@ module.exports = (env, argv) => {
filename: 'bundle.js', filename: 'bundle.js',
clean: true, clean: true,
// Empty string generates relative paths that work through proxies // Dev needs '/' for HMR WebSocket; prod uses '' for relative paths through proxies
publicPath: '', publicPath: isProduction ? '' : '/',
}, },
resolve: { resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx'], extensions: ['.ts', '.tsx', '.js'],
}, },
module: { module: {
rules: [ rules: [
{ {
test: /\.tsx?$/, test: /\.tsx?$/,
exclude: /node_modules/, exclude: /node_modules/,
use: 'ts-loader', use: {
loader: 'babel-loader',
options: {
presets: [
'@babel/preset-env',
['@babel/preset-react', { runtime: 'automatic' }],
'@babel/preset-typescript',
],
plugins: isProduction ? [] : ['react-refresh/babel'],
},
},
}, },
{ {
test: /\.css$/, test: /\.css$/,
@ -39,7 +50,9 @@ module.exports = (env, argv) => {
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
template: './src/index.html', template: './src/index.html',
}), }),
...(isProduction ? [new MiniCssExtractPlugin()] : []), ...(isProduction
? [new MiniCssExtractPlugin()]
: [new ReactRefreshWebpackPlugin()]),
], ],
devServer: { devServer: {
port: 3000, port: 3000,
@ -47,11 +60,8 @@ module.exports = (env, argv) => {
historyApiFallback: { historyApiFallback: {
index: 'index.html', index: 'index.html',
}, },
// Disable WebSocket-based HMR for proxy compatibility hot: true,
// VS Code web proxy sends WebSocket messages as Blobs which breaks HMR liveReload: true,
webSocketServer: false,
hot: false,
liveReload: false,
proxy: [ proxy: [
{ {
context: ['/api'], context: ['/api'],