@Littlesqx 是的,但 js 代码是不是由 node 来执行的我还不确定。
react-rails 文档上是这么说的:
Server rendering is powered by ExecJS and subject to some requirements
(https://github.com/reactjs/react-rails#server-side-rendering)
而 ExecJS 是支持多种服务端的运行时的:
ExecJS supports these runtimes:
- therubyracer - Google V8 embedded within Ruby
- therubyrhino - Mozilla Rhino embedded within JRuby
- Duktape.rb - Duktape JavaScript interpreter
- Node.js
- Apple JavaScriptCore - Included with Mac OS X
- Microsoft Windows Script Host (JScript)
- Google V8
- mini_racer - Google V8 embedded within Ruby
首先感谢楼主的分享,这对需要这样做的人很有参考价值。
但是我要反对这种做法,可以看到,转 React SSR 的需求不是用户体验要求,也不是产品功能要求,而仅仅是需求方的任性,而需要的 SEO 的网站就不适合前端渲染。万一哪天他们要求用深度学习和区块链来做网站呢?
@Rei 我之前看到你的评论了,没来得及回复,现在看好像你的内容已经改过了,我印象中你之前的评论中是说了关于前后端分离的情况,不过仔细看文章我话,其实我这个实践是没有做前后分离的,就用了 React 最最简单的一个功能,作为 view,用 react component 替代了原来的 html view 模板。router 也还是 rails 的 router,数据也都是在服务端产生,通过 props 传给 react component。这种用法几乎没有对原来的整体框架产生太大的变化。(即使不需要 SSR 也可以这么用)
一开始这样做我也是觉得有些拧巴的,但后来我体会到了一些好处,我说说我的感受。
这是 RateYo! 的使用示例:
<-- HTML -->
<head>
<-- Basic styles of the plugin -->
<link rel="stylesheet" href="jquery.rateyo.css"/>
</head>
<body>
<div id="rateYo"></div>
<script src="jquery.js"></script>
<script src="jquery.rateyo.js"></script>
</body>
/* Javascript */
//Make sure that the dom is ready
$(function () {
$("#rateYo").rateYo({
rating: 3.6
});
});
这是 React-Stars 的使用:
import ReactStars from 'react-stars'
import React from 'react'
import { render } from 'react-dom'
const ratingChanged = (newRating) => {
console.log(newRating)
}
render(<ReactStars
count={5}
onChange={ratingChanged}
size={24}
color2={'#ffd700'} />,
document.getElementById('where-to-render')
);
(代码行数上可能是没更少,但逻辑是集中在一起,没有割裂在不同的地方)
相比传统 html view 模板,我想缺点可能就是性能问题,这个有待 profile 一下到底差多少。但如果对性能需求不是那么高的话,又不喜欢写 html view 模板,那么值得尝试一下这种方式。
而且如果不需要考虑 SEO,那么就不需要为 React 做 SSR,那性能会和传统 html view 模板几乎没有差别。
以上是我的一些拙见。
非常赞,ssr 和 webpacker 结合在我看来是完美的方案,可以避开前端各种状态管理,路由的坑。之前看 webpacker 的 react ssr 好像有人在 WIP,原来 react-rails 就已经支持了。