2016-05-27 13 views
0

Ich bekomme immer Fehler nach der Kompilierung: can't find variable: exports.Wie kann ich reagieren, um mit Babel und Gulp zu arbeiten?

Hier sind meine Dateien.

Gulpfile.js

var gulp = require('gulp'); 
var babel = require('gulp-babel'); 

gulp.task('react', function() { 
    gulp.src('./resources/components/*.jsx') 
     .pipe(babel({presets: ['react', 'es2015']})) 
     .pipe(gulp.dest('./public/js')); 
}); 

gulp.task('default', ['react']); 

./resources/components/HelloWorld.jsx

import React, {PropTypes, Component} from 'react' 

export default class HelloWorld extends Component { 

    constructor (props) { 
     super(props) 
    } 

    render() { 
     return (
      <table> 
       <tr> 
        <th>Title</th> 
        <th>Description</th> 
        <th>Actions</th> 
       </tr> 

       <tr> 
        <td>Hello World</td> 
        <td>Loren ipsum</td> 
        <td>Delete | Update</td> 
       </tr> 
      </table> 
     ); 
    } 

} 

ReactDOM.render(<HelloWorld/>, document.getElementById('main')); 

index.html

<!doctype html> 
<html> 
<head> 
<title>Crossover - Project</title> 
<meta charset="utf-8"> 
</head> 

<body> 

    <main id="main"></main> 
    <script src="./js/HelloWorld.js"></script> 

</body> 
</html> 

Ich weiß nicht, was ich tue, falsch Hier. Hier ist die Ausgabe.

HelloWorld.js

'use strict'; 

Object.defineProperty(exports, "__esModule", { 
    value: true 
}); 

var _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 

var _react = require('react'); 

var _react2 = _interopRequireDefault(_react); 

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 

var HelloWorld = function (_Component) { 
    _inherits(HelloWorld, _Component); 

    function HelloWorld(props) { 
    _classCallCheck(this, HelloWorld); 

    return _possibleConstructorReturn(this, Object.getPrototypeOf(HelloWorld).call(this, props)); 
    } 

    _createClass(HelloWorld, [{ 
    key: 'render', 
    value: function render() { 
     return _react2.default.createElement(
     'table', 
     null, 
     _react2.default.createElement(
      'tr', 
      null, 
      _react2.default.createElement(
      'th', 
      null, 
      'Title' 
     ), 
      _react2.default.createElement(
      'th', 
      null, 
      'Description' 
     ), 
      _react2.default.createElement(
      'th', 
      null, 
      'Actions' 
     ) 
     ), 
     _react2.default.createElement(
      'tr', 
      null, 
      _react2.default.createElement(
      'td', 
      null, 
      'Hello World' 
     ), 
      _react2.default.createElement(
      'td', 
      null, 
      'Loren ipsum' 
     ), 
      _react2.default.createElement(
      'td', 
      null, 
      'Delete | Update' 
     ) 
     ) 
    ); 
    } 
    }]); 

    return HelloWorld; 
}(_react.Component); 

// this is where the error occurs 
exports.default = HelloWorld; 


ReactDOM.render(_react2.default.createElement(HelloWorld, null), document.getElementById('main')); 

Ich bin sehr neu zu reagieren und ich will nicht webpack verwenden, da ich bereits einen Webserver + Rahmen laufen haben und ich möchte reagieren in meine Anwendung integrieren.

Antwort

2

Das Problem ist, dass Sie HelloWorld.js sind inklusive wie im HTML ist:

<script src="./js/HelloWorld.js"></script> 

Aber der Browser hat keine Kenntnis von exports und Common-js Modul Merkmale und daher keine Exporte Variable schafft. Dieser Code wird im Browser ausgeführt, nicht in der node.js-Umgebung.

EDIT:

Also, ich weiß nicht, ob dies der richtige Ort ist, aber ich werde versuchen, ein paar Punkte zu machen, so dass Sie werden so schnell wie möglich zu beschleunigen.

1) ES6 ist eine Spezifikation, und die wichtigsten Browser-Anbieter haben einige davon implementiert, aber nicht alle. Wenn Sie also Ihren Code mit ES6 (AKA ES2015) schreiben möchten, sollten Sie heutzutage einen Transpiler verwenden, um sicherzustellen, dass Ihr Code in jedem Browser korrekt analysiert und ausgeführt wird. Der beste Transpiler ist Babel, wie Sie zu wissen scheinen. Plus Babel kann JSX-Code transpilieren, den Sie verwenden sollten, wenn Sie React verwenden (beachten Sie, dass JSX nichts mit ES6 zu tun hat);

2) Da Sie einen Transpiler verwenden, haben Sie , um Ihren ES6-Code bei jeder Änderung zu transpilieren, die Sie machen, um das Ergebnis zu sehen;

3) Gulp ist ein Knotenmodul und ein wunderbares Werkzeug, um Ihr Buildsystem zu automatisieren: Beobachten Sie Ihren Code für Änderungen, übertragen Sie Ihren Code bei jeder Änderung, führen Sie einen lokalen Server (wie Sie scheinen) und so viele andere Dinge;

4) Sie können Webpack in Verbindung mit Schluck verwenden. Obwohl ich nur die Verwendung von npm-Skripten und Webpacks empfehle, können Sie dies problemlos tun: integrieren Sie webpack zunächst in Ihr vorhandenes Build-System und versuchen Sie in Zukunft, Ihre Schluck-Tasks durch Webpack- und npm-Skripte zu ersetzen, sobald Sie Webpack kennen besser.

Zusammenfassung:

"[Node] ES6, Babel, Gulp, und Reagieren zusammenarbeiten kann" auf diese Weise:

  • installieren und zu verwenden Knoten in der Lage sein zu installieren und zu verwenden schluck
  • Installieren und schluck benutzen, um Ihre Datei für Änderung Install
  • zu beobachten reagieren, reagieren-dom, babel und sein Modul ES2015 und JSX, und schreiben Sie Ihren Code mit ES6 Funktionen und JSX reagieren
  • Verwenden schluck Ihre ES6/JSX Code und verketten sie in einer einzigen Datei transpile und Ihren Webserver (und optional Browser-Sync ;-))

Ich hoffe, dass ich klarer im Kopf machte die Dinge zu laufen.

Vielleicht könnten Sie in diesem GitHub Projekt aussehen und Blick auf den Zweigen: https://github.com/laruiss/front-boilerplate

+0

Mein Verständnis ist, dass Knotenumgebung eine einzelne JS-Datei in ES5 erstellen muss, dass der Browser analysieren kann. Wie erstelle ich diese Datei? Ich möchte es mit Gulp und vielleicht Node machen, aber nicht so etwas wie Webpack benutzen. Ich möchte, dass die Reaktionsdateien statisch sind, anstatt dass der Knoten sie jedes Mal erzeugt. Ich verstehe wirklich nicht, wie ES6, Babel, Gulp und React zusammenarbeiten können. – Gasim

+0

Haben Sie meinen bearbeiteten Post gesehen? – laruiss

+0

Ich habe gerade getan und danke! Nach vielen Recherchen habe ich React wirklich verstanden und Ihre Bearbeitung hat mich dazu gebracht, eine Menge Dinge zu klären. Eine Sache, die mir auffiel, war, dass React nicht gut mit Schluck funktioniert. Also, zuerst habe ich versucht, browserify zu verwenden, aber es war langsam. Jetzt habe ich wieder angefangen, Webpack zu benutzen, weil es wirklich großartig für die Entwicklungsumgebung ist. – Gasim