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: `/// <reference types="./typings.d.ts" />\nimport request from "@request"`,
  // 代码组织命名空间, 例如:Api
  namespace: "Api",
});

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" });

4.技术说明

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

5.前端架构源码

点此查看前端架构源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenAPI(前称Swagger)是一个用于设计、构建、文档化和使用 RESTful API 的开放源代码工具集。它使用 JSON 或 YAML 格式来描述 API,包括 API 的请求和响应参数、操作、身份验证等信息。以下是一个简单的 OpenAPI 规范示例: ```yaml openapi: 3.0.0 info: title: My API version: 1.0.0 servers: - url: https://api.example.com/v1 paths: /users: get: summary: Get a list of users operationId: getUsers responses: '200': description: OK content: application/json: schema: type: array items: type: object properties: id: type: integer name: type: string post: summary: Create a new user operationId: createUser requestBody: required: true content: application/json: schema: type: object properties: name: type: string responses: '201': description: Created content: application/json: schema: type: object properties: id: type: integer name: type: string ``` 在这个示例中: - `openapi` 指定了所使用的 OpenAPI 版本。 - `info` 包含了 API 的基本信息,如标题和版本号。 - `servers` 定义了 API 的 URL。 - `paths` 定义了 API 的所有路径和操作。在这个示例中,我们定义了一个 `/users` 路径,包含了 `get` 和 `post` 操作。 - `get` 操作定义了获取用户列表的方式。它有一个 `summary` 描述、一个 `operationId` 标识符和一个 `responses` 对象,其中包含了 HTTP 响应码和相应的响应体。 - `post` 操作定义了创建新用户的方式。它有一个 `summary` 描述、一个 `operationId` 标识符、一个 `requestBody` 对象,其中包含了请求体的参数和类型,以及一个 `responses` 对象,其中包含了 HTTP 响应码和相应的响应体。 当你使用 OpenAPI 规范设计和构建 API 时,你可以使用这个示例作为参考,定义你的 API 的所有路径、操作和参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值