问题 从Express调用React View


我找不到一个很好的最基本的例子,我可以连接一个express.js路由来调用反应视图。

到目前为止,这就是我所拥有的。

+-- app.js
+-- config
|   +-- server.js
+-- routes
|   +-- index.js
+-- views
|   +-- index.html

app.js

require('./config/server.js');
require('./routes/index.js');

配置| server.js

"use strict";
var express = require('express'),
app = express(),

routes = require('./routes');

app.set('view engine', 'html');
app.engine('html', ); // how do I tell express that JSX is my template view engine?

var port = process.env.PORT || 3000;

app.engine('handlebars', exphbs({ defaultLayout: 'main'}));
app.set('view engine', 'handlebars');


var server = app.listen(port, function(){
    console.log('Accepting connections on port ' + port + '...');
});

路线| index.js

app.get('/', function(request, response){
    // how do we call the route that will run index.html ?
    request.render('index');
});

意见| 的index.html

<!DOCTYPE html>
<html>
<head>
    <script src="build/react.js"></script>
    <script src="build/JSXTransformer.js"></script>
    <script type="text/jsx" src="build/noEpisodes.js"></script>
</head>
<body>
    <div id="noEpisodesMessage"></div>
</body>
</html>

然后我的index.htm页面以及生成的jsx。


4314
2018-04-14 18:49


起源



答案:


通常的事情是使用 反应路由器 要处理这些路线,将你的React应用程序编写为一个React应用程序(即你的所有JSX源代码都将捆绑到一个app.js文件中,该文件知道如何加载所有“页面”或“视图”)然后使用express(或Hapi或任何其他服务器进程)主要作为您的API和资产服务器,而不是您的页面/视图生成器。

然后,您可以点按您在中设置的路线 react-router 路由器对象,以便在快速方面,您可以将您的用户转发到该URL react-router 可以处理内容加载,所以你得到

  1. 用户请求site.com/lol/monkeys
  2. 表达重定向到/#/ lol / monkeys
  3. 由于路由器中的路由,您的react应用程序会加载正确的视图
  4. 可选地,您的应用程序执行history.replaceState,以便用户看到site.com/lol/monkeys(有一些反应路由器技巧可以为您执行此操作)

