2016-05-26 14 views
1

Ich versuche, Hot-Reac-Loader in meinem Projekt zu verwenden. Also habe ich einige Dateien geändert, um damit zu arbeiten, aber ich erhalte einen Fehler, wenn ich eine Komponente bearbeite.React Hot Loader 3 mit webpack-dev

Warnung: React.createElement: Typ nicht null sein sollte, nicht definiert, boolean oder Zahl. Es sollte eine Zeichenfolge (für DOM-Elemente) oder eine ReactClass (für zusammengesetzte Komponenten) sein.

[HMR] Aktualisierung nicht möglich. Müssen ein komplettes Nachladen machen!

was mache ich falsch?

webpack.config.dev.js

var webpack    = require('webpack'); 
var path     = require('path'); 
// Questo il plugin di webpack che mi genera il file index.html in dist 
var HtmlwebpackPlugin  = require('html-webpack-plugin'); 


const PATHS = { 
    app: path.join(__dirname, 'app/index'), 
    build: path.join(__dirname, 'dist') 
}; 

module.exports = { 
    devtool: 'eval', 
    entry: [ 
    'webpack-dev-server/client?http://localhost:3500', 
    'webpack/hot/only-dev-server', 
    'react-hot-loader/patch', 
    PATHS.app 
    ], 
    output: { 
     path: PATHS.build, 
     filename: 'js/bundle.js' 
    }, 
    // Questo serve a non specificare le estensioni 
    resolve: { 
     extensions: ['', '.js'] 
    }, 
    module: { 
     loaders: [ 
      { 
       test: /\.js$/, 
       loader: 'babel', 
       exclude: /node_modules/ 
      }, 
      { test: /\.(png|jpg)$/, loader: "file?limit=1000&name=images/[hash].[ext]" }, 
      { test: /\.scss$/, loaders: [ 'style','css?modules&importLoaders=1&localIdentName=[path]___[name]__[local]___[hash:base64:5]' ] } 
     ] 
    }, 
    // Porta utilizzata da webpack-dev-server 
    devServer: { 
     port: 3500 
    }, 
    plugins: [ 
    new webpack.HotModuleReplacementPlugin(), 
     new HtmlwebpackPlugin({ 
      title: 'React Starter Kit', 
      hash: true, 
      inject: false, 
      appMountId: 'app', 
      template: 'jade!./app/assets/index.jade' 
     }) 
    ] 
}; 

server.js

var webpack = require('webpack'); 
var WebpackDevServer = require('webpack-dev-server'); 
var config = require('./webpack.config.dev'); 

new WebpackDevServer(webpack(config), { 
    hot: true, 
    historyApiFallback: true, 
    stats: { 
    colors: true 
    } 
}).listen(3500, 'localhost', function (err) { 
    if (err) { 
    console.log(err); 
    } 
    console.log('Listening at localhost:3500'); 
}); 

index.js

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

const root = document.getElementById('app'); 

ReactDOM.render(
    <AppContainer> 
    <App /> 
    </AppContainer> 
    , root); 

if (module.hot) { 
    module.hot.accept('./app',() => { 
    const App = require('./app'); 

    ReactDOM.render(
     <AppContainer> 
     <App /> 
     </AppContainer> 
    , root); 
    }); 
} 

app.js

import React from 'react'; 
import { Router, browserHistory } from 'react-router'; 
import routes from './routes/routes'; 

const App =() => (
    <Router history={browserHistory} routes={routes} /> 
); 

export default App; 
+0

Was ändern Sie, wenn Sie versuchen, zu bearbeiten? – hansn

+0

Nur ein Absatz. Das ist mein Repo -> https://github.com/sarovin/React-Starter/tree/hot-reload – SaroVin

+0

Zumindest fehlen Sie react-hot-loader – hansn

Antwort

3

Sie müssen die Prototyp-Kette der Router-Komponente selbst modifizieren, um das Rendern des neuen Materials zu erzwingen.

// Router 
import { Router, browserHistory } from 'react-router' 

if (process.env.NODE_ENV === 'production') { 
    // ... 
} else { 
    // the hacky workaround 
    Router.prototype.componentWillReceiveProps = function (nextProps) { 
    let components = []; 
    function grabComponents(routes) { 
     routes.forEach((route) => { 
     if (route.component) { 
      components.push(route.component) 
     } 
     if (route.indexRoute && route.indexRoute.component) { 
      components.push(route.indexRoute.component) 
     } 
     if (route.childRoutes) { 
      grabComponents(route.childRoutes) 
     } 
     }) 
    } 
    grabComponents(nextProps.routes) 
    components.forEach(React.createElement) // force patching 
    } 
} 

Der Code, den Sie hier sehen, ist eine Adaption von https://github.com/gaearon/react-hot-boilerplate/pull/61#issuecomment-211504531