(SSR)如何在服务器上获取IntrospectionFragmentMatcher的片段类型?

时间:2019-02-04 20:47:35

标签: apollo-client ssr

是否可以直接从模式中获取fragmentTypes?

IntrospectionFragmentMatcher的文档显示了如何获取这些内容并将其存储在JSON文件中-但它似乎仅考虑客户端使用,并假设您拥有运行中的服务器。

由于我使用的是与GraphQL API相同的服务器以及用于渲染应用程序,因此这很麻烦。我仍然可以按照文档所说的那样,通过一个额外的构建步骤来做到这一点,但这实际上意味着:

  1. 从src构建
  2. 启动服务器
  3. 运行脚本以提取片段类型,并将其写入.json文件
  4. 重新启动服务器

我觉得必须有一种更简单的方法来做到这一点。

渲染应用程序时,我正在使用SchemaLink创建一个新的Apollo客户端,所以我已经有一个充分准备的架构。

现在我有这个:

import introspectionQueryResultData from './fragmentTypes.json'

const fragmentMatcher = new IntrospectionFragmentMatcher({
    introspectionQueryResultData,
})


const render = ({ schema, context }) => async (req, res, next) => {
    const client = new ApolloClient({
        ssrMode: true,
        link: new SchemaLink({ schema, context }),
        cache: new InMemoryCache({
            fragmentMatcher,
        }),
    })
    // ...

我希望能够进行如下操作:

const render = ({ schema, context }) => async (req, res, next) => {
    const client = new ApolloClient({
        ssrMode: true,
        link: new SchemaLink({ schema, context }),
        cache: new InMemoryCache({
            fragmentMatcher: fragmentMatcherFromSchema(schema)
        }),
    })
    // ...

这可能吗?

1 个答案:

答案 0 :(得分:0)

这很有可能,但是我还没有尝试在运行时完全做到这一点。 但是,您可以避免必须运行启动服务器才能提取片段。

如果您使用的是GraphQL代码生成器(https://graphql-code-generator.com/docs/getting-started/)。

除了服务器正在运行的URL之外,您还可以为模式指定各种输入,请参见: https://graphql-code-generator.com/docs/getting-started/schema-field#available-formats

您至少可以减少以下步骤

  1. 从src构建
  2. 运行脚本以提取片段类型,并将其写入.json文件
  3. 启动服务器