将reactjs与requirejs一起使用


71

最近,我开始reactjsbackbonejs路由器一起使用来构建应用程序。

我通常将userequirejs用于依赖关系和代码管理。但是,当我尝试包含包含jsx语法的文件时会出现问题。

这是我目前所拥有的router.js

define(["backbone", "react"], function(Backbone, React) {

  var IndexComponent = React.createClass({
    render : function() {
      return (
        <div>
        Some Stuff goes here
        </div>
        );
    }
  });



  return Backbone.Router.extend({
    routes : {
      "": "index"
    },
    index : function() {
      React.renderComponent(<IndexComponent />, document.getElementById('index'));
    }
  });
});

如何将IndexComponent放在其自己的文件中并在此文件中调用它?我尝试了通常的方法(与骨干和反应相同),但是由于jsx语法错误。


问题-您需要使用JSX还是可以在应用程序中直接使用JS?
亚历山大·米尔斯

1
这完全取决于您。JSX使生活更轻松,但是您仍然可以使用JS语法组件。阅读在这里:facebook.github.io/react/docs/...
myusuf

您可能还希望致电return new Backbone.Router
Alexander Mills

Answers:


102

所以我自己弄清楚了。

我从此存储库中获得了必要的文件和说明:jsx-requirejs-plugin

有一次 jsx插件JSXTransformer的修改版本,按照存储库中的说明更改了代码:

require.config({
  // ...

  paths: {
    "react": "path/to/react",
    "JSXTransformer": "path/to/JSXTransformer",
    "jsx": "path/to/jsx plugin"
    ...
  }

  // ...
});

然后,我可以通过jsx!插件语法引用JSX文件。例如,要加载组件目录中的Timer.jsx文件,请执行以下操作:

require(['react', 'jsx!components/Timer'], function (React, Timer) {
   ...
   React.renderComponent(<Timer />, document.getElementById('timer'));
   ...
});

我也可以访问 .jsjsx使用相同的代码其中包含语法的文件:

require(['react', 'jsx!components/Timer'], function (React, Timer) {
   ...
   React.renderComponent(<Timer />, document.getElementById('timer'));
   ...
});

另外,我不需要/** @jsx React.DOM */使用jsx语法将文件放在顶部。

希望能帮助到你。


2
在“我也可以使用相同的代码访问其中具有jsx语法的.js文件:”下的代码片段有点困惑。与上面的相同。我发现,如果我在require模块中使用JSX,我也需要将该相同的模块制作为jsx文件(并使用jsx插件进行加载,如您所说)。您可以更新您的样本是有点您如何组织更清晰代码,而不是仅仅作出反应/ JSX代码。例如,您的Timer模块是什么样的?您给使用Timer的模块起什么名字,以及如何加载require?
killthrush 2015年

1
在第一种情况下,假定Timer使用jsx语法并具有.jsx扩展名。在第二种情况下,尽管代码相同,但仍假定Timer再次包含jsx语法但具有.js扩展名。
myusuf

不起作用,requirejs不会下载没有错误或404的文件。
RoninCoder '16

这个答案适合2018年吗?我找不到在2016
。– elimisteve

3

不赞成使用React工具(包括JSX)以支持Babel(https://facebook.github.io/react/blog/2015/06/12/deprecating-jstransform-and-react-tools.html)。没有“转换”步骤,我找不到解决方法,因此这是我的解决之道。

您可以安装grunt-babel(npm install grunt-babel)并配置如下任务:

babel: {
    options: {
        sourceMap: false,
        modules: "common"
    },
    dist: {
        files: [{
            expand: true,
            src: ['js/components/*.jsx'],
            dest: 'dist',
            ext:'.js'
       }]
    }
}

只需将其添加到您的任务列表即可:

grunt.registerTask('default', ['clean', 'copy', 'babel', 'http-server']);

Babel会将您的JSX转换为可以指定为RequireJS依赖项的JS文件,而无需进行其他配置。


谢谢你的抱怨,我已经实现了相同的东西,但是在我的jsx代码被破坏后,浏览器会抛出requirejs不可用的错误。您能提出一些解决方案吗?
sg28 '18 -4-4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.