当前位置: 首页 > news >正文

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

1.引言

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

  • 项目越大,启动和热更新越来越慢,启动都要花个3-5分钟以上
  • 没有类型保障,接口返回的Object不拿到真实数据都不知道有哪些字段,接手别人js项目(无类型)很痛苦
  • 需要手动写很多request函数去调用api,手动书写各种判断枚举值
  • 缺乏代码格式化,代码错误检查,git commit规范
  • 数据流要么太死板,对ts支持很差(dva),要么太灵活(mobx)
  • 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.脚手架核心技术

  • 打包编译 - vite
  • 包管理 - pnpm
  • 编程语言 - typescript
  • 前端框架 - vue3
  • 路由 - vue-router4
  • UI组件库 - element-plus
  • 全局数据共享 - pinia
  • 自动生成api - openapi
  • 网络请求 - axios
  • 数据请求利器 - vue-query
  • 通用hook - vueuse
  • hack - babel
  • 代码检查 - eslint
  • ts代码检查插件 - typescript-eslint
  • 代码美化 - prettier
  • git钩子 - husky
  • commit格式化 -commitlint

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"`,// 代码组织命名空间, 例如:Apinamespace: "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) => {// 第一种刷新方式:修改storeuserStore.updateUserInfo({ name: res.data });// 第二种刷新方式:通过清除vue-query缓存keyqueryClient.invalidateQueries({ queryKey: ["helloGet"] });},
});mutate({ name: "lisi" });

4.技术说明

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

5.前端架构源码

点此查看前端架构源码

相关文章:

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

1.引言 开发中&#xff0c;我们是否经常遇到以下痛点&#xff1a; 项目越大&#xff0c;启动和热更新越来越慢&#xff0c;启动都要花个3-5分钟以上没有类型保障&#xff0c;接口返回的Object不拿到真实数据都不知道有哪些字段&#xff0c;接手别人js项目(无类型)很痛苦需要手…...

ARM day4

LED灯亮灭控制 .text .global _start _start: 1ldr r0,0x50000a28ldr r1,[r0]orr r1,r1,#(0x3<<4)str r1,[r0] 2ldr r0,0x50006000ldr r1,[r0]bic r1,r1,#(0x3<<20)orr r1,r1,#(0x1<<20)bic r1,r1,#(0x3<<16)orr r1,r1,#(0x1<<16)str r1,[r0]…...

3.30每日一题(多元函数微分学)

1、判断连续&#xff1a;再分界点的极限值等于该点的函数值&#xff1b; 如何求极限值&#xff1a; 初步判断&#xff1a;分母都为二次幂开根号&#xff0c;所以分母为一次幂&#xff1b;分子为二次&#xff0c;一般来说整体为0&#xff1b; 如何说明极限为零&#xff08;常用…...

《OSTEP》条件变量(chap30)

〇、前言 本文是对《OSTEP》第三十章的实践与总结。 一、条件变量 #include <pthread.h> #include <stdio.h> #include <assert.h>int buffer; int count 0; // 资源为空// 生产,在 buffer 中放入一个值 void put(int value) {assert(count 0);count 1…...

MySQL的索引和复合索引

由于MySQL自动将主键加入到二级索引&#xff08;自行建立的index&#xff09;里&#xff0c;所以当select的是主键或二级索引就会很快&#xff0c;select *就会慢。因为有些列是没在索引里的 假设CA有1kw人咋整&#xff0c;那我这个索引只起了前一半作用。 所以用复合索引&am…...

关于mac下pycharm旧版本没删除的情况下新版本2023安装之后闪退

先说结论&#xff0c;我用的app cleaner 重新删除的pycharm &#xff0c;再重新安装即可。在此记录一下 之前安装的旧版的2020的pycharm&#xff0c;因为装不了新的插件&#xff0c;没办法就升级了。新装2023打开之后闪退&#xff0c;重启系统也不行&#xff0c;怀疑是一起破解…...

Django中如何让DRF的接口针对前后台返回不同的字段

在Django中&#xff0c;使用Django Rest Framework&#xff08;DRF&#xff09;时&#xff0c;可以通过序列化器&#xff08;Serializer&#xff09;和视图&#xff08;View&#xff09;的组合来实现前后台返回不同的字段。这通常是因为前后台对数据的需求不同&#xff0c;或者…...

