我正在使用express+react开发一个同构JavaScript应用。我们最初使用jade来生成静态内容的服务器端模板,但将两者结合起来变得越来越难以管理。我们最终得到了类似于这样的结果:
在express路由中:
router.get("/", function(req, res) {
var webpackStats = require('../../config/webpack-stats.json');
var reactHtml = React.renderToString(HiwApp({}));
var slideshowHtml = React.renderToString(slideshowApp({}));
var config = {
webpackStats: webpackStats,
reactOutput: reactHtml,
slideshowHtml: slideshowHtml
};
res.render("how_it_works/howitworks", config);
});
在 Jade 中:
body
.company-logo.center
#react-main-mount
!= reactOutput
include ./content_block_1.jade
include ./content_block_2.jade
#slideshow-main-mount
!= slideshowHtml
这很脆弱 - 如果我们想要jsx,然后是jade模板,再然后是更多的jsx,我们必须确保正确排序。
我的想法是全部使用jsx。我知道有React.renderToStaticMarkup可以解决这类问题,但这并不能解决混合动态和静态页面的问题。
最重要的问题是:如果我们决定全部使用jsx(比如包含所有组件的layout.jsx),然后调用React.renderToString(App({})
,这会对性能产生重大影响吗?如果有,是否有更好的方法来轻松地组合静态和动态块?
renderToString
方法来渲染整个文档。尽管初始页面加载时会有一定的渲染时间,但这种时间是非常短暂的。考虑到你很可能正在构建一个单页应用程序,这实际上只是一个微不足道的问题,因为用户只会在初始页面构建时访问它一次。 - AndrewMcLagan