UNPKG

forget-api

Version:

无需封装 Axios,无需写接口请求函数,无需维护返回值类型,把这些琐碎重复的事情交给工具来处理,让精力聚焦在核心功能的实现上。

89 lines (75 loc) 2.41 kB
# Forget API 无需封装 Axios,无需写接口请求函数,无需维护返回值类型,把这些琐碎重复的事情交给工具来处理,让精力聚焦在核心功能的实现上。 ## Install ```shell npm i -S forget-api ``` ## Usage 以`NestJS`+`Vite`技术栈为例,假设目录结构如下: ```text root/ │ ├─ backend/ │ ├─ src/ │ ├─ user.controller.ts │ ├─ frontend/ ├─ tsconfig.json ├─ vite.config.ts ├─ src/ ├─ main.ts ``` 在控制器中,利用`Mark`标记请求参数类型,通过`defineExpose`暴露 API 方法 ```ts // "backend/src/user.controller.ts" import { defineExpose, Mark } from 'forget-api/nest'; @Controller('user') export class UserController { @Get(':id') getUserInfo(@Param() params: Mark<{ id: string }>) { return { code: 200, data: { id } }; } } export default defineExpose(UserController); ``` 在`frontend/tsconfig.json`配置别名映射到后端目录 ```json { "compilerOptions": { "paths": { "@@api/*": ["../backend/src/*"] } }, } ``` 在 Vite 中引入定制插件对别名进行解析 ```ts import { vitePluginForNest } from 'forget-api/nest/vite'; export default defineConfig({ plugins: [ vitePluginForNest({ alias: '@@api', baseUrl: 'http://localhost:3000', }) ], }); ``` 在前端调用接口 ```ts // "frontend/src/main.ts" import userApis from '@@api/user.controller'; await userApis.getUserInfo({ id: '123' }); // 发起请求:GET http://localhost:3000/user/123 ``` > 借助于插件的转换,前端发起请求像是直接调用控制器的方法,使用相同的方法名、参数类型、返回值类型,类似于 RPC ## Principle 1. 通过插件监听`@@api/`相关的模块导入,根据`tsconfig.json`配置将模块解析成正确的文件路径,并以**文本**的形式载入; 1. 将上述的文本解析成 TypeScript AST,查找导出的控制器类及其方法和装饰器,生成如下代码: ```ts // "@@api/user.controller" import { createApis } from 'forget-api/request'; export default createApis('/user', { getUserInfo: ['GET', '/:id'], }); ``` <a href="docs/request.md">forget-api/request</a> 是对 fetch 的简单封装。