在Next.js中集成swagger文档
Next.js 本来就不能直接用 Swagger,非要用还得自己折腾 API Routes?自动生成工具?手动写 Spec?这简直是在侮辱开发者。手动注释?这操作简直是在挑战耐心极限。
目录12 个章节
前言
最近一直在用 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 来做一些小玩意
不得不说前端的技术栈更新太快了哈哈哈
_EOF_
在Next.js中集成swagger文档
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
React + TypeScript + Taro前端开发小结
前言 项目到一段落,先来记录一下,本文以前端新手的角度记录React、TypeScript、Taro相关技术的开发体验以及遇到的问题和解决方法。 之前总说要学React(这篇博客:代码使我头疼之React初学习),这次项目需要做H5前端+小程序,我终于能用上React了~ 使用React的开发框架之前就听过京东的Taro,所以就这个了,直接开码。 关于React 不错,感觉比Vue的模板写法自由很
2022-04-22 · Web前端 · 约 1 分钟
代码使我头疼之React初学习
前言 开始了,去年(2020)说要学的React,到现在2021年的12月底了,才来实施……(年底警告!~~年末总结还没开始写!~~) 不过前端为啥要学React呢?Vue不是很好用吗?Vue确实很好用,并且MVVM模式也更容易让人接受和理解,但大概是各种社区上都说react yyds啦,react一统江山啦什么的,加上我之前学Flutter做了很多项目,对声明式UI的思想已经基本掌握了,所以就想
2021-12-26 · Web前端 · 约 1 分钟
NPM-Warn--ENOENT--no-such-file-or-directory
Now type the command to auto generate the package.json npm init --yes
2022-07-18 · Web前端 · 约 1 分钟
魔改了一下bootstrap-treeview组件,发布个NPM包体验一下
前言 之前在这篇文章 基于.NetCore开发博客项目 StarBlog - (8) 分类层级结构展示 中说到,我为了让文章分类列表支持层级结构,用了一个树形组件,不过这个组件太老了,使用的Bootstrap版本居然是3.x的,但又找不到更好的,只能硬着头皮用。 但实际效果有很多我不满意的,人家作者直接放弃了,在GitHub上标记项目为Archive状态,没辙。 感谢开源,我直接fork一份代码来
2022-05-27 · Web前端 · 约 1 分钟
讨论
共 0 条加载评论中…