您还可以通过服务器端呈现自动执行大部分操作,但名称可能令人困惑:您 仍然 编写您的React应用程序,好像根本没有涉及服务器,然后依靠React的渲染机制为请求的URL完全呈现单个“页面”,这将显示所有正确的初始内容  然后加载你的应用程序并静默地将其挂回到用户正在查看的内容中,以便通过React再次处理超过初始页面加载的任何交互,并且后续导航是“假”导航(您的url栏将显示新的URL但是没有实际的网络导航会发生,React只是简单地交换内容。

一个很好的例子是 https://github.com/mhart/react-server-example


9
2018-04-14 18:59



你是什​​么意思在一个反应​​应用程序中编写react应用程序,并在app.js文件中包含jsx包? - PositiveGuy
快递不是页面浏览器/生成,所以不理解上面的那一点,请再次解释谢谢。我的意思是它有render()方法。所以你说不要使用它并使用react-router,因为它具有渲染功能 - PositiveGuy
所以,如果你不打算使用express作为页面/视图生成器,我认为这意味着我不会将app.engine设置为express,是什么呈现视图? - PositiveGuy
在浏览器中运行的React执行您的视图(除非您将应用程序编写为同构应用程序,然后express可以为它们提供服务)。这是一个“非常长的答案”,网上已经存在优秀的教程,所以我建议找到这些。给 jlong​​ster.com/Presenting-The-Most-Over-Engineered-Blog-Ever 例如,读取。 - Mike 'Pomax' Kamermans
你不接受我的问题。我在询问app.set('view engine','html'); app.engine('html',)React应该是什么?如何设置视图引擎 - PositiveGuy


答案:


通常的事情是使用 反应路由器 要处理这些路线,将你的React应用程序编写为一个React应用程序(即你的所有JSX源代码都将捆绑到一个app.js文件中,该文件知道如何加载所有“页面”或“视图”)然后使用express(或Hapi或任何其他服务器进程)主要作为您的API和资产服务器,而不是您的页面/视图生成器。

然后,您可以点按您在中设置的路线 react-router 路由器对象,以便在快速方面,您可以将您的用户转发到该URL react-router 可以处理内容加载,所以你得到

  1. 用户请求site.com/lol/monkeys
  2. 表达重定向到/#/ lol / monkeys
  3. 由于路由器中的路由,您的react应用程序会加载正确的视图
  4. 可选地,您的应用程序执行history.replaceState,以便用户看到site.com/lol/monkeys(有一些反应路由器技巧可以为您执行此操作)

您还可以通过服务器端呈现自动执行大部分操作,但名称可能令人困惑:您 仍然 编写您的React应用程序,好像根本没有涉及服务器,然后依靠React的渲染机制为请求的URL完全呈现单个“页面”,这将显示所有正确的初始内容  然后加载你的应用程序并静默地将其挂回到用户正在查看的内容中,以便通过React再次处理超过初始页面加载的任何交互,并且后续导航是“假”导航(您的url栏将显示新的URL但是没有实际的网络导航会发生,React只是简单地交换内容。

一个很好的例子是 https://github.com/mhart/react-server-example


9
2018-04-14 18:59



你是什​​么意思在一个反应​​应用程序中编写react应用程序,并在app.js文件中包含jsx包? - PositiveGuy
快递不是页面浏览器/生成,所以不理解上面的那一点,请再次解释谢谢。我的意思是它有render()方法。所以你说不要使用它并使用react-router,因为它具有渲染功能 - PositiveGuy
所以,如果你不打算使用express作为页面/视图生成器,我认为这意味着我不会将app.engine设置为express,是什么呈现视图? - PositiveGuy
在浏览器中运行的React执行您的视图(除非您将应用程序编写为同构应用程序,然后express可以为它们提供服务)。这是一个“非常长的答案”,网上已经存在优秀的教程,所以我建议找到这些。给 jlong​​ster.com/Presenting-The-Most-Over-Engineered-Blog-Ever 例如,读取。 - Mike 'Pomax' Kamermans
你不接受我的问题。我在询问app.set('view engine','html'); app.engine('html',)React应该是什么?如何设置视图引擎 - PositiveGuy


其他答案使用通常的方式使用react,以替换dom中的元素

React.render(<APP />, document);

但是如果你想在express中做出反应是你的“模板语言”,你也可以使用react来渲染一个简单的html字符串,就像这样

app.get('/', function(req, res) {
  var markup = React.renderToString(<APP />);  // <-- render the APP here
  res.send(markup);                          // <-- response with the component
});

在捆绑所有依赖项和使用jsx方面,还需要注意一些其他事项。这个简单的极简主义 教程 和这个 博客文章 帮助我更好地了解情况

请注意,本教程中的示例代码使用此语法

var markup = React.renderToString(APP());

已被弃用并将导致错误。使用它你必须更换

var APP = require('./app');

var APP = React.createFactory(require('./app'));

或者像我在第一个例子中那样渲染jsx。为了使教程工作,我可能还必须在package.json中使用更新版本的依赖项。

一旦你得到了一位鸽友 教程 显示了一种更强大的方法来使用react-engine在express中进行反应


3
2017-08-25 16:00



“教程”链接现已破裂。看起来该域已停放。 - Dawson Botsford


如果您想保持简单,可以为应用的入口点执行此操作:

路线| index.js

app.get('/', function(request, response){

    // how do we call the route that will run index.html ?
    res.sendfile('../views/index.html');
});

React会在它的render方法中定位index.html页面上的特定元素:

React.render(<Application />, document.getElementById('foo')); 

因此,如果您的javascript包含在index.html中,并且存在具有该id的元素,则会将您的应用程序注入该div。从那时起,您可以使用react-router进行所有路由,或者您可以在express中设置不同的路由并像处理index.html一样处理它们


2
2018-04-14 19:21



谢谢,我会想到res.render()但我显然还不明白那个...... - PositiveGuy
快乐,如果它解决了你的问题,请记得标记为你接受的答案...... :) - deowk
我很好奇如何在没有react-router的情况下如何做到这一点只是为了知道本地反应/表达如何工作而没有任何添加的库 - PositiveGuy
我还没有测试过,所以没有准备好标记解决了。 - PositiveGuy
怎么样设置视图引擎。我是否需要使用jsx并对expressJS做出反应? - PositiveGuy


而不是手动处理React.render,您可以使用名为react-helper的库(https://github.com/tswayne/react-helper)。它为您设置div,将您的反应组件绑定到div,允许您将属性传递到组件服务器端,如果您为节点应用程序配置了webpack或者愿意使用babel,它甚至可以处理服务器端呈现-register(不推荐用于产品)。


1
2018-04-03 20:42