当前位置: 首页 > news >正文

在Next.js中集成swagger文档

前言

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

这次写了一些 API

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

所以进行了一番调研

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

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

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

自动生成

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

  • tsoa
  • zod-to-openapi(如果用了 Zod 校验)
  • next-swagger-doc(专门为 Next.js 封装的工具)

既然有为 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 typedreturn <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 wantreturn 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 来做一些小玩意

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

http://www.sczhlp.com/news/60034/

相关文章:

  • 2023江西icpc排名
  • 网站建设山东聚搜网络一x台州智能模板建站
  • 做兼职编辑的网站wordpress页面.html
  • 岳阳市网站建设推广开发小程序需要多久
  • 宜布网网站谁做的平台推广计划
  • 城乡与建设部网站王也踏青图
  • cursor安装提示你选定的驱动器或UNC共享不存在或不能访问.请选择其它位置
  • 力扣200. 岛屿数量(DFS/BFS/并查集)
  • 怎么给企业制作网站一般网站用什么软件做
  • 网站模板下载后如何使用公司申请网站需要哪些材料
  • 网站获取访客qq 原理营销网站建设定制
  • 泊头做网站的com和cn和net域名区别
  • 台州网站建设选浙江华企手机网站logo
  • 手机网站大小平面设计毕业设计作品
  • 海洋网络提供网站建设网站广告推送怎么做
  • 阳江房产网站天津微信小程序定制公司
  • 网站目录管理模版网站制作 火星科技
  • 【HTML】表格
  • 2025 SWPU-NSSCTF 秋季招新入门 shell
  • 【LeetCode 34】算法:在排序数组中查找元素的第一个和最后一个位置
  • 工程认证网站的建设潜江资讯网手机版
  • 有本地服务器怎么做网站做财经类新闻的网站
  • 建设农垦网站wordpress数据恢复
  • 网站上传到空间上饶市住房城乡建设局网站
  • 百度收录网站怎么更改关键词商贸有限公司起名字
  • wordpress自动生成网站地图wordpress如何添加广告悬浮按钮
  • 北京做一个网站多少钱市场调研
  • 淘客网站必须备案么做网站所需的知识技能
  • 如何做网站栏目规划企业品牌战略策划
  • 洞头区网站建设收费基本的网站建设步骤