【问题标题】:React, ES6 compiling with Browserify, babel and gulp, issue importing componentsReact、ES6 使用 Browserify、babel 和 gulp 编译,导入组件问题
【发布时间】:2016-01-18 05:53:41
【问题描述】:

我正在使用 ES6、Gulp 和 Browserify,我正在设置我的环境的第一步。

这是我的browserify task

gulp.task('client', cb => {
return browserify({
        entries: paths.publicEntries, 
        extensions: ['.jsx'], 
        debug: true
    })
    .transform('babelify', {
        presets: ['es2015', 'react']
    })
    .bundle()
    .pipe(source(paths.bundle))
    .pipe(gulp.dest(paths.bundleDest));
});

这是可能的主脚本index.jsx

'use strict';

import React from 'react';
import ReactDOM from 'react-dom';
import TestPage from './components/test';

(() => {
  ReactDOM.render(
    <TestPage/>,
    document.getElementById('mainContainer')
  );
})();

这是我创建的组件test.jsx

'use strict';

import React from 'react';

class TestPage extends React.Component {
  render()
  {
    return <h1> Hello World! </h1>
  }
}

export default TestPage;

在我看来一切都是正确的,但是使用 index.jsx 中的 import 语句会出现奇怪的行为(我不完全知道问题出在哪里)。

为了确定什么有效,什么无效,我将组件的导入替换为实际代码,如下所示:

'use strict';

import React from 'react';
import ReactDOM from 'react-dom';
//import TestPage from './components/test';

class TestPage extends React.Component {
  render()
  {
    return <h1> Hello World! </h1>
  }
}

(() => {
  ReactDOM.render(
    <TestPage/>,
    document.getElementById('mainContainer')
  );
})();

这里一切正常,但如果我使用标准的 import 语句,我什么也得不到:

注意:

  • ./component/test.jsx./index.jsx 已正确加载。
  • 我在运行 gulp 时没有任何错误。
  • reactreact-dom 模块正在运行。
  • 我尝试使用另一条路由到我的组件 ./public/js/component/test.jsx,但是在运行我的 gulp 任务 Error: Cannot find module './public/js/components/test' from '/Users/myuser/project/public/js' 时出现错误,这意味着它正在像现在一样找到正确的模块,但不在浏览器中。
  • 尝试使用和不使用.jsx 扩展名,情况相同。

如果有人想深入了解这里的 repo: https://github.com/nramirez/gulp_browserify_es6_babel_react

为了正确导入我的组件,我缺少什么?

【问题讨论】:

  • 请在问题中包含代码。
  • @loganfsmyth 我用更多代码细节更新了我的问题,无论如何,我留下了完整要点的链接以获得更广泛的视野。
  • 您的屏幕截图确实显示了控制台错误。不相关?
  • 那你应该看看聊天记录

标签: reactjs gulp browserify babeljs


【解决方案1】:

您正在gulpfile.babel.js 中为您的应用创建多个入口点(基本上,您正在创建两个捆绑包)。

const paths = {
  src: './src',
  publicSrc: './public/js',
  dest: './app',
  bundle: 'bundle.js',
  bundleDest: './app/public/js',
  publicEntries: [
    './public/js/index',
    './public/js/components/test' <--- Remove this line.
  ]
};

【讨论】:

  • 不错!谢谢,它正在工作,但我现在真的很困惑,我不应该传递我假装用于浏览器的所有条目?
  • 不,Browserify 会遍历你所有的 require 调用(Babel 将 import ... 转换为 require)并在生成捆绑包时将它们拼凑在一起。仅当您希望有一个用于 url /x 的包和另一个用于 /y 的包时,才使用多个入口点。
  • 不错!明白了!谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 2016-01-26
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多