Meteor 1.6.1 + renderToNodeStream =浏览器未加载流

时间:2018-02-08 03:17:16

标签: reactjs meteor

我尝试在我的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有任何警告,当浏览器尝试访问该站点时,它们也出现在服务器终端控制台日志中。)

enter image description here

1 个答案:

答案 0 :(得分:0)

如果您将reactreduxreact-router之类的其他库一起使用,则应将App组件包装为Provider / {{1 }}。

当我忘记包装StaticRouter组件时,我遇到了同样的问题。

App调用也必须以renderToNodeStream结尾。

因此,您应该执行以下操作。

.pipe(res)

如果您需要一些SSR的工作示例,可以查看我的repository