【问题标题】:react-hot-loader configuration error: not updating the browser on component changereact-hot-loader 配置错误:组件更改时不更新浏览器
【发布时间】:2017-08-27 13:03:37
【问题描述】:

我使用 rect-redux-universal-hot-example 作为我使用 ReactJs 的同构应用程序加载器的基础。

我正在使用 react-hot-loader 并关注 this migration guide 以删除已弃用的 hmr react-transform

我做了下面的配置,但是一旦我更改了一些 App 组件数据,我在浏览器中的页面不会自动重新加载。控制台或浏览器都没有错误。

这是我的设置:

.babelrc

{
  "presets": ["react", "es2015", "stage-0"],

  "plugins": [
    "transform-runtime",
    "add-module-exports",
    "transform-react-display-name",
    "flow-runtime",
    "react-hot-loader/babel"
  ]
}

client.js

import ReactDOM from 'react-dom';
import React from 'react';
import { AppContainer } from 'react-hot-loader'
import App from './component/App';

const dest = document.getElementById('content');

const render = Component => {
  ReactDOM.render(
    <AppContainer>
      <Component />
    </AppContainer>,
    document.getElementById('root')
  )
}

render(App)

if (module.hot) {
  module.hot.accept('./component/App', () => { render(App) })
}

dev.config

require('babel-polyfill');

// Webpack config for development
var fs = require('fs');
var path = require('path');
var webpack = require('webpack');
var assetsPath = path.resolve(__dirname, '../static/dist');
var host = (process.env.HOST || 'localhost');
var port = (+process.env.PORT + 1) || 3001;

// https://github.com/halt-hammerzeit/webpack-isomorphic-tools
var WebpackIsomorphicToolsPlugin = require('webpack-isomorphic-tools/plugin');
var webpackIsomorphicToolsPlugin = new WebpackIsomorphicToolsPlugin(require('./webpack-isomorphic-tools'));

module.exports = {
  devtool: 'inline-source-map',
  context: path.resolve(__dirname, '..'),
  entry: {
    'main': [
      'react-hot-loader/patch',
      './src/client.js'
    ]
  },
  output: {
    path: assetsPath,
    filename: '[name]-[hash].js',
    chunkFilename: '[name]-[chunkhash].js',
    publicPath: 'http://' + host + ':' + port + '/dist/'
  },
  module: {
    loaders: [
      { test: /\.jsx?$/, exclude: /node_modules/, loaders: ['babel-loader', 'eslint-loader']},
      { test: /\.json$/, loader: 'json-loader' },
      { test: /\.less$/, loader: 'style-loader!css?modules&importLoaders=2&sourceMap&localIdentName=[local]___[hash:base64:5]!autoprefixer?browsers=last 2 version!less?outputStyle=expanded&sourceMap' },
      { test: /\.scss$/, loader: 'style-loader!css?modules&importLoaders=2&sourceMap&localIdentName=[local]___[hash:base64:5]!autoprefixer?browsers=last 2 version!sass?outputStyle=expanded&sourceMap' },
      { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=application/font-woff" },
      { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=application/font-woff" },
      { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=application/octet-stream" },
      { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: "file-loader" },
      { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: "url-loader?limit=10000&mimetype=image/svg+xml" },
      { test: webpackIsomorphicToolsPlugin.regular_expression('images'), loader: 'url-loader?limit=10240' }
    ]
  },
  resolve: {
    modules: [
      'src',
      'node_modules'
    ],
    extensions: ['*', '.json', '.js', '.jsx']
  },
  plugins: [
    // hot reload
    new webpack.HotModuleReplacementPlugin(),
    new webpack.IgnorePlugin(/webpack-stats\.json$/),
    new webpack.DefinePlugin({
      __CLIENT__: true,
      __SERVER__: false,
      __DEVELOPMENT__: true,
      __DEVTOOLS__: true  // <-------- DISABLE redux-devtools HERE
    }),
    webpackIsomorphicToolsPlugin.development()
  ]
};

我很确定我的设置有问题,但我找不到。

【问题讨论】:

    标签: javascript reactjs react-hot-loader


    【解决方案1】:

    我认为你在这里遗漏了一些东西:

    在您的dev.config.js 中,您的主条目中还需要webpack-hot-middleware/client

    在你的client.js:

    import ReactDOM from 'react-dom';
    import React from 'react';
    import { AppContainer } from 'react-hot-loader'
    
    // this import path doesn't match import path below
    import App from './component/App/app';
    
    const dest = document.getElementById('content');
    
    const render = Component => {
      ReactDOM.render(
        <AppContainer>
          <Component />
        </AppContainer>,
        document.getElementById('root')
      )
    }
    
    render(App)
    
    if (module.hot) {
      // Are you sure this is your correct path? This
      // doesn't match the import path above.
      module.hot.accept('./containers/App', () => {
        // import App
        const NextApp = require('./containers/App').default;
        render(NextApp);
      })
    }
    

    如需更多参考,您可以查看此thread

    【讨论】:

    • 原代码中的路径已更正,但建议的设置仍然不起作用。顺便说一句,我在这个阶段根本没有使用 Redux - 在运行这个基本应用程序之后,我将包含 Relay,但现在我需要让它工作。我需要 Redux 来允许 react-hot-loader 工作吗?
    • 不,Redux 是一个状态管理库。它与 react-hot-loader 无关。也许你可以用最少的设置(没有 Redux、Relay 等)设置一个 repo,然后我可以帮你调试?
    猜你喜欢
    • 2017-01-11
    • 2018-03-22
    • 1970-01-01
    • 2018-07-26
    • 2017-11-30
    • 2018-12-03
    • 2016-10-02
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多