react-apollo 服务器端渲染

Posted

技术标签:

【中文标题】react-apollo 服务器端渲染【英文标题】:react-apollo Server Side Rendering 【发布时间】:2019-10-05 08:36:55 【问题描述】:

免责声明:我在 SO 上看到了许多其他听起来相同的问题。但是不,这个问题及其背景,一切都不同。不重复。

嘿,我已经按照 https://github.com/zeit/next.js/tree/canary/examples/with-apollo.

除 cookie 外,一切都运行良好。在 CSR 实施的早期,我的withData.js 看起来像这样????

import withApollo from 'next-with-apollo'
import ApolloClient from 'apollo-boost'
function createClient( headers ) 

  return new ApolloClient(
    uri: `$process.env.ENDPOINT/graphql`,
    request: operation => 
      operation.setContext(
        fetchOptions: 
          credentials: 'include',
        ,
        headers
      )
    
  )



export default withApollo(createClient)

在上面的示例中,cookie 是由于 request 函数而起作用的。

但在 Next.js 示例中的 s-s-r 实现中,cookie 不起作用。请帮忙。 我需要将next-with-apolloreact-apollo s-s-r 集成。

【问题讨论】:

【参考方案1】:

我的集成如下:

import  ApolloClient  from 'apollo-client';
import  createHttpLink  from 'apollo-link-http';
import  InMemoryCache  from 'apollo-cache-inmemory';
import fetch from 'isomorphic-unfetch';
import withApollo from 'next-with-apollo';

// Polyfill fetch() on the server (used by apollo-client)
if (!process.browser)  // eslint-disable-line
  global.fetch = fetch; // eslint-disable-line


export default withApollo(
  ( ctx, headers, initialState ) => 
    return new ApolloClient(
      link: createHttpLink(
        fetch, // Switches between unfetch & node-fetch for client & server.
        uri: process.browser ? '/graphql' : `$process.env.ABSOLUTE_URL/graphql`, // Only absolute URLs are supported
        credentials: 'same-origin',
        // В режиме s-s-r необходимо передавать данные авторизации, которые хранятся в cookies, иначе, в браузер будет
        // выдана страница от имени анонимного пользователя несмотря на то, что он может быть авторизован
        headers: process.browser ?  : 
          cookie: headers.cookie
        
      ),
      s-s-rMode: !process.browser, // eslint-disable-line
      //  rehydrate the cache using the initial data passed from the server:
      cache: new InMemoryCache().restore(initialState || ),
      connectToDevTools: process.browser
    );
  
);

查看回调参数( ctx, headers, initialState )——它们来自服务器。

现在我在来自next/app 包的App 组件中渲染CookiesProvider

<ApolloProvider client=apollo>
  <CookiesProvider>
    /* ... */
  </CookiesProvider>
</ApolloProvider>

【讨论】:

以上是关于react-apollo 服务器端渲染的主要内容,如果未能解决你的问题,请参考以下文章

React 服务端渲染与预渲染

彻底理解服务端渲染 - SSR原理

2019大前端热门技术流之React服务器端渲染NextJS实战

vue的服务器端渲染

react.js在服务器端渲染有啥好处?渲染是怎么个流程

vue项目改造SSR(服务端渲染)