8

react-hot-loader を使用して webpack のホット リロードを設定しようとしています。ほとんどの場合、機能しているようです。既存の Rails アプリで webpack を使用しています。

ただし、ホットリロードではありません。反応コードが変更されるたびにリロードをトリガーするだけです。私が得るエラーメッセージは次のとおりです。

[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 開発環境は、私の development.rb ファイルの次の設定により、webpack-dev-server を介してアプリケーション アセット パイプラインの外部で webpack ファイルを提供します。

config.action_controller.asset_host = Proc.new { |source|
  if source =~ /webpack\/bundle\.js$/i
    "http://localhost:8080"
  end
}

私はこれを何時間も機能させようとしています。どんな助けでも大歓迎です。

みんなありがとう!

4

4 に答える 4

6

OK、同じエラーが発生しましたが、いくつか試してみたところ、次のことがわかりました。私のルート コンポーネントは、ステートレスな機能コンポーネント (純粋な関数) でした。クラス コンポーネントと BAM にリファクタリングしました。ホットリロードが再び機能しています。

前:

const App = (props) => (
  <div>
    <Header links={headerLinks} logoSrc={logoSrc} />
    {props.children}
  </div>
);

後:

class App extends React.Component {
  render() {
    return (
      <div>
        <Header links={headerLinks} logoSrc={logoSrc} />
        {this.props.children}
      </div>
    );
  }
}
于 2016-09-22T15:11:08.097 に答える
2

私は最近、この正確な問題に遭遇しました。私にとっての修正は、これをentries配列から削除することでした: 'webpack-dev-server/client?http://localhost:9000/',.

--hotコマンド ライン引数としても実行していたため、2 つのインスタンスでwebpack-dev-server不適切な状態になりました。

于 2016-10-14T19:49:14.163 に答える