【问题标题】:react-hot-loader: React.createElement: type is invalid -- expected a string error updating the screenreact-hot-loader: React.createElement: type is invalid - 预期更新屏幕时出现字符串错误
【发布时间】:2017-09-01 00:12:46
【问题描述】:

我正在尝试使用 rect-redux-universal-hot-example 构建一个同构的 ReactJS 应用程序样板。

我正在使用 react-hot-loader 进行热模块重新加载 (hmr)。

一旦我更改了一些应用程序组件数据,我在浏览器中的页面不会自动重新加载。我在浏览器中收到以下错误:

    [HMR] connected
main-32cd5038bd66f14eeceb.js:12141 [HMR] bundle rebuilding
main-32cd5038bd66f14eeceb.js:12149 [HMR] bundle rebuilt in 530ms
main-32cd5038bd66f14eeceb.js:30888 [HMR] Checking for updates on the server...
main-32cd5038bd66f14eeceb.js:1000 Warning: React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in.
printWarning @ main-32cd5038bd66f14eeceb.js:1000
main-32cd5038bd66f14eeceb.js:30976 [HMR] Cannot check for update (Full reload needed)
handleError @ main-32cd5038bd66f14eeceb.js:30976
main-32cd5038bd66f14eeceb.js:30977 [HMR] Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in.
    at invariant (http://localhost:3001/dist/main-32cd5038bd66f14eeceb.js:946:15)
    at ReactCompositeComponentWrapper.instantiateReactComponent [as _instantiateReactComponent] (http://localhost:3001/dist/main-32cd5038bd66f14eeceb.js:11215:55)
    at ReactCompositeComponentWrapper._updateRenderedComponent (http://localhost:3001/dist/main-32cd5038bd66f14eeceb.js:19852:24)
    at ReactCompositeComponentWrapper._performComponentUpdate (http://localhost:3001/dist/main-32cd5038bd66f14eeceb.js:19815:10)
    at ReactCompositeComponentWrapper.updateComponent (http://localhost:3001/dist/main-32cd5038bd66f14eeceb.js:19736:12)
    at ReactCompositeComponentWrapper.receiveComponent (http://localhost:3001/dist/main-32cd5038bd66f14eeceb.js:19638:10)
    at Object.receiveComponent (http://localhost:3001/dist/main-32cd5038bd66f14eeceb.js:3479:22)
    at ReactCompositeComponentWrapper._updateRenderedComponent (http://localhost:3001/dist/main-32cd5038bd66f14eeceb.js:19845:23)
    at ReactCompositeComponentWrapper._performComponentUpdate (http://localhost:3001/dist/main-32cd5038bd66f14eeceb.js:19815:10)
    at ReactCompositeComponentWrapper.updateComponent (http://localhost:3001/dist/main-32cd5038bd66f14eeceb.js:19736:12)
handleError @ main-32cd5038bd66f14eeceb.js:30977
main-32cd5038bd66f14eeceb.js:946 Uncaught (in promise) Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in.
    at invariant (main-32cd5038bd66f14eeceb.js:946)
    at ReactCompositeComponentWrapper.instantiateReactComponent [as _instantiateReactComponent] (main-32cd5038bd66f14eeceb.js:11215)
    at ReactCompositeComponentWrapper._updateRenderedComponent (main-32cd5038bd66f14eeceb.js:19852)
    at ReactCompositeComponentWrapper._performComponentUpdate (main-32cd5038bd66f14eeceb.js:19815)
    at ReactCompositeComponentWrapper.updateComponent (main-32cd5038bd66f14eeceb.js:19736)
    at ReactCompositeComponentWrapper.receiveComponent (main-32cd5038bd66f14eeceb.js:19638)
    at Object.receiveComponent (main-32cd5038bd66f14eeceb.js:3479)
    at ReactCompositeComponentWrapper._updateRenderedComponent (main-32cd5038bd66f14eeceb.js:19845)
    at ReactCompositeComponentWrapper._performComponentUpdate (main-32cd5038bd66f14eeceb.js:19815)
    at ReactCompositeComponentWrapper.updateComponent (main-32cd5038bd66f14eeceb.js:19736)

这是我的设置:

.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/app';

const NextApp = require('./component/App/app').default;

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

const render = (Component) => {
  ReactDOM.render(
    <AppContainer>
      <Component />
    </AppContainer>,
    dest
  );
};

render(App);

console.log('MODULE HOT:');
console.log(module.hot);

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

** 应用程序**

    import React from 'react';

const App = () => (

        <div className="wrapper">
            <h1>This is my App!!!!</h1>
        </div>

);

export default 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',
      'webpack-hot-middleware/client?path=http://' + host + ':' + port + '/__webpack_hmr',
      './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()
  ]
};

我不知道在哪里找到错误,因为我不太习惯使用 HMR。帮助表示赞赏。

【问题讨论】:

    标签: javascript reactjs react-hot-loader


    【解决方案1】:

    现在在控制台中我们看到一个错误突然出现,因为 AppContainer.dev 正在尝试渲染 Redbox 模块导出,但由于 babelification 组件位于 .default 并且 AppContainer 正在使用 require()。在此处输入代码

    我的临时修复:

    const mount = document.getElementById('app');
    
    render(
      <AppContainer errorReporter={({ error }) => {throw error}}>
        <App store={store} />
      </AppContainer>,
      mount
    );
    

    【讨论】:

      猜你喜欢
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 2018-04-17
      • 2017-06-03
      • 2019-09-12
      • 2020-04-23
      相关资源
      最近更新 更多