Благодаря этому руководству Я нашел способ адаптировать свой проект и получить горячую загрузку для работы.Это даже сделало мой код немного чище, а мои скрипты сборки simpeler.
Webpack.common.js
Первое, что мне нужно было изменить, - это babel-loader.Я украл его из какого-то учебника, и он работал, но я не знал точно, что он сделал, поэтому я избавился от этого кода.Я также ускорил компиляцию моего кода с помощью webpack.DllReferencePlugin
.
. Вот обновленный webpack.common.js:
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const AddAssetHtmlPlugin = require('add-asset-html-webpack-plugin');
module.exports = {
entry: {
app: [
'babel-polyfill',
'./src/index.js',
],
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /\.jsx?$/,
loader: 'babel-loader',
exclude: /node_modules/,
options: {
plugins: ['react-hot-loader/babel'],
cacheDirectory: true,
presets: ['env', 'react'],
},
}
],
},
plugins: [
new webpack.DllReferencePlugin({
context: path.join(__dirname),
manifest: require('../dist/vendor-manifest.json'),
}),
new HtmlWebpackPlugin({
title: '<my-app-name>',
filename: 'index.html',
template: './public/index.html',
}),
new AddAssetHtmlPlugin({
filepath: path.resolve(__dirname, '../dist/*.dll.js'),
includeSourcemap: false // add this parameter
})
],
};
AddAssetHtmlPlugin
требуется, посколькуindex.html
создается динамически ( HtmlWebpackPlugin ) для сервера dev, и вы не можете жестко закодировать правильный импорт пакетов для vendor.dll
и app.bundle
( здесь ).
webpack.dev.js
const merge = require('webpack-merge');
const common = require('./webpack.common.js');
const webpack = require('webpack');
const path = require('path');
module.exports = merge(common, {
mode: 'development',
devtool: 'eval-source-map',
devServer: {
hot: true,
contentBase: path.resolve(__dirname, 'dist'),
historyApiFallback: true // Allow refreshing of the page
},
plugins: [
new webpack.HotModuleReplacementPlugin(), // Enable hot reloading
]
});
Что я изменил:
Я перенес записьточка до webpack.common
.
I Удалено 'react-hot-loader/patch'
из entry
( необязательно ) Я добавил некоторые параметры конфигурации для webpack-dev-server
.
Index.js
Этот файл вызвалгорячая перезагрузка, чтобы потерпеть неудачу.Особенно часть if(module.hot)
вызвала сбой.Поэтому я изменил его на следующее:
import React from 'react';
import ReactDOM from 'react-dom';
import { AppContainer } from 'react-hot-loader';
import { App } from './app';
const render = () => {
ReactDOM.render(
<AppContainer>
<App/>
</AppContainer>,
document.getElementById('app'),
);
};
render(App);
if (module.hot) {
module.hot.accept('./app', () => {
const NextApp = require('./app').default; // Get the updated code
render(NextApp);
});
}
Причина, по которой оно работает сейчас, заключается в том, что теперь я загружаю новое приложение и заменяю старое, таким образом сообщая горячему загрузчику, что произошли изменения.Я также мог бы просто использовать module.hot.accept()
, но это сделало бы react-hot-loader
бесполезным (вы используете горячую перезагрузку веб-пакета), и таким образом я бы также терял состояние в своих компонентах каждый раз, когда обновлял какой-то код.
Итак, поехали.Я надеюсь, что это поможет любому (кроме меня).