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

sen*_*tor 10 javascript serialization node.js deserialization reactjs

我想序列化一个React元素(给定props的React组件的一个实例)并在其他地方反序列化它.你为什么问?我希望能够通过stdout从一个进程发送类,并在另一个进程中呈现它.我还希望渲染的组件是交互式的,所以简单地使用ReactDOM.renderToString()就不够了......

我尝试过的:

  • 将其序列化为字符串并使用eval()它进行反序列化
  • 使用自定义替代品和齐磊功能JSON.stringify()JSON.parse()分别

MyReactComponent.toString() 收益:

"function MyReactClass() {
    _classCallCheck(this, MyReactClass);

    _get(Object.getPrototypeOf(MyReactClass.prototype), 'constructor', this).apply(this, arguments);
}"
Run Code Online (Sandbox Code Playgroud)

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

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

pra*_*mil 6

看看react-serialize。该包允许您将 React 组件序列化为 JSON 字符串并返回。


sen*_*tor -1

回答我自己的问题:

// 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)
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,由于循环引用(这些家伙中还有很多难看的毛茸茸的内部逻辑),人们无法对“React.createClass()”的输出进行 JSON.stringify。如果它在这种情况下有效,那么它要么现在已经过时,要么太简单以至于不会遇到任何重要示例所遇到的问题。它还使用了 eval,这是我们非常想避免的。 (3认同)