Uncaught Error: [HMR] Горячая замена модуля отключена

Я использую webpack для моей сборки, которая работает без проблем, используя webpack-dev-server (npm run watch), однако, когда я пытаюсь создать производственную сборку (npm run buildКажется, я получаю сообщение об ошибке в консоли при попытке загрузить веб-сайт, и на экране ничего не отображается.

Неопознанная ошибка: горячая замена модуля [HMR] отключена.

У меня есть несколько вопросов по этому поводу:

  1. Мое понимание использования Hot Module Replacement заключается в том, что он предназначен для облегчения жизни во время разработки, его не следует использовать в производственных развертываниях. Это верно?

  2. Учитывая ниже, почему Hot Module Replacement используется? Я не вижу, что движет этим.

  3. Какова лучшая практика, когда дело доходит до производственных сборок, если у меня есть отдельный webpack конфиг для прод и дев? В идеале я хотел бы использовать одну конфигурацию исключительно для упрощения обслуживания.

package.json

{
  // ...
  "scripts": {
    "build": "webpack --progress --colors --production",
    "watch": "webpack-dev-server --inline --hot --progress --colors"
  },
  "dependencies": {
    "bootstrap": "^3.3.6",
    "bootstrap-sass": "^3.3.6",
    "bootstrap-webpack": "0.0.5",
    "extract-text-webpack-plugin": "^1.0.1",
    "html-webpack-plugin": "^2.15.0",
    "jquery": "^2.2.3",
    "node-sass": "^3.4.2",
    "react": "^15.0.1",
    "react-bootstrap": "^0.28.5",
    "react-dom": "^15.0.1",
    "react-redux": "^4.4.1",
    "react-router": "^2.0.1",
    "react-router-redux": "^4.0.1",
    "redux": "^3.3.1",
    "redux-thunk": "^2.0.1",
    "webpack": "^1.12.14"
  },
  "devDependencies": {
    "babel-core": "^6.7.4",
    "babel-loader": "^6.2.4",
    "babel-preset-es2015": "^6.6.0",
    "babel-preset-react": "^6.5.0",
    "css-loader": "^0.23.1",
    "exports-loader": "^0.6.3",
    "file-loader": "^0.8.5",
    "imports-loader": "^0.6.5",
    "less": "^2.6.1",
    "less-loader": "^2.2.3",
    "redux-devtools": "^3.2.0",
    "redux-logger": "^2.6.1",
    "sass-loader": "^3.2.0",
    "style-loader": "^0.13.1",
    "url-loader": "^0.5.7",
    "webpack-dev-server": "^1.14.1"
  }
}

webpack.config.js

var webpack = require('webpack');
var htmlWebpackPlugin = require('html-webpack-plugin');
var path = require('path');

module.exports = {
    entry: [
        'webpack/hot/only-dev-server',
        path.resolve(__dirname, 'app/index.js')
    ],
    output: {
        path: path.resolve(__dirname, 'public'),
        filename: 'bundle.js'
    },
    module: {
        loaders: [
            { test: /\.jsx?$/, exclude: /node_modules/, loader: 'babel', query: { presets: [ 'es2015', 'react' ] } },
            { test: /\.scss$/, loader: 'style!css!sass?includePaths[]=' + path.resolve(__dirname, './node_modules/bootstrap-sass/assets/stylesheets/') },
            { test: /\.(ttf|eot|svg|woff(2)?)(\?[a-z0-9]+)?$/, loader: 'file' }
        ]
    },
    resolve: {
        modulesDirectories: ['node_modules']
    },
    plugins: [
        new webpack.NoErrorsPlugin(),
        new htmlWebpackPlugin({
            filename: 'index.html',
            template: './index.html',
            inject: false
        }),
        new webpack.ProvidePlugin({
            $: "jquery",
            jQuery: "jquery"
        }),
        new webpack.optimize.OccurenceOrderPlugin()
    ]
};

3 ответа

Решение

Не очень хорошая идея включать биты горячей загрузки в производственную сборку. Они там практически бесполезны и просто увеличивают размер вашего файла.

Есть несколько стратегий, как с этим бороться. Некоторые люди разделяют свою конфигурацию веб-пакета на файл и затем указывают на нее через --config, Я предпочитаю поддерживать один файл и разветвляться через npm. Я использую webpack-merge для обмена конфигурациями между ветками (отказ от ответственности: я автор).

Вам необходимо включить плагин HMR. Добавьте HotModuleReplacementPlugin в ваш массив плагинов в вашем webpack.config. Вы можете иметь отдельный webpack.config для разработки и производства.

Что-то вроде

 plugins: [
    new webpack.NoErrorsPlugin(),
    new htmlWebpackPlugin({
        filename: 'index.html',
        template: './index.html',
        inject: false
    }),
    new webpack.ProvidePlugin({
        $: "jquery",
        jQuery: "jquery"
    }),
    new webpack.optimize.OccurenceOrderPlugin(),
    new webpack.HotModuleReplacementPlugin()
]

Я получил эту ошибку из-за того, что у меня был такой код в webpack.config.js,

devServer: {
    ...
    hot: true,
    inline: true
}

Использовал команду webpack-dev-server --hot --inline вместо этого и тогда я не должен был раздуть мой конфиг с new webpack.HotModuleReplacementPlugin(),

https://github.com/webpack/webpack/issues/1151

Вам нужно будет включить функцию горячей замены модуля, например:

webpack.config.js

module.exports = {
  //...
  devServer: {
    hot: true
  },
  plugins: [
    //...
    new webpack.HotModuleReplacementPlugin()
  ]

};

Из веб-пакета:Note that webpack.HotModuleReplacementPlugin is required to fully enable HMR. If webpack or webpack-dev-server are launched with the --hot option, this plugin will be added automatically, so you may not need to add this to your webpack.config.js. See the HMR concepts page for more information.

Как сказано, в противном случае вы можете включить его через package.json добавлять --hot к вашему сценарию, например

"start": "webpack-dev-server --hot",

Другие вопросы по тегам