gpt4 book ai didi

express - 使用 React-Engine 和 Express 将服务器端变量传递到客户端

转载 作者:行者123 更新时间:2023-12-03 13:16:45 24 4
gpt4 key购买 nike

我对 React/React-Engine 相当陌生。我在服务器端有一个配置,我需要将某些值传递给客户端,但是我依赖于 NODE_ENV 才能获得正确的配置。

var config = {
local: { ... }
production: { ...}
}

module.exports = config[process.env.NODE_ENV]

这在服务器端工作得很好,但是因为我需要在客户端引用这些对象中包含的一些值,所以我不能 require(./config);在我的 React JSX 中。

有什么简单的方法可以将这些东西传递到 React 中吗?归根结底,如果我能以某种方式将“配置”直接传递到 React 中,而不必担心客户端的 NODE_ENV,我会很高兴。

谢谢

最佳答案

在渲染之前将数据从服务器传递到客户端的最常见方法是将其嵌入到 React 渲染页面上的全局 JavaScript 变量中。

例如,在中间件中,您实际上正在渲染一些模板,其中包括您的 <script>使用 React 应用程序标记,您可以添加信息并将其抓取到模板上:

var config = require('../config-from-somewhere');
app.get('/', function (req, res) {
res.render('index', {config: JSON.stringify(config)});
});

还有一个 mustache 模板示例:

<html>
<body>
<script>
window.CONFIG = JSON.parse({{{config}}});
</script>
<script src="my-react-app.js"/>
</body>
</html>

但是显然react-engine已经提供了自己的方式来发送数据做客户端:

Data for component rendering

The actual data that gets fed into the component for rendering is the renderOptions object that express generates.

https://github.com/paypal/react-engine#data-for-component-rendering

正如您在 this example 中看到的那样,movies json 只是被传递到渲染中:

app.get('*', function(req, res) {
res.render(req.url, {
movies: require('./movies.json')
});
});

然后,借助框架的魔力,可能会在 this line 上,为您的组件提供信息,然后 List使用 props.movies 中的它.

module.exports = React.createClass({
displayName: 'List',

render: function render() {
return (
<div id='list'>
<h1>Movies</h1>
<h6>Click on a movie to see the details</h6>
<ul>
{this.props.movies.map(function(movie) {
return (
<li key={movie.id}>
<Router.Link to={'/movie/' + movie.id}>
<img src={movie.image} alt={movie.title} />
</Router.Link>
</li>
);
})}

</ul>
</div>
);
}
});

所以,基本上添加您的 config到您的渲染调用,它应该在您的组件的 props 中可用.

对于非常好奇的人:

确实如此,正如我们在 this line onwards 上看到的那样,引擎合并renderOptionsres.locals最后将其传递给 React。

// create the data object that will be fed into the React render method.
// Data is a mash of the express' `render options` and `res.locals`
// and meta info about `react-engine`
var data = merge({
__meta: {
// get just the relative path for view file name
view: null,
markupId: Config.client.markupId
}
}, omit(options, createOptions.renderOptionsKeysToFilter));

还有:

return React.createElement(Component, merge({}, data, routerProps));

关于express - 使用 React-Engine 和 Express 将服务器端变量传递到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37359872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com