【机器学习】Kmeans聚类算法

一、聚类简介 Clustering (聚类)是常见的unsupervised learning (无监督学习)方法&#xff0c;简单地说就是把相似的数据样本分到一组&#xff08;簇&#xff09;&#xff0c;聚类的过程&#xff0c;我们并不清楚某一类是什么&#xff08;通常无标签信息&#xff09;&#xff0…...

getid3 获取视频时长

1、首先&#xff0c;我们需要先下载一份PHP类—getid3https://codeload.github.com/JamesHeinrich/getID3/zip/master 2.我在laravel6.0 中使用 需要在composer.json 自动加载 否则系统访问不到 在命令行 执行 composer dump-autoload $getID3 new \getID3();//视频文件需要放…...

如何知道一个程序为哪些信号注册了哪些信号处理函数?

https://unix.stackexchange.com/questions/379694/is-there-a-way-to-know-if-signals-are-present-in-your-application-and-which-sign 使用 strace...

34 mysql limit 的实现

前言 这里来看一下 我们常见的 mysql 分页的 limit 的相的处理 这个问题的主要是来自于 之前有一个需要处理 大数据量的数据表的信息, 将数据转移到 es 中 然后就是用了最简单的 “select * from tz_test limit $pageOffset, $pageSize ” 来分页处理 但是由于 数据表的数…...

jbase实现申明式事务

对有反射的语言&#xff0c;申明式事务肯定不可少。没必要没个人都try&#xff0c;catch写事务&#xff0c;写的不好的话还经常容易锁表&#xff0c;为此给框架引入申明式事务。申明式既字面意思&#xff0c;在需要事务的方法前面加一个申明&#xff0c;那么框架保证事务。 首…...

如何在在线Excel文档中规范单元格输入

在日常的工作中&#xff0c;我们常常需要处理大量的数据。为了确保数据的准确性和可靠性。我们需要对输入的数据进行规范化和验证。其中一个重要的方面是规范单元格输入。而数据验证作为Excel中一种非常实用的功能&#xff0c;它可以帮助用户规范单元格的输入&#xff0c;从而提…...

力扣138:随机链表的复制

力扣138&#xff1a;随机链表的复制 题目描述&#xff1a; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff…...

C语言左移与右移学习

在学习左移与右移之前&#xff0c;我们首先要学习两种移位运算&#xff1a;逻辑移位和算数移位。 逻辑位移&#xff1a;移出去的位丢弃&#xff0c;空缺位用0补充。 算数位移&#xff1a;移出去的位丢弃&#xff0c;空缺位用符号位补充。 左移 左移是高位溢出&#xff0c;低…...

asp.net core mvc之 视图

一、在控制器中找到匹配视图&#xff0c;然后渲染成 HTML 代码返回给用户 public class HomeController : Controller {public IActionResult Index(){return View(); //默认找 Views/Home/Index.cshtml &#xff0c;呈现给用户} &#xff5d; 二、指定视图 1、控制器 publ…...

ChatGLM3 tool_registry.py 代码解析

ChatGLM3 tool_registry.py 代码解析 0. 背景1. tool_registry.py 0. 背景 学习 ChatGLM3 的项目内容&#xff0c;过程中使用 AI 代码工具&#xff0c;对代码进行解释&#xff0c;帮助自己快速理解代码。这篇文章记录 ChatGLM3 tool_registry.py 的代码解析内容。 1. tool_re…...

js实现定时刷新,并设置定时器上限

定时器 在js中&#xff0c;有两种定时器&#xff1a; 倒计时定时器 倒计时定时器&#xff0c;也叫延时定时器或一次性定时器 功能&#xff1a;倒计时多长时间后执行某个动作 语法&#xff1a;setTimeout(function, timeout); 返回值&#xff1a;int类型&#xff0c;当前定时器…...

常用Linux命令

df -h #查看磁盘 kill -9 pid #强制关闭程序 ifconfig #查看网卡信息 last …...

【C++】获取指定点所在屏幕的尺寸

