Получение "Прервано, потому что 0 не принято" и полная перезагрузка страницы с реагирующим горячим загрузчиком
Я пытаюсь настроить горячую перезагрузку веб-пакета с реагирующим горячим загрузчиком. В основном это похоже на работу. Я использую webpack в существующем приложении rails.
Но это не горячая перезагрузка. Это просто вызывает перезагрузку каждый раз, когда мой код реагирования изменяется. Сообщения об ошибках, которые я получаю:
[HMR] Cannot apply update. Need to do a full reload! - dev-server.js:18
[HMR] Error: Aborted because 0 is not accepted - dev-server.js:19
at hotApply (http://localhost:8080/assets/webpack/bundle.js?body=1:380:31)
at hotUpdateDownloaded (http://localhost:8080/assets/webpack/bundle.js?body=1:293:13)
at hotAddUpdateChunk (http://localhost:8080/assets/webpack/bundle.js?body=1:273:13)
at webpackHotUpdateCallback (http://localhost:8080/assets/webpack/bundle.js?body=1:5:12)
at http://localhost:8080/assets/webpack0.bd89931b2fa8e2901794.hot-update.js:1:1
Navigated to http://lvh.me:3000/react_page
Вот мои настройки webpack.hot.config.js:
var path = require('path');
var webpack = require('webpack');
var config = module.exports = {
// Set 'context' for Rails Asset Pipeline
context: __dirname,
entry: {
App: [
'webpack-dev-server/client?http://localhost:8080/', // WebpackDevServer host and port
'webpack/hot/only-dev-server', // "only" prevents reload on syntax errors
'./app/frontend/javascripts/app.js' // Your appʼs entry point
],
vendor: ['jquery', 'react', 'react-dom', 'react-redux', 'redux','redux-thunk']
},
devtool: 'inline-source-map',
// Require the webpack and react-hot-loader plugins
plugins: [
//new webpack.HotModuleReplacementPlugin(),
new webpack.optimize.CommonsChunkPlugin(
{
name: 'vendor',
chunks: [''],
filename: 'vendor.js',
minChunks: Infinity
}),
new webpack.NoErrorsPlugin(),
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
'window.jquery': 'jquery'
})
],
module: {
loaders: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loaders: [
'react-hot',
'babel?presets[]=es2015&presets[]=react'
],
cacheDirectory: true
}
]
},
output: {
path: path.join(__dirname, 'app', 'assets', 'javascripts', 'webpack'), // Save to Rails Asset Pipeline
filename: 'bundle.js', // Will output App_wp_bundle.js
publicPath: 'http://localhost:8080/assets/webpack',
//publicPath: 'http://localhost:8080/assets/webpack' // Required for webpack-dev-server
},
resolve: {
extensions: ['', '.js', '.jsx'],
modulesDirectories: ['node_modules'],
},
};
И я запускаю код с
webpack-dev-server -d --config webpack.hot.config.js --hot --inline
Среда разработки rails обслуживает файлы веб-пакетов вне конвейера ресурсов приложения через webpack-dev-server из-за следующей настройки в моем файле development.rb.
config.action_controller.asset_host = Proc.new { |source|
if source =~ /webpack\/bundle\.js$/i
"http://localhost:8080"
end
}
Я пытался заставить это работать часами. Любая помощь будет оценена.
Спасибо, парни!
6 ответов
Хорошо, я получал ту же ошибку, но, попробовав кое-что, я понял: мой корневой компонент был функциональным компонентом без состояния (чистая функция). Я переделал его на компонент класса и BAM! горячая перезагрузка снова работает.
До:
const App = (props) => (
<div>
<Header links={headerLinks} logoSrc={logoSrc} />
{props.children}
</div>
);
После:
class App extends React.Component {
constructor() {
super();
this.state = {};
}
render() {
return (
<div>
<Header links={headerLinks} logoSrc={logoSrc} />
{this.props.children}
</div>
);
}
}
Поскольку приведенные выше ответы все еще не работают на моей стороне с webpack 5, вот рабочая конфигурация из webpack
В webpack.config.js
devServer: {
.
.
.
hot: true,
}
В точку входа webpack index.js добавьте
if (module.hot) {
module.hot.accept();
}
В package.json стартовый скрипт
"scripts": {
.
.
"start": "webpack serve --config /webpack.config.js"
},
Я недавно столкнулся с этой проблемой, исправление для меня было удаление этого из entries
массив: 'webpack-dev-server/client?http://localhost:9000/',
,
Как я тоже бегал --hot
в качестве аргумента командной строки, было два экземпляра webpack-dev-server
попасть в плохое состояние.
Я столкнулся с подобной проблемой. После 2 дней исследований и проб разных вещей я обнаружил самую простую причину моей проблемы: в webpack.config.js у меня был включен сервер разработки HRM. И у меня также был сервер HMR, запущенный из командной строки. Благодаря подсказке от Tyler Kelley (см. Выше), просто удалив --hot из командной строки, теперь он работает нормально.
текущий webpack.config.js
devtool: "inline-source-map",
devServer: {
publicPath: '/dist/',
contentBase: path.join(__dirname, 'public'),
port: 9000,
hot: true
},
С этой конфигурацией не делайте этого:
npx webpack-dev-server --hot --inline
Сделай это:
npx webpack-dev-server
Я не знаю, поможет ли это конкретно вашей проблеме, но я недавно столкнулся с этой ошибкой - я исправил ее, добавив .js
расширение модуля, которое я пытался настроить с помощью hmr - вот мой код
if (module.hot) {
module.hot.accept('app/Routes', () => (
getRoutes = require('app/Routes')
))
}
Я обновил его до getRoutes = require('app/Routes.js')
и ошибка исчезла, используя webpack ^2.0.0-beta
,
это также работает, если я добавлю расширение JS в качестве первого аргумента горячего подтверждения следующим образом:
if (module.hot) {
module.hot.accept('app/Routes.js', () => (
getRoutes = require('app/Routes')
))
}
так что теперь это соответствует тому, что на странице HMR веб-пакета
Для "webpack": "^5.74.0" и "webpack-dev-server": "^4.11.1". Я установил devServer.static = ['./webpack-dev-server', './dist'], в webpack.config.js. Есть мой конфиг:
module.exports = {
devtool: 'inline-source-map',
devServer: {
open: true,
static: ['./webpack-dev-server', './dist']
},
entry: path.join(__dirname, 'src', 'index.ts'),
module: {
rules: [
{
test: /\.(ttf|png|svg|jpg|jpeg)$/i,
type: 'asset/resource',
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
{
test: /\.ts$/,
loader: 'ts-loader',
options: {
configFile: path.join(__dirname, 'tsconfig.json')
}
}
]
},
mode: 'development',
output: {
filename: '[name][contenthash].js',
path: path.join(__dirname, 'dist'),
clean: true,
},
plugins: [
new HtmlWebpackPlugin({
template: path.join(__dirname, 'src', 'index.html'),
inject: 'body'
})
],
resolve: {
extensions: ['.js', '.ts']
}
}