Next.js + GraphQL + TypeScript 设置
本文将引导您完成 Next.js 应用的简单 GraphQL 设置。
本指南面向已经熟悉 GraphQL 的用户,如果您还不了解,我建议您先阅读一些教程,了解一下 GraphQL 的基本概念。剧透一下,GraphQL 非常棒。
应用程序设置
有两种方法可以实现这一点,在这种情况下,我们将使用create-next-app命令。
在终端中运行以下命令。
npx create-next-app --ts next-graphql-app
移动到应用程序文件夹
cd next-graphql-app
添加 TypeScript
我是个 TypeScript 狂热爱好者,现在我几乎写不出普通的 JavaScript 代码了。所以请多多包涵,把 TypeScript 添加到你的应用中吧。不开玩笑,TypeScript 真的很棒,你应该试试。Next.js 也让 TypeScript 的使用变得非常简单。
以前需要一些步骤才能安装 TypeScript 并让它在你的应用中运行,但现在你可以使用--t标志位,而且很快create-next-appTypeScript 就会默认启用,所以我们可以跳过这部分了。🥳
最后,启动应用程序
npm run dev
它活了!
添加 Apollo GraphQL
我们已经完成了 NextJS + TypeScript 部分,现在开始 GraphQL。在本指南中,我们将使用名为Apollo Client 的
库来处理数据获取(URQL指南即将推出)。
首先,我们来安装 Apollo Client 和 GraphQL。
npm install @apollo/client graphql
在设置客户端之前,我们需要一个 API 来连接。我们可以自己构建 GraphQL 后端,但这将在另一篇博客中讨论。现在,我们将使用一个现有的国家/地区 API,顺便给它点个赞吧。
有了API URL,我们就可以创建要连接的客户端了。在客户端中pages/_app.tsx添加以下代码。
import { ApolloClient, InMemoryCache } from '@apollo/client';
const client = new ApolloClient({
uri: 'https://countries.trevorblades.com',
cache: new InMemoryCache()
});
现在让我们使用 . 将客户端连接到我们的应用程序ApolloProvider。
你的pages/_app.tsx看起来应该像这样。
import type { AppProps } from 'next/app';
import { ApolloClient, InMemoryCache } from '@apollo/client';
import { ApolloProvider } from '@apollo/client';
const client = new ApolloClient({
uri: 'https://countries.trevorblades.com',
cache: new InMemoryCache(),
});
import '../styles/globals.css';
function MyApp({ Component, pageProps }: AppProps) {
return (
<ApolloProvider client={client}>
<Component {...pageProps} />
</ApolloProvider>
);
}
export default MyApp;
所以,在这里,我们基本上是将我们的应用程序包装在一个ApolloProvider以客户端作为 prop 的组件中。
获取数据
我们的应用现在已经连接到国家/地区的 API,但目前还没有什么进展。正如您可能已经发现的,我们需要实际获取数据。Apollo 提供了一些钩子函数来帮助我们获取数据,在本教程中,我们将只使用其中一个useQuery钩子函数,但您可以随意探索 Apollo 提供的所有其他钩子函数。
让我们清理掉pages/index.tsxNextJS 自带的默认内容。
import Head from 'next/head';
import styles from '../styles/Home.module.css';
export default function Home() {
return (
<div className={styles.container}>
<Head>
<title>Countries GraphQL</title>
<link rel='icon' href='/favicon.ico' />
</Head>
<h1>Countries</h1>
<div>
<h3>Countries go here</h3>
</div>
</div>
);
}
我们还要从中移除那些我们不会使用的样式styles/Home.module.css。
/* This is all we need */
.container {
min-height: 100vh;
padding: 0 0.5rem;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
好多了 :)
我们将使用 GraphQL 查询来获取数据,它看起来像这样。
query {
countries {
code
name
}
}
当然,我们可以把查询语句写在同一个文件中,但我更喜欢把查询语句放在单独的文件中。为了实现这一点,我们需要做一些调整,让 NextJS 知道如何读取这些.graphql文件。
在根文件夹内创建一个名为 `<filename>` 的文件next.config.js,并输入以下代码。
module.exports = {
webpack: (config) => {
config.module.rules.push({
test: /\.(graphql|gql)$/,
exclude: /node_modules/,
loader: 'graphql-tag/loader',
});
return config;
},
};
这是告诉webpack如何加载.graphql文件。
现在我们需要告诉 TypeScript 关于这个.graphql文件的信息,否则它会报错。在根文件夹下创建一个名为 `<path>` 的文件夹@types,在该文件夹下创建一个名为 `<filename>` 的文件graphql.d.ts,并添加以下代码。
declare module '*.graphql' {
import { DocumentNode } from 'graphql';
const Schema: DocumentNode;
export = Schema;
}
好了,应该就是这样了。现在我们创建一个.graphql文件,用来存放我们的查询语句。
为了简单起见,我们将查询文件放在该pages文件夹内,但您可以根据自己的习惯进行操作。所以,就像我之前说的,在该pages文件夹内创建一个名为 `query.py` 的文件,queryCountries.graphql并添加以下代码。
query {
countries {
code
name
}
}
pages/index.tsx现在让我们使用钩子调用内部查询useQuery。
import Head from 'next/head';
import { useQuery } from '@apollo/client';
import QUERY_COUNTRIES from './queryCountries.graphql';
import styles from '../styles/Home.module.css';
export default function Home() {
const { data, loading, error } = useQuery(QUERY_COUNTRIES);
// check for errors
if (error) {
return <p>:( an error happened</p>;
}
// if all good return data
return (
<div className={styles.container}>
<Head>
<title>Countries GraphQL</title>
<link rel='icon' href='/favicon.ico' />
</Head>
<h1>Countries</h1>
{/* let the user know we are fetching the countries */}
{loading && <p>loading...</p>}
<div>
{data.countries.map((country) => (
<div key={country.code}>{country.name}</div>
))}
</div>
</div>
);
}
你应该会看到类似这样的内容:
虽然不太美观,但数据已经到位,我们的设置也完成了。
您可以在这里查看源代码。
挑战
现在我们已经有了数据,我邀请你来设计这款应用,并在推特上@ivanms1把结果发给我。记住,你可以向查询中添加更多字段,例如国旗、首都和货币。
query {
countries {
code
name
capital
emoji
currency
}
}
查看操场地图,了解所有可用的场地。
希望你喜欢这篇教程,如果喜欢的话,请点赞、评论和分享,这样我才能继续制作更多教程。
请点击此处查看本文第二部分。
文章来源:https://dev.to/ivanms1/next-js-graphql-typescript-setup-5bog
