返回文章列表文章索引阅读全文
STARBLOG / 阅读手记
Web前端

在Next.js中集成swagger文档

Next.js 本来就不能直接用 Swagger,非要用还得自己折腾 API Routes?自动生成工具?手动写 Spec?这简直是在侮辱开发者。手动注释?这操作简直是在挑战耐心极限。

曦远 (DealiAxy)约 11 分钟
目录12 个章节

前言

最近一直在用 Next.js 开发我的新网站

这次写了一些 API

我就想着能不能像平时开发后端那样,使用 swagger 进行调试

所以进行了一番调研

严格来说 Next.js 本身并不直接支持 swagger,因为 swagger(更准确地说是 OpenAPI 规范)是后端 API 文档的工具,而 Next.js 是一个前端/全栈框架。

不过,如果用 Next.js 的 API Routes(即 app/api/* 目录下的接口),完全可以结合 swagger 来做 API 文档。常见做法有两种:

  • 使用工具自动生成 swagger
  • 手动写 OpenAPI 文件

自动生成

可以用工具根据 TypeScript 类型自动生成:

既然有为 Next.js 设计的工具,那我肯定直接用这第三个了

next-swagger-doc

我实际用下来这个工具也不咋样

因为 Next.js 官方没有实现强类型的 API

所以需要自己定义每一个接口的 schema ,麻烦得一批

不过既然已经试用过了,也介绍一下吧

安装

bun i next-swagger-doc

使用

这个工具的 README.md 文档有点老了

好在 examples 不老,里面有提供 Next.js 15 的项目例子

https://github.com/jellydn/next-swagger-doc/tree/main/examples

直接跟着配置吧

创建 Swagger Spec

创建 lib/swagger.ts 文件

import { createSwaggerSpec } from 'next-swagger-doc';

import 'server-only';

export const getApiDocs = async () => {
  const spec = createSwaggerSpec({
    apiFolder: 'app/api',
    definition: {
      openapi: '3.0.0',
      info: {
        title: 'Next Swagger API Example',
        version: '1.0',
      },
      components: {
        securitySchemes: {
          BearerAuth: {
            type: 'http',
            scheme: 'bearer',
            bearerFormat: 'JWT',
          },
          OAuth2: {
            type: 'oauth2',
            flows: {
              authorizationCode: {
                authorizationUrl: 'https://example.com/oauth/authorize',
                tokenUrl: 'https://example.com/oauth/token',
                scopes: {
                  read: 'Grants read access',
                  write: 'Grants write access',
                },
              },
            },
          },
        },
      },
      security: [],
    },
  });
  return spec;
};

创建 Swagger UI Component

这个可以生成 swagger 的界面

有多种工具能实现这个功能

next-swagger-doc 用的是 swagger-ui-react

bun i swagger-ui-react

我这里先跟着配置一下,等会再试试 Node.js 生态的其他工具,比如 stoplightio/elements

创建 app/api-doc/react-swagger.tsx 文件

'use client';

import SwaggerUI from 'swagger-ui-react';

import 'swagger-ui-react/swagger-ui.css';

type Props = {
    spec: Record<string, any>;
};

function ReactSwagger({ spec }: Props) {
    // @ts-ignore - SwaggerUI is not typed
    return <SwaggerUI spec={spec} />;
}

export default ReactSwagger;

创建 API 文档页面

就是把上面说的 Swagger UI Component 包装成页面

创建 app/api-doc/page.tsx 文件

import { getApiDocs } from '@/lib/swagger';

import ReactSwagger from './react-swagger';

export default async function IndexPage() {
  const spec = await getApiDocs();
  return (
    <section className="container">
      <ReactSwagger spec={spec} />
    </section>
  );
}

添加接口文档注释

很麻烦,这个库不能根据路径自动识别接口,只能手动定义

添加后 swagger 文档的可读性更高

/**
 * @swagger
 * /api/hello:
 *   get:
 *     description: Returns the hello world
 *     responses:
 *       200:
 *         description: Hello World!
 */
export async function GET(_request: Request) {
  // Do whatever you want
  return new Response('Hello World!', {
    status: 200,
  });
}

查看效果

访问 http://localhost:3000/api-doc 查看接口文档

手动生成

使用 swagger-jsdoc 之类的工具从 API route 上生成 OpenAPI spec

把 swagger.json 放在 public 目录里

然后搭配前面提到的 swagger-ui-react 之类的工具来实现 swagger 文档展示

import dynamic from 'next/dynamic';

const SwaggerUI = dynamic(() => import('swagger-ui-react'), { ssr: false });
import 'swagger-ui-react/swagger-ui.css';

export default function ApiDocs() {
  return <SwaggerUI url="/swagger.json" />;
}

可以参考: Swagger integration in next JS

小结

这俩方法看起来都不是很完美

果然 Next.js 还是偏前端吧,写太多 API 也不合适

我最近又发现一个新玩意 hono ,这个框架对 edge 的支持非常好,可以考虑拿这个搭配 Next.js 来做一些小玩意

不得不说前端的技术栈更新太快了哈哈哈

_EOF_

在Next.js中集成swagger文档

本文作者:
程序设计实验室
版权声明:
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

相关文章

魔改了一下bootstrap-treeview组件,发布个NPM包体验一下

前言 之前在这篇文章 基于.NetCore开发博客项目 StarBlog - (8) 分类层级结构展示 中说到,我为了让文章分类列表支持层级结构,用了一个树形组件,不过这个组件太老了,使用的Bootstrap版本居然是3.x的,但又找不到更好的,只能硬着头皮用。 但实际效果有很多我不满意的,人家作者直接放弃了,在GitHub上标记项目为Archive状态,没辙。 感谢开源,我直接fork一份代码来

2022-05-27 · Web前端 · 约 1 分钟

讨论

共 0 条

良言一句三冬暖,恶语伤人六月寒。

加载评论中…