问题 多个显示器时&#xff0c;获取指定点所在的显示器的尺寸。 分析 之前整理过获取屏幕尺寸的方法&#xff1a;https://blog.csdn.net/m0_43605481/article/details/125024500多显示器时&#xff0c;需要用到GetSystemMetrics、EnumDisplayDevices、EnumDisplaySettings函…...

AES-encryptor实战:从CTF题目到Python加解密工具开发

1. AES加密基础&#xff1a;从CTF题目入门 1.1 什么是AES加密&#xff1f; AES&#xff08;Advanced Encryption Standard&#xff09;是一种对称加密算法&#xff0c;广泛应用于数据保护领域。它使用固定长度的密钥&#xff08;128/192/256位&#xff09;对数据进行加密和解密…...

如何快速集成Element UI行政区划组件:完整指南与省市区联动数据使用教程

如何快速集成Element UI行政区划组件&#xff1a;完整指南与省市区联动数据使用教程 【免费下载链接】element-china-area-data :cn: Element UI && antd Cascader级联选择器 中国省市区三级、二级联动option数据 项目地址: https://gitcode.com/gh_mirrors/el/eleme…...

【PAT甲级真题】- Forwards on Weibo (30)

题目来源 Forwards on Weibo (30) 注意点 下标从 1 开始 题目描述 Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may follow many other users as well. Hence a social network is formed with followers relations.…...

【YOLO系列】YOLO十三载进化论:从v1到v13的模型优化与创新全景复盘

YOLO十三载进化论:从v1到v13的模型优化与创新全景复盘 模型演进与技术突破 站在2026年的节点回望,YOLO系列的进化史不仅是目标检测算法的迭代史,更是一部计算机视觉从“手工特征工程”走向“端到端智能感知”的教科书。从2015年Joseph Redmon的惊鸿一瞥,到如今YOLOv13的超…...

linuxdeployqt企业级应用部署:大规模分发与维护的最佳实践

linuxdeployqt企业级应用部署&#xff1a;大规模分发与维护的最佳实践 【免费下载链接】linuxdeployqt Makes Linux applications self-contained by copying in the libraries and plugins that the application uses, and optionally generates an AppImage. Can be used for…...

m4s-converter终极指南:3分钟解锁B站缓存视频的完整教程

m4s-converter终极指南&#xff1a;3分钟解锁B站缓存视频的完整教程 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾因B站视频下架而痛失…...

告别命令行GDB!用CLion远程调试Linux C++程序,像本地开发一样丝滑

告别命令行GDB&#xff01;用CLion远程调试Linux C程序&#xff0c;像本地开发一样丝滑 在Windows环境下开发Linux服务器程序&#xff0c;一直是C工程师的痛点。传统方式要么在虚拟机里搭建完整开发环境&#xff0c;要么用命令行GDB远程调试——前者资源消耗大&#xff0c;后者…...

微信小程序web-view集成H5视频录制:从需求到填坑的完整实践

1. 银行视频面签需求与技术选型 去年接手了一个银行视频面签项目&#xff0c;客户要求在小程序内实现完整的视频录制功能。具体场景是&#xff1a;用户进入页面后点击开始录制&#xff0c;系统会依次播放预设问题&#xff08;比如"请问您是李先生吗&#xff1f;"&…...

Android驱动工程师深度解析:从开发实践到面试指南

第一章:Android驱动开发核心职责剖析 1.1 Android系统架构深度解构 在嵌入式开发领域,Android系统采用分层架构设计: 应用层(Applications) ↓ 框架层(Framework) ↓ 硬件抽象层(HAL) ↓ Linux内核层(Kernel) ↓ 硬件层(Hardware)**硬件抽象层(HAL)**作为连接…...

用Modbus Poll/Slave模拟PLC数据读写:一个完整的TCP/IP通信调试实例

工业自动化调试实战&#xff1a;基于Modbus Poll/Slave的PLC数据交互全流程解析 在工业自动化领域&#xff0c;Modbus协议作为最广泛应用的通信标准之一&#xff0c;其调试过程往往成为工程师的日常挑战。想象这样一个场景&#xff1a;您需要验证一套温度监控系统的可靠性&…...