在Next.js项目中集成GraphQL-Nexus的完整指南

在Next.js项目中集成GraphQL-Nexus的完整指南

nexus Code-First, Type-Safe, GraphQL Schema Construction nexus 项目地址: https://gitcode.com/gh_mirrors/ne/nexus

前言

GraphQL-Nexus是一个强大的TypeScript优先的GraphQL框架,它允许开发者以编程方式构建类型安全的GraphQL API。本文将详细介绍如何在Next.js项目中集成GraphQL-Nexus,创建一个完整的全栈应用。

环境准备

首先,我们需要创建一个基本的Next.js项目并配置TypeScript支持:

npm init next-app
npm i -D typescript @types/react @types/node

运行开发服务器以生成默认的TypeScript配置:

npm run dev

核心依赖安装

接下来安装GraphQL-Nexus及其相关依赖:

npm i nexus apollo-server-micro

这里我们选择apollo-server-micro作为GraphQL服务器,因为它特别适合在无服务器环境中运行。

创建GraphQL API路由

Next.js的API路由遵循基于文件夹的约定。在pages/api目录下创建graphql.ts文件:

touch pages/api/graphql.ts

初始配置如下:

import { makeSchema, queryType } from 'nexus'
import { ApolloServer } from 'apollo-server-micro'

const Query = queryType({
  definition(t) {
    t.string('hello', { resolve: () => 'hello world!' })
  },
})

const schema = makeSchema({
  types: [Query],
})

const server = new ApolloServer({
  schema,
})

export const config = {
  api: {
    bodyParser: false,
  },
}

export default server.createHandler({
  path: '/api/graphql',
})

构建模块化Schema

为了更好的代码组织,我们将在项目根目录创建schema文件夹来管理GraphQL类型定义:

mkdir schema
touch schema/Query.ts
touch schema/index.ts

Query.ts中定义我们的业务类型和查询:

import { objectType, queryType } from 'nexus'

export const Framework = objectType({
  name: 'Framework',
  definition(t) {
    t.id('id')
    t.string('name')
  },
})

export const Query = queryType({
  definition(t) {
    t.list.field('frameworks', {
      type: 'Framework',
      resolve: () => {
        return [
          { id: '1', name: 'React' },
          { id: '2', name: 'Vue' },
          { id: '3', name: 'Angular' },
          { id: '4', name: 'Svelte' },
        ]
      },
    })
  },
})

index.ts中整合所有类型:

import { makeSchema } from 'nexus'
import * as QueryTypes from './Query'

const schema = makeSchema({
  types: [QueryTypes],
})

export default schema

前端数据获取

在Next.js中,我们有多种方式获取GraphQL数据:

服务器端渲染(SSR)

安装graphql-request库:

npm i graphql-request

在页面组件中使用getServerSideProps

import { request, gql } from 'graphql-request'

export async function getServerSideProps() {
  const query = gql`
    {
      frameworks {
        id
        name
      }
    }
  `
  const data = await request('http://localhost:3000/api/graphql', query)
  return { props: { frameworks: data.frameworks } }
}

export default function Home({ frameworks }) {
  return (
    <div>
      <ul>
        {frameworks.map(f => (
          <li key={f.id}>{f.name}</li>
        ))}
      </ul>
    </div>
  )
}

静态生成(SSG)

类似地,可以使用getStaticProps进行静态生成。

客户端渲染(CSR)

对于需要客户端GraphQL功能(如缓存)的场景,可以考虑使用Apollo Client。

类型生成配置

在Next.js项目中配置Nexus的类型生成需要特殊处理:

import path from 'path'

const schema = makeSchema({
  types: [QueryTypes],
  outputs: {
    typegen: path.join(process.cwd(), 'generated/nexus-typegen.ts'),
    schema: path.join(process.cwd(), 'generated/schema.graphql'),
  },
})

更新package.json构建脚本:

{
  "scripts": {
    "dev": "next dev",
    "build:nexus-typegen": "ts-node --compiler-options '{\"module\":\"CommonJS\"}' --transpile-only schema",
    "build": "npm run build:nexus-typegen && next build",
    "start": "next start"
  }
}

最佳实践

  1. Schema组织:将GraphQL类型定义与API路由分离,避免Next.js错误地将类型文件识别为API路由。

  2. 性能优化:对于生产环境,考虑将生成的schema和类型文件提交到代码仓库,避免每次构建都重新生成。

  3. 开发体验:配置VS Code的自动导入功能,可以显著提升使用Nexus的开发效率。

  4. 错误处理:在API路由中添加适当的错误处理和日志记录。

总结

通过本文的步骤,我们成功地在Next.js项目中集成了GraphQL-Nexus,实现了以下功能:

  • 创建了类型安全的GraphQL API端点
  • 构建了模块化的GraphQL Schema
  • 实现了多种数据获取策略
  • 配置了自动类型生成
  • 建立了完整的开发工作流

这种架构结合了Next.js的便利性和GraphQL-Nexus的类型安全优势,为构建全栈TypeScript应用提供了强大基础。

nexus Code-First, Type-Safe, GraphQL Schema Construction nexus 项目地址: https://gitcode.com/gh_mirrors/ne/nexus

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁操余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值