• vue3 ts pinia openapi vue-query pnpm docker前端架构小记


    1.引言

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

    • 项目越大,启动和热更新越来越慢,启动都要花个3-5分钟以上
    • 没有类型保障,接口返回的Object不拿到真实数据都不知道有哪些字段,接手别人js项目(无类型)很痛苦
    • 需要手动写很多request函数去调用api,手动书写各种判断枚举值
    • 缺乏代码格式化,代码错误检查,git commit规范
    • npm包管理问题,比如:多版本的npm包冲突、npm包依赖嵌套、npm僵尸包、npm依赖包平铺到nodule_modules首层
    • 手动变更接口的loading状态、手动管理modal的visible状态
    • 很多热门的开源chatgpt产品: dify、fastgpt,他们都用很新的前端技术,但是仍然是大批量的手写request函数,手写各种枚举,以及interface,很痛苦

    前端架构优势以及展望如下:

    • 支持自动根据openapi生成api request函数、类型、枚举等, openapi数据格式参考
    • 支持前端工程化,完美的ts开发体验,ts + eslint + tslint + prettier + commitlint + husky
    • 支持前端容器化(需要安装docker环境),跨环境运行
    • 同步接口请求状态,实现自动loading
    • 支持接口联动,方便跨父子组件刷新相关联的接口
    • 支持容器化变量注入,无需前端配置文件写死,方便通过 k8s 动态注入
    基于以上痛点,我整合了一些开源技术搭了一套脚手架供自己使用,并分享给大家学习,如果对你有帮助请在github上面给我一个star🙏🙏🙏
    俗话说王婆卖瓜,自卖自夸,各位大佬轻喷!!!
    openapi 规范文档对于前端来说,绝对是超级省事的,必须安排起来!!!
    很多细节没有在文章中提及!!!

    2.脚手架核心技术

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

    // src/core/openapi/index.ts
    
    // 示例代码
    generateService({
      // openapi地址
      schemaPath: `${appConfig.baseURL}/${urlPath}`,
      // 文件生成目录
      serversPath: "./src",
      // 自定义网络请求函数路径
      requestImportStatement: `/// \nimport request from "@request"`,
      // 代码组织命名空间, 例如:Api
      namespace: "Api",
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.调用接口示例

    // HelloGet是一个基于axios的promise请求
    export async function HelloGet(
      // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
      params: Api.HelloGetParams,
      options?: { [key: string]: any },
    ) {
      return request<Api.HelloResp>("/demo-docker/api/v1/hello", {
        method: "GET",
        params: {
          ...params,
        },
        ...(options || {}),
      });
    }
    
    // 自动调用接口获取数据
    const name = ref("zhangsan");
    const { data, isPending, refetch } = useQuery({
      queryKey: ["helloGet", name],
      queryFn: () => HelloGet({ name: name.value || "" }),
    });
    
    // HelloPost是一个基于axios的promise请求
    export async function HelloPost(body: Api.HelloPostParam, options?: { [key: string]: any }) {
      return request<Api.HelloResp>("/demo-docker/api/v1/hello", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        data: body,
        ...(options || {}),
      });
    }
    
    // 提交编辑数据
    const queryClient = useQueryClient();
    const userStore = useUserStore();
    const { mutate, isPending } = useMutation({
      mutationFn: HelloPost,
      onSuccess: (res) => {
        // 第一种刷新方式:修改store
        userStore.updateUserInfo({ name: res.data });
        // 第二种刷新方式:通过清除vue-query缓存key
        queryClient.invalidateQueries({ queryKey: ["helloGet"] });
      },
    });
    
    mutate({ name: "lisi" });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    4.技术说明

    • 自动生成api request函数(openapi): 后端接入apenapi后,前端可以根据openapi文件自动生成api request,后端通常使用swagger转换成openapi规范供前端使用
    • 通用hook(vueuse): 一个hook工具库,就是hook增强,该库可以依据个人喜好选择是否使用
    • 前端日志(sentry): 暂时未集成,需要进一步调研实用性和可用性

    5.前端架构源码

    点此查看前端架构源码

  • 相关阅读:
    Springboot Websocket一般封装方法
    C++ function<>和bind()
    【华为OD机试真题 python】猜密码 【2022 Q4 | 200分】
    SATA系列专题之三:3.2 Transport Layer传输层FIS Retry机制解析
    工业物联网关-modbus数据采集程序(1-程序设计)
    wordpress全站开发指南-面向开发者及深度用户(全中文实操)--wordpress是什么
    CS224W 3.3 Embedding Entire Graphs
    创意写作类国际竞赛有哪些?
    Taro 小程序开启wxml代码压缩
    Python基础入门篇【28】--python初识面向对象
  • 原文地址:https://blog.csdn.net/luo1055120207/article/details/134282662