如何让React与Babel和Gulp合作?

时间:2016-05-27 12:42:58

标签: javascript reactjs gulp babeljs

编译后我一直收到错误:can't find variable: exports

这是我的档案。

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']);

./资源/组件/ 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>

我不知道我在这里做错了什么。这是输出。

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'));

我很反应,我不想使用webpack,因为我已经运行了一个webserver +框架,我希望将反应集成到我的应用程序中。

1 个答案:

答案 0 :(得分:2)

问题是您在HTML中包含HelloWorld.js

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

但浏览器不了解exports和common-js模块功能,因此不会创建导出变量。此代码在浏览器中执行,而不是在node.js环境中执行。

修改

所以,我不知道这是不是正确的地方,但我会尝试提出一些观点,以便你尽快达到目标。

1)ES6是一个规范,主要的浏览器供应商已经实现了一些,但不是全部。因此,如果您要使用ES6(AKA ES2015)编写代码,就像任何人应该的那样,现在,您应该使用一个转换器来确保您的代码将在每个浏览器中正确解析和执行。你似乎知道,最好的转发器是Babel。加上Babel可以转换JSX代码,如果你使用React你应该使用它(注意JSX与ES6无关);

2)由于你使用了一个转换器,你来根据你所做的每一次改变来转换你的ES6代码以查看结果;

3)Gulp是一个节点模块,是一个自动化构建系统的绝佳工具:观察代码进行更改,在每次更改时转换代码,运行本地服务器(如您所知),还有很多其他的东西;

4)您可以将webpack与gulp结合使用。即使我建议只使用npm脚本和webpack,你也可以顺利地做到这一点:现在将webpack集成到你现有的构建系统中,并尝试将来用webpack和npm脚本逐步替换你的gulp任务,当你了解webpack时更好。

要点:

“[Node,] ES6,Babel,Gulp和React可以一起工作”

  • 安装并使用节点以便能够安装和使用gulp
  • 安装并使用gulp来监视您的文件以进行更改
  • 安装react,react-dom,babel及其模块ES2015和JSX,并用ES6功能和JSX编写反应代码
  • 使用gulp转换您的ES6 / JSX代码并将其连接到一个文件中,并运行您的网络服务器(以及可选的浏览器同步;-))

我希望我在你的脑海里让事情更清楚。

也许您可以查看这个github项目并查看分支:https://github.com/laruiss/front-boilerplate