结合swagger的前端架构小记

1.引言

开发中,我们是否经常遇到以下痛点:

  • 项目越大,启动和热更新越来越慢,启动都要花个3-5分钟以上
  • 没有类型,接口返回的Object不拿到真实数据都不知道有哪些字段
  • 需要手动写很多request函数去调用api,手动书写各种判断枚举值
  • 缺乏代码格式化,代码错误检查,git commit规范
  • 难以维护的css代码和文件,js里面书写编写css时没有提示,js里面无法使用css高级用法
  • 数据流要么太死板,对ts支持很差(dva),要么太灵活(mobx)
  • 重度依赖redux,需要写很多模板文件
  • npm包管理问题,比如:多版本的npm包冲突、npm包依赖嵌套、npm僵尸包、npm依赖包平铺到nodule_modules首层
  • 手动变更接口的loading状态、手动管理modal的visible状态
  • 页面经常因为js错误导致白屏,体验很差
基于以上痛点,菜鸡的我整合了一些开源技术搭了一套脚手架供自己使用,并分享给大家学习,如果对你有帮助请在github上面给我一个star🙏🙏🙏

2.脚手架核心技术

2.自动基于后端swagger文件生成request函数

js 复制代码
// src/core/openapi/index.ts

// 示例代码
generateService({
  // openapi地址
  schemaPath: `${appConfig.baseURL}/${urlPath}`,
  // 文件生成目录
  serversPath: "./src",
  // 自定义网络请求函数路径
  requestImportStatement: `/// <reference types="./typings.d.ts" />\nimport request from "@request"`,
  // 代码组织命名空间, 例如:Api
  namespace: "Api",
});

3.调用接口示例

js 复制代码
// HelloGet是一个基于axios的promise请求(自动生成)
export async function HelloGet(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: Api.HelloGetParams,
  options?: { [key: string]: any },
) {
  return request<Api.HelloResp>('/gin-demo-server/api/v1/hello', {
    method: 'GET',
    params: {
      ...params,
    },
    ...(options || {}),
  });
}

// 自动调用接口获取数据
const { data, isLoading } = useQuery({
  queryKey: ["hello", name],
  queryFn: () => {
    return HelloGet({ name: name });
  },
});

// HelloPost是一个基于axios的promise请求(自动生成)
export async function HelloPost(body: Api.HelloPostParam, options?: { [key: string]: any }) {
  return request<Api.HelloResp>('/gin-demo-server/api/v1/hello', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}

// 提交编辑数据
const { mutate, isLoading } = useMutation({
  mutationFn: HelloPost,
  onSuccess(data) {
    setName(data?.data || "");
  },
  onError() {
    // 清除queryKey为hello的接口数据缓存,自动重新获取接口数据
    queryClient.invalidateQueries({ queryKey: ['hello'] });
  }
})

mutate({ name: "lisi" });

4.技术说明

  • UI组件库(ant-design): 开箱即用,省心省力。没有选择headless-ui,还没有看到成熟的方案(chakra-ui使用成本也很高),封装成本高,会一直持续关注
  • 通用hook(ahooks): 一个hook工具库,没有什么特别的亮点,就是hook增强,该库可以依据个人喜好选择是否使用
  • 路由(react-router-dom): 自身默认支持错误边界功能,我觉得react-error-boundary更好用点,所以用hack绕过了react-router-dom的错误边界(ps: 暂时不支持参数禁用错误边界),react-router-dom官方没有提供prop禁用默认的错误边界
  • 前端日志(sentry): 暂时未集成,需要进一步调研实用性和可用性
  • 自动生成request函数(openapi): 后端接入apenapi后,前端可以根据openapi文件自动生成request api,通常使用基于openapi规范的swagger

5.前端架构源码

点此查看前端架构源码

相关推荐
海带紫菜菠萝汤10 分钟前
WebCodecs API 实战:浏览器原生视频编解码的原理与性能测试
前端·javascript·音视频·视频编解码
一位正在转型AI全栈的前端工程师26 分钟前
AI 全栈学习之旅 - Week2:从零搭建一个可部署的 AI 聊天应用
前端
aixingpan1 小时前
aixingpan.cn API开发文档:api_docs_trichart_natal_solararc_transit2接口指南
前端·php
Ayayoyo1 小时前
公平随机转盘的前端实现:Web Crypto API、拒绝采样与加权抽取
前端
程序员黑豆2 小时前
鸿蒙应用开发:@Link 装饰器实现父子组件双向同步
前端·后端·harmonyos
前端炒粉2 小时前
简易实现ssr
开发语言·前端·javascript
顶级自由人2 小时前
【前端菜鸟的补课01】Zod 与 PostgreSQL 全栈数据工程教学
前端·后端·程序员
swipe2 小时前
11|(前端转全栈)购物车不能只存在前端:用户维度数据如何在后端落库
前端·后端·全栈
Chengbei114 小时前
云安全漏洞挖掘SKILL、一站式云漏洞挖掘工具,支持S3爆破、IMDS探测、K8s检测与AK/SK权限利用
前端·人工智能·网络安全·云原生·容器·kubernetes·系统安全
不简说5 小时前
JS 代码技巧 vol.9 — 20 个设计模式在真实项目里的应用
前端·javascript·github