Как решить ошибку ChunkLoadError: сбой загрузки фрагмента горячего обновления second_app в webpack 5?

#javascript #webpack #webpack-dev-server

#javascript #webpack #webpack-dev-server

Вопрос:

при настройке нового проекта для разработки приложение не перезагружается. Приложение состоит из нескольких приложений, разделенных в разных папках. В настоящее время есть 2 приложения html_nodes_prototype и second_app src/apps папка in. Каждое приложение состоит из index.html , style.css и main.js когда я перехожу по ссылке http://localhost:8080/second_app/second_app.html , приложение показывает, но если я что-то изменю src/apps/second_app/main.js . Он не перезагружается, я должен вручную перезагрузить, чтобы получить изменения. Я настроил webpack-dev-server. В консоли отображаются сообщения об ошибках. Я не мог понять, что не так с файлом конфигурации.

Ошибка в консоли

 [HMR] Update failed: ChunkLoadError: Loading hot update chunk second_app failed.
(missing: http://localhost:8080/second_app.5b0047c2bf2b48c8a084.hot-update.js)
    at http://localhost:8080/second_app/second_app.bundle.js:987:26
    at new Promise (<anonymous>)
    at loadUpdateChunk (http://localhost:8080/second_app/second_app.bundle.js:982:20)
    at http://localhost:8080/second_app/second_app.bundle.js:1411:29
    at Array.forEach (<anonymous>)
    at Object.__webpack_require__.hmrC.jsonp (http://localhost:8080/second_app/second_app.bundle.js:1406:22)
    at http://localhost:8080/second_app/second_app.bundle.js:819:45
    at Array.reduce (<anonymous>)
    at http://localhost:8080/second_app/second_app.bundle.js:815:53
 

paths.js

 const path = require("path");

module.exports = {
  // Source files
  src: path.resolve(__dirname, "../src"),

  // Production build files
  build: path.resolve(__dirname, "../dist"),

  // public path
  public: path.resolve(__dirname, "../public/"),
};
 

webpack.dev.js

 const common = require("./webpack.common");
var HtmlWebpackPlugin = require("html-webpack-plugin");
const merge = require("webpack-merge").merge;
const paths = require("./paths");

module.exports = merge(common, {
  mode: "development",

  output: {
    filename: "[name]/[name].bundle.js",
    path: paths.build,
  },

  module: {
    rules: [
      { test: /.scss$/, use: ["style-loader", "css-loader", "sass-loader"] },
      { test: /.css$/, use: ["style-loader", "css-loader"] },
    ],
  },

  devServer: {
    historyApiFallback: true,
    // contentBase: paths.build,
    open: true,
    compress: true,
    hot: true,
    port: 8080,
  },

  plugins: [
    new HtmlWebpackPlugin({
      filename: "html_nodes_prototype/html_nodes_prototype.html",
      title: "HTML Nodes",
      template: "src/apps/html_nodes_prototype/index.html",
      chunks: ["html_nodes_prototype", "vendor"],
    }),
    new HtmlWebpackPlugin({
      filename: "second_app/second_app.html",
      title: "Second app",
      hot: true,
      template: "src/apps/second_app/index.html",
      chunks: ["second_app", "vendor"],
    }),
  ],
});
 

webpack.common.js

 const paths = require("./paths");

module.exports = {
  mode: "development",

  entry: {
    html_nodes_prototype: paths.src   "/apps/html_nodes_prototype/main.js",
    second_app: paths.src   "/apps/second_app/main.js",
    vendor: paths.src   "/apps/_vendor/vendor.js",
  },

  module: {
    rules: [{ test: /.m?js$/, use: ["babel-loader"] }],
  },
};
 

Ответ №1:

Добавление runtimeChunk: 'single' в webpack.dev.js работает на меня. Нашел ответ здесь

 module.exports = {
    ...,
    optimization: {
        runtimeChunk: 'single'
    },
    ...
}
 

Комментарии:

1. это работает, но при завершении горячей перезагрузки состояние компонента «перезагружается», а состояние очищается :/

2. Большое спасибо за @Sameer. Кажется, что HtmlWebpackPlugin принудительно компилирует дважды, по крайней мере, для меня, который работает, например, служба npx webpack с использованием webpack-dev-server. Как только я включил предложенный фрагмент от Sameer, все файлы начали перезагружаться должным образом. Спасатель, спасибо!

3. @LuanLuanLuan вы должны использовать devServer: {devMiddleware: {writeToDisk : true}} , чтобы сохранить ваши данные. Это достижимо с версии Webpack v5. Для получения дополнительной информации, пожалуйста, обратитесь к этому

4. @Sameer Спасибо за это решение и сопутствующую ссылку на проблему.