【问题标题】:React-hot-loader not re-rending componentsReact-hot-loader 不重新渲染组件
【发布时间】:2018-07-26 01:10:29
【问题描述】:

我有一个应用程序正在提供 EJS 视图,我的 React.js 包加载到脚本标记中。

我已按照 react-hot-loader v3 和 @next 的说明进行操作,但都没有工作。控制台中没有错误,并且组件不会在更改时重新渲染。

这是我的应用入口点:

import 'babel-polyfill';
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';

import getMuiTheme from 'material-ui/styles/getMuiTheme';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import injectTapEventPlugin from 'react-tap-event-plugin';
import { AppContainer } from 'react-hot-loader'

import { store } from './routes';

import App from './containers/App';

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

render(App);
//registerServiceWorker();

// Webpack Hot Module Replacement API
if (module.hot) {
  console.log('module.hot exists');
  module.hot.accept('./containers/App', () => {
    console.log('Reloading app');
    render(App);
  })
}

这是入口点正在调用的 App 文件:

import React from 'react';
import Navigation from '../components/Navigation';
import { hot } from 'react-hot-loader'
import createRoutes from '../routes';

const routes = createRoutes();

const App = () => {
  return ([
    <Navigation key="app-navigation" />,
    <main style={{ height: 'calc(100% - 85px)' }} key="app-main">{routes}</main>
  ])
};

export default hot(module)(App)

这是我的 webpack 开发配置:

const devBrowserRender = {
    devtool: 'source-map',
    context: PATHS.app,
    entry: {
      app: ['babel-polyfill', 'react-hot-loader/patch',
        './index']
    },
    node,
    devServer: {
      contentBase: PATHS.assets,
      hot: true
    },
    output: {
      path: PATHS.assets,
      filename: '[name].dev.js',
      publicPath: PATHS.public
    },
    module: { rules: rules({ production: false, browser: true }) },
    resolve,
    plugins: plugins({ production: false })
  };

这是我的 JavaScript 规则:

  const presets = [["es2015", { "modules": false }], 'react', 'stage-0'];

  const plugins = production ? [
    'transform-react-remove-prop-types',
    'transform-react-constant-elements',
    'transform-react-inline-elements'
  ] : [];

  return {
    test: /\.js$|\.jsx$/,
    loader: 'babel-loader',
    options: {
      presets,
      plugins
    },
    exclude: PATHS.modules
  };

开发者插件:

  if (!production) {
    return [
      new webpack.NamedModulesPlugin(),
      new webpack.HotModuleReplacementPlugin(),
      new webpack.EnvironmentPlugin(['NODE_ENV']),
      new webpack.DefinePlugin(compileTimeConstantForMinification),
      new ExtractTextPlugin({
        filename: '[contenthash].css',
        allChunks: true
      }),
      // new webpack.optimize.UglifyJsPlugin({ compress }),
      new ManifestPlugin({
        fileName: 'manifest.json'
      })
    ];
  }

我假设这是由于对 react-hot-loader 如何工作的误解造成的,但我在文档或示例中找不到任何其他信息说明它为何不起作用。

【问题讨论】:

    标签: javascript reactjs express webpack react-hot-loader


    【解决方案1】:

    我知道配置这些东西的痛苦。

    您需要在输入部分中包含下一行

    entry: {
      app: [
        'react-hot-loader/patch',
        'webpack-dev-server/client?http://localhost:3000',
        'webpack/hot/only-dev-server',
        './index.js'
      ]
    }
    

    那么当你设置babel-loader配置时你需要添加react-hot-loader/babel

    const plugins = production ? [
      'transform-react-remove-prop-types',
      'transform-react-constant-elements',
      'transform-react-inline-elements'
    ] : ['react-hot-loader/babel'];
    

    Here我有这个功能的简单配置。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 2021-04-28
      • 2022-01-27
      • 1970-01-01
      • 2023-03-13
      • 2021-06-19
      • 2018-04-22
      • 1970-01-01
      相关资源
      最近更新 更多