在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 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 来做一些小玩意
不得不说前端的技术栈更新太快了哈哈哈
在Next.js中集成swagger文档的更多相关文章
- 如何Spring Cloud Zuul作为网关的分布式系统中整合Swagger文档在同一个页面上
本文不涉及技术,只是单纯的一个小技巧. 阅读本文前,你需要对spring-cloud-zuul.spring-cloud-eureka.以及swagger的配置和使用有所了解. 如果你的系统也是用zu ...
- SpringBoot系列:六、集成Swagger文档
本篇开始介绍Api文档Swagger的集成 一.引入maven依赖 <dependency> <groupId>io.springfox</groupId> < ...
- dotnet webapi 中添加Swagger文档
首先添加"SwaggerGenerator": "1.1.0","SwaggerUi": "1.1.0" 需要注意的是这 ...
- springboot集成swagger文档
//此处省略springboot创建过程 1.引入swagger相关依赖(2个依赖必须版本相同) <dependency> <groupId>io.springfox</ ...
- Spring 5 中函数式web开发中的swagger文档
Spring 5 中一个非常重要的更新就是增加了响应式web开发WebFlux,并且推荐使用函数式风格(RouterFunction和 HandlerFunction)来开发WebFlux.对于之前主 ...
- .NET Core基础篇之:集成Swagger文档与自定义Swagger UI
Swagger大家都不陌生,Swagger (OpenAPI) 是一个与编程语言无关的接口规范,用于描述项目中的 REST API.它的出现主要是节约了开发人员编写接口文档的时间,可以根据项目中的注释 ...
- SpringBoot+SpringCloud+vue+Element开发项目——集成Swagger文档
在pom.xml文件中添加Maven依赖 <!--swagger--> <dependency> <groupId>io.springfox</groupId ...
- spring boot集成swagger文档
pom <!-- swagger --> <dependency> <groupId>io.springfox</groupId> <artifa ...
- asp.net core web api 生成 swagger 文档
asp.net core web api 生成 swagger 文档 Intro 在前后端分离的开发模式下,文档就显得比较重要,哪个接口要传哪些参数,如果一两个接口还好,口头上直接沟通好就可以了,如果 ...
- springboot成神之——swagger文档自动生成工具
本文讲解如何在spring-boot中使用swagger文档自动生成工具 目录结构 说明 依赖 SwaggerConfig 开启api界面 JSR 303注释信息 Swagger核心注释 User T ...
随机推荐
- 高效安全迁移:PG高可用集群实战方案深度解析
PostgreSQL是一个开源的数据库管理系统,相比于其他开源数据库系统,PostgreSQL有更加丰富的数据类型和可扩展性,并因此被广泛采用.在实际工作中,若企业业务需求变动,则有可能面临PG高可用 ...
- DateValue转换日期文本的一个注意问题
Excel 中,DateValue转换日期文本,遇到欧式日期格式:"17 Jun 2025"或"Jun 17, 2025"这样的日期需要转换时,一定要注意,日. ...
- Oracle中复杂数据处理
利用聚合函数统计数据 求最大值-max() max()可应用数值型和字符型和日期型(实质也是数值型) select max(employee_age) max_age from employees m ...
- .net request——server——response学习
request 1.Request.UrlReferrer 请求来的URL context.Response.ContentType = "image/png"; //动态创建图片 ...
- android多活动练习--人品计算器
效果图如下: 第二个页面: 显示结果和姓名.性别有关,代码如下: activity_main.xml: 1 <?xml version="1.0" encoding=&quo ...
- FOR XML PATH 函数与同一分组下的字符串拼接
FOR XML PATH 简单介绍 FOR XML PATH 语句是将查询结果集以XML形式展现,通常情况下最常见的用法就是将多行的结果,拼接展示在同一行. 首先新建一张测试表并插入数据: CREAT ...
- I5TING_TOC转成的HTML,怎样高亮代码
找到安装位置全局安装一般在默认位置C:\Users\administrator\AppData\Roaming\npm\node_modules\i5ting_toc 修改marked.jsi5tin ...
- 前端开发系列077-Node篇之package
本文输出Node中和包有关的基本内容. 一.Node中的模块和包 模块 在Node中,以模块为单位来划分所有的功能. 从某种角度来说,Node应用都由大量模块组成,每个模块都是一个JavaScript ...
- 前端开发系列010-基础篇之JavaScript的Date对象
本文介绍JavaScript中的内置对象Date,时间相关的基本常识,以及Date的常用方法,此外还简单介绍了定时器的相关知识点. 一.日期类型Date简单介绍 Date对象是JavaScript语言 ...
- CLTX 笔试题目预览
error: multiple storage classes in declaration of `i' 代理服务器常用以下端口: (1). HTTP协议代理服务器常用端口号:80/8080/312 ...