使用 Babelify 编译 React 导致 React Router 未定义

Using Babelify to compile React results in React Router being undefined

我正在使用 Gulp 作为我的构建系统,使用 Browserify 来编译我的 JS。我一直在使用 Reactify 进行 JSX 编译,但我想我应该切换到 Babelify 以获得一些额外的 ES2015 功能。编译时没有抛出任何错误,但是当我在浏览器中加载我的站点时,我的 JS 控制台出现以下错误:

Uncaught ReferenceError: Router is not defined

错误所指的行是:

var React = require('react');

在页面上加载的主要组件文件中。

我导入 React Router 的地方在我的 App.jsx 文件(这是应用程序的入口点)和我的 routes.jsx 文件中,我在其中定义路由:

App.jsx

var React  = require('react'),
    Router = require('react-router'),
    routes = require('./routes.jsx');

Router.run(routes, function(Handler, state) {

    var routeClasses = '';
    for (var i = 1; i < state.routes.length; i++) {
        routeClasses += state.routes[i].name + ' ';
    }

  React.render(<Handler classes={routeClasses.trim()} />, document.getElementById('root'));
});

routes.jsx

var React        = require('react');
    Router       = require('react-router'),
    Route        = Router.Route,
    DefaultRoute = Router.DefaultRoute,
    App          = require('./_layout/App.jsx'),
    Editor       = require('./editor/Editor.jsx');

module.exports = (
  <Route name="app" path="/" handler={App}>
    <DefaultRoute name="editor" handler={Editor} />
  </Route>
);

使用 Reactify 而不是 Babelify 时一切正常。我在构建过程中使用 Gulp:

gulp.task('js', function() {
  var browserify = require('browserify'),
      watchify   = require('watchify'),
      minifyify  = require('minifyify'),
      babelify   = require('babelify');

  function bundle() {
    b.bundle()
      .on('error', function(error){
        gutil.log(error);
      })
      .pipe(source('app.js'))
      .pipe(gulp.dest(paths.client.js.build))
      .pipe(gulpif(!isStartup, browserSync.stream()));

    isStartup = false;
  }

  var map = isProd ? false : 'app.map.json';

  var b = browserify({
    cache: {},
    packageCache: {},
    entries: paths.client.js.dev,
    debug: true,
    plugin: [watchify]
  })
  .transform(babelify, {presets: ['es2015', 'react']})

  .plugin('minifyify', {
    map: map,
    output: paths.client.js.build + 'app.map.json',
  });

  b.on('update', function(){
    bundle();
  });

  b.on('log', gutil.log); // output build logs to terminal
  bundle();
});

工作版本,使用 Reactify,简单地省略 .transform(babelify...) 行并添加 transform: reactifybrowserify() 初始化代码,即

  var b = browserify({
    cache: {},
    packageCache: {},
    entries: paths.client.js.dev,
    debug: true,
    transform: reactify,
    plugin: [watchify]
  });

它使用 es2015 import X from Y 语法,例如

import React from 'react'