Node.js:如何序列化/反序列化React组件?

我想序列化一个React元素(给予道具的React组件的一个实例)并在别处反序列化它。 你为什么问? 我希望能够通过stdout从一个进程发送该类,并将其呈现在另一个进程中。 我也希望渲染的组件是交互式的,所以只需使用ReactDOM.renderToString()将不足以…

我试过了:

  • 将其序列化为string并使用eval()进行反序列化
  • 使用自定义JSON.stringify()并分别为JSON.stringify()JSON.parse()函数

MyReactComponent.toString()返回:

 "function MyReactClass() { _classCallCheck(this, MyReactClass); _get(Object.getPrototypeOf(MyReactClass.prototype), 'constructor', this).apply(this, arguments); }" 

它不包含我的组件特有的任何方法(比如render()constructor() )。

在JS Bin中查看这个示例代码: http : //jsbin.com/febuzupicu/edit? js,console, output

我环顾四周,没有find任何东西。

我正在写我自己的水合物/脱水,将反应组件转换成参数数组,以recursion方式传递给React.createElement() 。 我认为这是可靠的唯一方法。 我可能会为它做一个小型图书馆。

理论上,也许可以使用React.renderToString() ,并传递string? 但是那么你会使用dangerouslySetInnerHtml …:\

另一个更新:

这是图书馆: https : //github.com/finetype/react-serialize

它有一定的局限性,它不是我写过的最漂亮的代码,但它也有不错的testing覆盖率。 写起来比我想象的要难得多,最后我牺牲了一些非常想要的function来获得一致的结果。 希望这些将随着时间的推移而得到改善,并且欢迎提出要求。

但它的作品。 🙂

编辑:去这条路线(实际上添加了一吨的function,我没有添加到回购,因为我没有添加足够的testing覆盖),我们最终决定这是一个问题的兔子洞应该只用于相当简单的用例,并且我们的用例引入了足够的复杂性,以至于太多值得添加到代码中的认知负载。 我会告诫一些人不要走这条路。

回答我自己的问题:

 // If I stringify this JSON.stringify({ type: `React.createClass({ render: function() { return <span>{this.props.name}</span> } })`, props: { name: 'Jorge' } }) // Then I am able to parse it and deserialize it into a React element let {type, props} = payload // In Node React.createElement(vm.runInNewContext(type, {React}), props) // Not in Node React.createElement(eval(type), props) 
    Interesting Posts