typescript - webpack 5 med HMR aktiverat - allt (även CSS-ändringar) orsakar en fullständig omladdning


Jag har ett litet Typescript/React-repo som använder webpack 5.72. Med Hot Module Replacement aktiverat skulle jag förvänta mig att kunna göra ändringar i komponenter eller CSS och att bara den ändrade komponenten eller stilen uppdateras. Istället orsakar varje ändring jag gör en fullständig uppdatering.

Varje ändring genererar rader som dessa i Chrome-konsolen:

[webpack-dev-server] "C:\path\to\ComponentName.tsx" from static directory was changed. Reloading...
index.js:551 [webpack-dev-server] App updated. Recompiling...
Navigated to http://localhost:8080/
bootstrap:24 [HMR] Waiting for update signal from WDS...

Det är det där "Navigated to localhost" som gör en fullständig uppdatering, men varför? Varför ser det mina filer som att de ligger i en statisk katalog istället för i moduler som kan bytas ut dynamiskt?

Repoet finns här, om någon vill kika på det och se koden/konfigurationen.

Jag har provat den här konfigurationen, auto-genererad för mig:

const path = require('path');

module.exports = {
  target: "web",
  mode: "development",
  entry: [
    './src/index.tsx',
    'react-hot-loader/patch',
  ],
  devtool: "inline-source-map",
  devServer: {
    static: {
      directory: path.resolve(__dirname, "src"),
    },
    hot: true
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules|(\.spec.ts)/,
      },
      {
        test: /\.js$/,
        enforce: "pre",
        use: ["source-map-loader"],
      },
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"]
      }
    ],
  },
  ignoreWarnings: [/Failed to parse source map/],
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
    publicPath: "/dist/",
  },
  resolve: {
    extensions: ['.tsx', '.ts', '.js'],
    alias: {
      "app": path.resolve(__dirname, "src/"),
      "test": path.resolve(__dirname, "test/"),
    }
  },
};

Så som jag förstår det från webpack-dokumentationen, borde raden use: ["style-loader", "css-loader"] för CSS-filer åtminstone göra det möjligt för mig att ändra en CSS-fil utan att behöva ladda om allt, men det gör det inte. Och 'react-hot-loader/patch' borde göra samma sak för mina React-komponenter. Men återigen, det gör det inte.

Svar #1

Jag tror att problemet här är att din katalog för statiska filer inkluderar dina källfiler. Observera utdata "C:\path\to\ComponentName.tsx" från den statiska katalogen ändrades. Laddar om.... Att välja ett annat värde för devServer.static.directory kommer troligtvis att lösa det.