【发布时间】:2020-06-04 22:27:18
【问题描述】:
我目前正在创建一个网站,并且一直希望开始使用renderToNodeStream 来提高服务器端渲染的性能,而不是使用renderToString。
目前我正在使用renderToString,然后使用Helmet.renderStatic 从每个页面获取所有必需的元数据和标题。但是,当我切换到使用 renderToNodeStream 时,我将在渲染任何内容之前先写入头部,因此不能再使用 Helmet.renderStatic。
我在想我可以执行以下操作来解决这个问题,但这涉及到先使用renderToString,然后再使用renderToNodeStream,并且可能并没有真正提供太多改进......
app.use('*', (req, res) {
Loadable.preloadAll().then(() => {
const store = createStore(
reducers,
getDefaultStateFromProps(),
applyMiddleware(thunk)
);
const routeContext = {};
const router = (
<Provider store={store}>
<StaticRouter location={req.url} context={routeContext}>
<App/>
</StaticRouter>
</Provider>
);
res.setHeader('Content-Type', 'text/html');
renderToString(router);
const helmet = Helmet.renderStatic();
res.locals.title = helmet.title;
res.locals.meta = helmet.meta;
res.locals.link = helmet.link;
res.write(headTemplate(res.locals));
const stream = renderToNodeStream(router);
stream.pipe(res, { end: false });
stream.on('end', () => {
res.locals.context = JSON.stringify(store.getState());
res.end(bodyTemplate(res.locals));
});
});
}
有人知道如何解决这个问题吗?
【问题讨论】:
-
嘿菲尔,你解决了你面临的这个问题吗?我们正要看看使用
renderToNodeStream -
这里是my post 了解更多信息和帮助
标签: reactjs react-dom react-helmet