2017-02-21 3 views
0

Warum bekomme ich diesen Fehler in der Konsole des Chroms?React + Webpack: React.createElement: Typ sollte nicht null, undefined, boolean oder Nummer sein

Mein Code:

index.html

<!DOCTYPE html> 
<html> 
<head> 
<title>hello React</title> 
<meta charset="utf-8"> 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
</head> 
<body> 
<div id="root"> 
<!-- my app renders here --> 
</div> 

    <script src="../react-15.3.1/build/react.js"></script> 
    <script src="../react-15.3.1/build/react-dom.js"></script> 
    <script src="./dist/bundle.js"></script> 
</body> 
</html> 

main.js

import SalutaMondo from './salutamondo'; 

var UnaProva = React.createClass({ 

    render: function(){ 
     return (
     <div> 
      <SalutaMondo/> 
      <div>Ciao Emiliano</div> 
     </div> 
    ); 
    }, 

}); 

ReactDOM.render(<UnaProva />, document.getElementById("root")); 

salutamondo.js

var SalutaMondo = React.createClass({ 
     render: function(){ 
      return (
      <h1>Hello World</h1> 
     ); 

     } 


    }); 

module.export = SalutaMondo; 

webpack.config.js

const webpack = require('webpack') 
const path = require('path') 

module.exports = { 
    entry: [ './src/salutamondo.js', './src/main.js' ], 
    output: { 
    path: path.resolve(__dirname, 'dist'), 
    filename: 'bundle.js' 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /\.js?$/, 
     exclude: /node_modules/,   
     loader: 'babel-loader', 
     query: { 
      presets: ['react', 'es2015'] 
     } 
     } 
    ] 
    } 
} 
+0

Warum haben Sie zwei Einstiegspunkte? Warum benutzen Sie 'module.exports' von einem Ort und' importieren' von einem anderen? Solltest du nicht einfach 'export var SalutaMondo = ...' verwenden? –

Antwort

1

In Ihrer Webpack-Konfiguration verwenden Sie die babel-loader. Dies bedeutet, dass Sie Module im ES6-Stil verwenden. In salutamondo.js verwenden Sie CommonJS-Stilmodule. Daher nimmt das babel-loader das Modul nicht ab. Können Sie versuchen:

export default SalutaMondo; 

statt:

module.export = SalutaMondo; 
+0

Also sollte ich React.Component statt React.createClass auch erweitern? – xRobot

+1

Sie können beides tun, es hängt davon ab, welche Art von Stil Sie bevorzugen, ich verwende in der Regel React.createClass, da es keinen zusätzlichen Bloat von babel zieht. Aus der Dokumentation: "Wenn Sie ES6 noch nicht verwenden, können Sie stattdessen den Helper React.createClass verwenden." https://facebook.github.io/react/docs/react-component.html – pieceOpiland

+1

@xRobot Diese Seite enthält weitere Informationen zu den Unterschieden zwischen der Verwendung von Reagieren mit und ohne ES6: https://facebook.github.io/react/ docs/react-without-es6.html – pieceOpiland

1

Dies aufgrund salutamondo.js mit Commonjs Modulformat wahrscheinlich ist, während main.js ist ECMAScript-Modul. Ich empfehle, alles in ECMAScript-Modulen zu halten:

var SalutaMondo = React.createClass({ 
     render: function(){ 
      return (
      <h1>Hello World</h1> 
     ); 

     } 


    }); 

export default SalutaMondo; 
+0

Also sollte ich React.Component erweitern anstatt React.createClass zu verwenden? – xRobot

+1

@xRobot ja, vorzugsweise. 'createClass' wird in [Reagate 15.5] (https://github.com/facebook/react/issues/8854) [veraltet] sein. – Pavlo

Verwandte Themen