【问题标题】:Using reactjs with requirejs将 reactjs 与 requirejs 一起使用
【发布时间】:2023-04-09 23:00:01
【问题描述】:

最近,我开始使用reactjs 和backbonejs 路由器来构建应用程序。

我通常使用 requirejs 进行依赖和代码管理。但是,当我尝试包含包含 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?
  • 这完全取决于您。 JSX 让生活更轻松,但您仍然可以使用 JS 语法组件。在这里阅读:facebook.github.io/react/docs/…
  • 你也不妨调用 return new Backbone.Router

标签: javascript requirejs frontend reactjs


【解决方案1】:

所以我自己想通了。

我从这个 repo 获得了必要的文件和说明:jsx-requirejs-plugin。

一旦我有了jsx plugin 和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'));
   ...
});

我还可以使用相同的代码访问具有jsx 语法的.js 文件:

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

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

希望对你有帮助。

【讨论】:

  • 对“我也可以使用相同的代码访问其中包含 jsx 语法的 .js 文件:”下的代码 sn-p 有点困惑。它与上面的相同。我发现如果我在 require 模块中使用 JSX,我也需要将同一个模块制作为 jsx 文件(并像你说的那样使用 jsx 插件加载)。您能否更新您的示例,以便更清楚地了解您如何组织 your 代码,而不仅仅是 react/jsx 代码。例如,您的 Timer 模块是什么样的?你给使用 Timer 的模块起什么名字,它是如何被 require 加载的?
  • 在第一个实例中,假定Timer 使用jsx 语法并具有.jsx 扩展名。在第二种情况下,虽然代码相同,但假设Timer 再次包含jsx 语法但具有.js 扩展名。
  • 不起作用,requirejs 没有下载没有错误或 404 的文件。
  • 这个答案适合 2018 年吗?在 2016 年之后,我找不到通过 requirejs 加载 React 的推荐方式。
【解决方案2】:

React 工具(包括 JSX)已被弃用,取而代之的是 Babel (https://facebook.github.io/react/blog/2015/06/12/deprecating-jstransform-and-react-tools.html)。如果没有“转译”步骤,我找不到办法做到这一点,所以这是我的 grunt 解决方案。

您可以安装 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 任务列表中即可:

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

Babel 会将你的 JSX 转换为 JS 文件,这些文件可以指定为 RequireJS 依赖项,无需额外配置。

【讨论】:

  • 谢谢你的咕噜声,我已经实现了相同的东西,但是在我的 jsx 代码被混淆后,浏览器会抛出 requirejs not available 错误。你能提出一些解决方案吗?
猜你喜欢
  • 2014-10-06
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多