结合反应和玉石
我正在与快递+反应工作的同构javascript应用程序。 我们开始使用翡翠作为静态内容的服务器端模板,但是将这两者结合起来很快变得笨拙。 我们结束了这样的事情:
在快递路线:
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); });
在玉:
body .company-logo.center #react-main-mount != reactOutput include ./content_block_1.jade include ./content_block_2.jade #slideshow-main-mount != slideshowHtml
这是非常脆弱的 – 如果我们想要jsx,那么需要更多的jsx模板,我们必须确保我们的订单正确。
我的想法是用jsx做这一切 。 我知道有这样的事情React.renderToStaticMarkup,但是这并不能解决静态页面混合dynamic的问题。
大问题:如果我们决定用jsx(包含所有组件的React.renderToString(App({});
)来做所有这些事情,那么调用React.renderToString(App({});
这会是一个主要的性能问题吗?有更好的方法来做到这一点,轻松地结合静态和dynamic块?
虽然这可能是一个微不足道的话题: 我们坚持与玉模板。
基本上,我们希望在出现需求时能够灵活地使用无反应+通量架构的网站区域。 我们的网站基本上由一些较小的SP应用程序组成:网站,UserAccount,团队和pipe理员。
我们为什么这样做?
-
较小的文件大小和用户谁不访问网站的所有部分的开销。
-
select“退出”反应和stream量,如果需要时。
-
更简单的服务器端身份validation。
我们成功完成的方式是使用React.renderToStaticMarkup()
在服务器上呈现JSXshell模板( Html.jsx
),然后将其作为对每个服务器端快速路由请求的响应发送,以便传递一些HTML到浏览器。 Html.jsx
只是一个包含HTML头信息和GA脚本等的shell,它不包含布局。
// Html.jsx render(){ return ( <html> <head> // etc. </head> <body> <div id="app" dangerouslySetInnerHTML={{__html: this.props.markup}}> </div> </body> <script dangerouslySetInnerHTML={{__html: this.props.state}</script> <script> // GA Scripts etc. </script> </html> ) }
记住它是完全正常的,甚至build议在保湿你的应用程序时在服务器上使用dangerouslySetInnerHTML
的SetInnerHTML。
dynamic布局应该通过基于状态/道具configuration的组件层次结构与您的同构组件进行。 如果你碰巧使用了React Router,那么你的路由器将根据你提供的路由来渲染视图处理程序,这意味着你不需要自己pipe理它。
我们使用这种技术的原因是在体系结构上将我们的“App”分离开来,它是同构的,并且从我们的服务器端模板shell响应状态,这只是一个传送机制,并且是有效的锅炉板。 我们甚至将Html.jsx
模板保留在我们应用程序中的所有快速组件中,并且不要让它与其他同构React组件混合。
我发现了用于制定React / isomorphic体系结构的最有用的资源之一是https://github.com/yahoo/flux-examples/tree/master/react-router ,这是我们从中偷取这种技术的地方。
我们研究了将把手作为客户端开发者的模板引擎,将来使用我们的产品的想法,但是决定在JSX中编写我们自己的DSL并使用一些简单的parsing例程来将我们的类似HTML的DSLparsing为JSX在模板开始处添加诸如export default
(ES6模块语法)之类的东西,然后将模板导入到呈现组件。
你当然可以遵循这一思路,并使用玉石编译器吐出模板,然后添加模块的语法,如果你认为单独的玉文件是必不可less的。 我也注意到这个项目,尽pipe我没有在愤怒中探索它: https : //github.com/jadejs/react-jade 。