Next.js 中如何使用 Graphql?

GraphQL 是现代化的 API 查询语言和运行时,它是面向客户端的 API,由 Facebook 开发并首次在 2015 年公开发布。GraphQL 旨在解决 REST API 的缺点,如过度获取或未能满足查询需求等问题。它支持前端和后端开发人员在相同的查询语言中编写、测试和部署 API。在 Next.js 中使用 GraphQL 可以简化前端的数据获取过程并提高系统的性能。

步骤

要在 Next.js 中使用 GraphQL,有以下几个步骤:

  1. 正确安装必需的 NPM 软件包。

GraphQL 的开发商提供了很多不同的库,用来支持在不同环境中实现 GraphQL。要在 Next.js 中使用 GraphQL,您需要安装一些关键的 NPM 软件包以便能够整合 GraphQL 查询和响应。这些软件包的安装方法如下:

npm install apollo-boost graphql react-apollo
  1. 向 Next.js 应用程序中添加一个 Apollo 客户端。

通过将 Apollo 客户端添加到 Next.js 应用程序中,您可以简化用于获取和处理数据的工作流。要添加 Apollo 客户端,请完成以下步骤:

首先,在 Next.js 应用程序中创建一个新文件夹(例如,设置名为 lib),然后在其中添加一个新文件(例如,命名为 client.js)。您可以使用以下代码初始化 Apollo 客户端:

import { ApolloClient } from 'apollo-client';
import { HttpLink } from 'apollo-link-http';
import { InMemoryCache } from 'apollo-cache-inmemory';

const GRAPHQL_ENDPOINT = '[YOUR_API_ENDPOINT]';

const httpLink = new HttpLink({
  uri: GRAPHQL_ENDPOINT,
});

const cache = new InMemoryCache();

const client = new ApolloClient({
  link: httpLink,
  cache: cache,
});

export default client;

其中,GRAPHQL_ENDPOINT 是您的 GraphQL API 端点的 URL。此代码创建了一个 Apollo 客户端实例并将其放置于私有命名空间中,以便其他组件可以使用它来发出数据查询和更改请求。

接下来,您需要确保 Next.js 应用程序可以访问此客户端。要做到这一点,请在 Next.js 应用程序中创建一个高阶组件并返回一个新的组件,该组件可以访问 Apollo 客户端。以下代码演示了如何完成此操作:

import React from 'react';
import { ApolloProvider } from 'react-apollo';
import ApolloClient from './client';

export function withApollo(Component) {
  return function WithApollo({ ...props }) {
    return (
      <ApolloProvider client={ApolloClient}>
        <Component {...props} />
      </ApolloProvider>
    );
  };
}

此高阶组件将 Apollo 客户端提供程序包装在 Next.js 应用程序中的组件中。请注意,此代码中的 ApolloProvider 组件始终从名为 client 的默认导入中检索客户端实例。

  1. 向 Next.js 中添加 graphQL 查询。

现在您已经成功安装了必需的 NPM 软件包和初始化了 Apollo 客户端,接下来需要使用 GraphQL 查询定义并发送数据请求。您可以通过创建一个 JavaScript 模块来完成此操作,该模块导出一个 query 变量和一个函数,其中该函数使用 Apollo 客户端来执行查询并返回结果。以下代码演示了如何创建这样的模块:

import gql from 'graphql-tag';
import ApolloClient from './client';

export const GET_POSTS = gql`
  query {
    posts {
      id
      title
      body
    }
  }
`;

export async function getPosts() {
  const { data } = await ApolloClient.query({
    query: GET_POSTS,
  });
  return data.posts;
}

此代码定义了一个名为 GET_POSTS 的 GraphQL 查询,并实现了一个名为 getPosts 的函数,该函数使用 Apollo 客户端查询从 GraphQL API 中检索所有帖子。请注意,此 codepen import 了 ApolloClient from './client',此代码中的 gql 组件来自导入 graphql-tag。您可以通过更改此查询和相关函数来创建任意数量的查询和 API 调用,来满足您的业务需求。

案例分析:使用 Next.js 和 GraphQL 获取数据

假设您的 Next.js 应用程序需要从远程 GraphQL API 加载数据并在页面中呈现。下面是一些代码片段,该示例演示了如何加载 GraphQL 数据并在 Next.js 中使用它渲染组件。

为了设置这个例子,您需要一个远程服务器和 GraphQL API。 Facebook 提供了一个简单的 GraphQL API(https://swapi-graphql.netlify.app/.),其允许您从“星球大战”的官方 API 中加载数据。无论您使用哪个 GraphQL API,都可以使用下面的示例代码来说明如何使用GraphQL API 加载和渲染数据。

首先在 Next.js 应用程序中创建一个空白页面(如 index.js),然后添加以下内容以在加载组件时加载限定的 GraphQL 数据:

import { withApollo } from '../lib/apollo';
import { gql } from 'graphql-tag';
import Link from 'next/link';
import { useQuery } from '@apollo/react-hooks';

const STARSHIP_DATA = gql`
  query {
    allStarships {
      edges {
        node {
          name
        }
      }
    }
  }
`;

function HomePage() {
  const { loading, error, data } = useQuery(STARSHIP_DATA);

  if (loading) {
    return <div>Loading ...</div>;
  }
  if (error) {
    console.error(error);
    return <div>Error loading posts.</div>;
  }

  return (
    <div>
      <h1>Star Wars Starships</h1>
      <ul>
        {data.allStarships.edges.map(({ node }) => (
          <li key={node.name}>
            <Link href={`/starship/${encodeURIComponent(node.name)}`}>
              <a>{node.name}</a>
            </Link>
          </li>
        ))}
      </ul>
    </div>
  );
}

export default withApollo(HomePage);

在此代码中,使用用于 Next.js 的 Apollo 高阶组件的 withApollo 方法,在页面组件 HomePage 上注入了 Apollo 客户端(间接通过 useQuery 标记)。然后使用 useQuery 将 GraphQL 查询和 React 组件进行了绑定。

总结

GraphQL 是一种先进的 API 语言和运行时,用于更高效、更透明地创建更好的 API。Next.js 可使您使用 GraphQL 更轻松地获取数据并将其用于创建用户界面。随着您的 Next.js 应用程序的规模和复杂性的增加,使用 GraphQL 的好处将变得更加明显。上述指南包含了使用 GraphQL 和 Next.js 的基础知识,以及演示了如何加载和渲染 GraphQL 数据的示例代码。现在,通过这些知识来开始构建您的 Next.js 应用程序,从而加速开发和优化代码。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a491f6add4f0e0ffcdfcf1


纠错反馈