Reactjs 使用SSR和Apollo客户端时防止客户端重新渲染

Reactjs 使用SSR和Apollo客户端时防止客户端重新渲染,reactjs,graphql,apollo,server-side-rendering,Reactjs,Graphql,Apollo,Server Side Rendering,简单地说,问题是我在服务器端渲染一个html文档,然后React应用程序将其分解并重新渲染已有的内容。在这一点之后,应用程序在客户端工作得非常好。 我使用的是React、Apollo客户端(Boost0.3.1)、Node、Express和内部的graphql服务器 请在此处查看此操作: 我主要尝试了文档中的建议: 这是不清楚的。我是否可以假设,如果我实现了存储再水化,Apollo客户端获取数据的xhr请求将不需要发生?如果是这样的话,问题是我已经尝试了医生对商店补液的建议,但是医生有点含糊不

简单地说,问题是我在服务器端渲染一个html文档,然后React应用程序将其分解并重新渲染已有的内容。在这一点之后,应用程序在客户端工作得非常好。
我使用的是React、Apollo客户端(Boost0.3.1)、Node、Express和内部的graphql服务器

请在此处查看此操作:

我主要尝试了文档中的建议:

这是不清楚的。我是否可以假设,如果我实现了存储再水化,Apollo客户端获取数据的xhr请求将不需要发生?如果是这样的话,问题是我已经尝试了医生对商店补液的建议,但是医生有点含糊不清

    <script>
        window.__APOLLO_STATE__ = JSON.stringify(client.extract());
    </script>
客户端:

    import App from '../shared/App';
    import React from 'react';
    import { hydrate } from 'react-dom';
    import { ApolloProvider } from 'react-apollo';
    import { HelmetProvider } from 'react-helmet-async';
    import { client } from '../shared/graphql/graphqlClient';
    import '@babel/polyfill';

    const graphqlEnv = window.location.href.match(/local|dev/) ? '-dev' : '';

    const graphqlClient = client(graphqlEnv);

    const Wrapped = () => {
      const helmetContext = {};
      return (
        <HelmetProvider context={helmetContext}>
          <ApolloProvider client={graphqlClient}>
            <App />
          </ApolloProvider>
        </HelmetProvider>
      );
    };

    hydrate(<Wrapped />, document.getElementById('root'));

    if (module.hot) {
      module.hot.accept();
    }
FragmentMatcher.js:

    import { IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';

    const FragmentMatcher = new IntrospectionFragmentMatcher({
      introspectionQueryResultData: {
        __schema: {
          types: [
            {
              kind: 'INTERFACE',
              name: 'resourceType',
              possibleTypes: [
                { name: 'Episode' },
                { name: 'Link' },
                { name: 'Page' },
                { name: 'Profile' },
                { name: 'Story' }
              ]
            }
          ]
        }
      }
    });

    export default FragmentMatcher;
请参见客户端重新渲染的操作

在上述代码的生产版本中,
我跳过状态补液
窗口因为我没有让它工作

,所以当我意识到我犯了错误时,答案很简单。我需要把

        window.__APOLLO_STATE__ = JSON.stringify(client.extract());
    </script>
window.\uuuuu APOLLO\u STATE\uuuuu=JSON.stringify(client.extract());
因此,它可以被阅读和使用

这个
const apollo_状态=`
window.\uuuuApollo\u STATE\uuuuu=JSON.stringify(${graphqlClient.extract()});
`;
模板=模板。替换(/,阿波罗州)

需要靠
上升,而不是靠身体下降。这样的话,我现在不知道该怎么办了,但还是被绊倒了一会儿

    import { IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';

    const FragmentMatcher = new IntrospectionFragmentMatcher({
      introspectionQueryResultData: {
        __schema: {
          types: [
            {
              kind: 'INTERFACE',
              name: 'resourceType',
              possibleTypes: [
                { name: 'Episode' },
                { name: 'Link' },
                { name: 'Page' },
                { name: 'Profile' },
                { name: 'Story' }
              ]
            }
          ]
        }
      }
    });

    export default FragmentMatcher;
        window.__APOLLO_STATE__ = JSON.stringify(client.extract());
    </script>