Javascript 是否可以使用辅助线程创建异步renderToString?

Javascript 是否可以使用辅助线程创建异步renderToString?,javascript,node.js,reactjs,react-dom,Javascript,Node.js,Reactjs,React Dom,我一直在考虑如何优化react服务器端渲染,特别是我的应用程序中的瓶颈部分,即同步renterToString调用。由于这是一个阻塞调用,长函数renderToString调用会导致应用程序的吞吐量受到很大影响 我偶然发现了一个线程(这里是通过谷歌翻译从中文翻译成英文的),它提出了一个假设,用于卸载renderToString并使其异步 我想测试此功能,但似乎存在一个拦截器,因为无法克隆符号,因此无法将其作为数据传递给工作程序: DataCloneError: Symbol(react.ele

我一直在考虑如何优化react服务器端渲染,特别是我的应用程序中的瓶颈部分,即同步renterToString调用。由于这是一个阻塞调用,长函数renderToString调用会导致应用程序的吞吐量受到很大影响

我偶然发现了一个线程(这里是通过谷歌翻译从中文翻译成英文的),它提出了一个假设,用于卸载renderToString并使其异步

我想测试此功能,但似乎存在一个拦截器,因为无法克隆符号,因此无法将其作为数据传递给工作程序:

DataCloneError: Symbol(react.element) could not be cloned.
下面是设置工作线程/服务器渲染逻辑的示例代码:

// asyncRenderer.js
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');

if (isMainThread) {
  module.exports = async function asyncRenderToString(component) {
    return new Promise((resolve, reject) => {
      const worker = new Worker(__filename, {
        workerData: component,
      });
      worker.on('message', resolve);
      worker.on('error', reject);
      worker.on('exit', (code) => {
        if (code !== 0) {
          reject(new Error(`Worker stopped with exit code ${code}`));
        }
      });
    });
  };
} else {
  const { renderToString } = require('react-dom/server');
  const HTML = renderToString(workerData);
  parentPort.postMessage(HTML);
}


// server.jsx
const asyncRenderer = require('./asyncRenderer');
...
const html = await renderToString(<App/>);
// Return the html
//asyncRenderer.js
const{Worker,isMainThread,parentPort,workerData}=require('Worker_threads');
if(isMainThread){
module.exports=异步函数asyncRenderToString(组件){
返回新承诺((解决、拒绝)=>{
const worker=新的worker(_文件名{
workerData:组件,
});
worker.on('message',resolve);
worker.on('错误',拒绝);
worker.on('退出',(代码)=>{
如果(代码!==0){
拒绝(新错误(`Worker stopped with exit code${code}`);
}
});
});
};
}否则{
const{renderToString}=require('react-dom/server');
常量HTML=renderString(workerData);
parentPort.postMessage(HTML);
}
//server.jsx
const asyncRenderer=require('./asyncRenderer');
...
const html=await renderToString();
//返回html
我很想知道是否有可能为此目的使用worker_线程,如果有,设置渲染器/worker线程的最佳方法是什么

我很想知道是否有可能为此目的使用worker_线程,如果有,设置渲染器/worker线程的最佳方法是什么

首先,在一般情况下,worker_线程适用于CPU密集型工作(如此),并行性和共享内存非常有用

在这种特殊情况下,简单地旋转多个Node.js进程同样有效

此外,由于ReactDOMServer渲染速度非常慢,因此在React(或Vue或Angular)中,几乎总是必须在服务器端渲染之前放置缓存。因此,这是一种更容易提高性能的方法

至于如何在这里使用worker_线程,它失败了,因为您将组件传递给它。相反,我会将路由或组件名称传递给它,并让它
require
替换该组件

或者,您可以自己序列化组件,并在另一端对其进行去序列化。符号需要唯一性,因此在Node.js中在工作人员之间移动时,默认情况下不会克隆符号。这就是你看到的错误