我尝试在我的React SSR中用renderToString
替换renderToNodeStream
。
浏览器最终停止等待流启动(卡在加载中,但没有任何东西到达)。
我在服务器端逻辑上有头盔,样式组件和节点缓存。 删除所有这些后,只留下简单的必需品
onPageLoad(sink => {
let preloadedData = {}
let visitorGeoDetails = undefined;
let ip = dummyIP["HK"];
visitorGeoDetails = geoip.lookup(ip);
visitorGeoDetails.ip = ip;
console.info(`rendering page on server for ${ip}...`);
const setPreloadedContent = (key, value) => {
preloadedData[key] = value;
}
sink.renderIntoElementById("react-app", renderToNodeStream(
<App target="server" location={sink.request.url.path} visitorGeoDetails={visitorGeoDetails} setPreloadedContent={setPreloadedContent} />));
preloadedData['visitorGeoDetails'] = visitorGeoDetails;
sink.appendToBody(`
<script>
window.__PRELOADED_DATA__ = ${JSON.stringify(preloadedData)};
</script>
`);
});
问题仍然存在。
切换到renderToNodeStream
时还需要做其他事吗?
PS:我看到服务器运行了React组件(如果propTypes有任何警告,当浏览器尝试访问该站点时,它们也出现在服务器终端控制台日志中。)
答案 0 :(得分:0)
如果您将react
与redux
或react-router
之类的其他库一起使用,则应将App
组件包装为Provider
/ {{1 }}。
当我忘记包装StaticRouter
组件时,我遇到了同样的问题。
App
调用也必须以renderToNodeStream
结尾。
因此,您应该执行以下操作。
.pipe(res)
如果您需要一些SSR的工作示例,可以查看我的repository