vue3 + element 从0到1搭建前端基础框架

news2024/12/27 11:20:25

一、框架搭建

框架代码
个人博客

往往从0到1开发项目时发觉无从下手,或者很可能一步一个坑,因为大多基础框架公司已经搭建完毕的,新加入的成员也都是在此基础上进行功能模块的拓展。网上也鲜有详尽的全流程参考,多是某个局部功能的搭建,因此整理了一份包含以下方面的前端基础框架全流程搭建要义。

在这里插入图片描述

二、构建与安装

构建项目

# 执行 vite3 构建命令
yarn create vite

依次输入项目名称,选择 vue、typescript 进行构建,此时一个 vue3 项目就构建完成了。

// 版本信息
"vite": "^3.2.3",
"vue": "^3.2.41"

安装常用库

项目创建好后需要安装一些项目需要的库,包含一些必备的库和一些被广泛使用的工具库,安装库的原则是评估一下现有需求和未来可能会出现的需求,是否会经常使用到该库,假设说这是一个一次性交付的项目,项目中可能从始至终只使用到这个库的一个方法,那么这种情况下就不必引入该库,自己封装即可。

评估需求后一个常用的后台管理系统必备以下的库:

# 路由
yarn add vue-router@4
# 状态管理
yarn add pinia
# 组件库
yarn add element-plus
# 网络请求
yarn add axios

以下的库则可以按需引入:

# 使用 less 或 scss 均可简化样式方面的开发,自行选择顺手的即可
yarn add less
yarn add less-loader
# 如果需要在前端对数据进行一些复杂操作,loadsh 也是必不可少的存在
yarn add loadsh
# qs 库是一个用来序列化 post 请求中的 body 参数的库
yarn add qs
# day.js 是用来处理时间格式的库,相比 moment.js 更加的轻量
yarn add dayjs
# 如果项目有国际化需求的话需要引入 vue 官方提供的解决方案 vue-i18n
yarn add vue-i18n
# 图表库,不考虑数据量级的话,该库算是非常新手友好了
yarn add echart
# 代码规范的库,好的规范可以让代码有更持久的生命力
yarn add eslint
# 支持 svg 图标的库
yarn add vite-plugin-svg-icons -D
yarn add fast-glob -D

目前项目中需要使用到的一些常用的库都已经安装完毕,可以先提交一版 git,养成小步迭代的好习惯。

安装完毕后需要修改一些文件来规范项目信息和适配各个库,包含但不限于以下文件:

  • package.json 里的项目名称和版本
  • index.html 的网站标题和图标、首屏加载动效
  • .gitignore 里是否需要添加一些匹配的文件来阻止上传至 git
  • vite.config.ts 配置一些规则,比如绝对路径别名、svg 支持等
  • tsconfig.json 配置绝对路径规则
  • main.ts 导入全局使用的库
  • 创建环境文件 .env

然后将修改好的代码提交至 git 库,到此准备工作就完成了。

三、基础框架结构

文件结构

src
|- api
   |- interceptors     // 接口请求封装
|- assets              // 图片等静态资源
   |- svg              // svg 文件
|- components          // 全局组件
|- consts              // 定义一些全局常量
|- locales             // 国际化文件
|- models              // 类型定义文件
|- router              // 路由文件
|- store               // 状态管理文件
|- styles              // 样式文件
   |- theme.less       // element 主题及组件样式修改
   |- variables.less   // 常用样式封装成 class
|- utils               // 通用工具封装
|- views               // 页面文件
   |- components       // 业务组件

接口请求相关文件 /api

首先是对接口请求的拦截逻辑,需要先思考接口请求前需要做什么,接口请求后需要对结果有什么处理,然后哪些参数是所有接口通用的,大致需求如下:

  • 请求前需要先检查 token 是否存在,而哪些是像登录接口这样不需要 token 的
  • 请求后需要针对 401、500 等无法返回正确结果的状态码进行处理
  • 请求的前缀和超时时间是通用的,不需要每次请求都配置一遍

因此 /src/api/interceptors 文件夹中需创建五个文件:

  • cancel.ts
  • errors.ts
  • index.ts
  • request.ts
  • response.ts
  • http.ts
// 首先看 http.ts
export const http = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API + '/api/v1',
  withCredentials: true,
  timeout: 60000,
});
http.interceptors.request.use(requestHandler, errorHandler);
http.interceptors.response.use(responseHandler, errorHandler);

http.ts 文件是对 axios 请求的封装,定义接口的通用前缀同时加入拦截器。

request.ts 文件的 requestHandler 方法来判断本地存储是否有 token,来选择跳到登录页还是继续发起请求。

response.ts 文件的 responseHandler 方法则是对响应进行处理,一般是用来存储接口在响应头中携带的 token。

errors.ts 文件的 errorHandler 方法则是对错误状态码进行处理,如果 401 则清除本地 token 并跳转到登录页,如果是其他错误类型则使用 element 的 message 组件弹出接口返回的错误信息。

cancel.ts 文件较为特殊,是针对接口竞态处理的文件,需要看业务是否有需要,如果请求还没完成,重复请求该接口会取消上一个请求,防止接口重复请求时由于新请求响应早于旧请求而导致旧的结果覆盖新的结果。

index.ts 文件用于导出该文件夹下的所有文件,建议每个封装通用内容的文件夹下都使用这个进行导出,这样的话其他模块引入的路径就不需要精确到具体文件,而是精确到该文件夹。好处是如果对某个文件改名,不需要查找整个项目来看哪些地方引入了该文件,只需要在 index.ts 中修改即可。

静态资源文件 /assets/svg

svg 文件常用来作为 icon 使用,单独说一下 svg。如果当业务需求较为简单时,element 提供的官方图标完全能够满足需求,不需要单独再设计一组图标,而当 element 图标库不满足需求时,则应该建议 UI 设计提供 svg 格式的图标,相比 png 格式有以下优点:

  • svg 图标体积更小
  • svg 不会出现图片无法加载时的裂开效果
  • svg 更适配 element 方案
  • svg 是矢量图,无限放大也不会模糊

除此之外也可以引入第三方图标库如 Font Awesome。

组件 /components

components 文件夹有两个,一个是 /src/components,另一个是 /src/views/components,其中第一个是用来存放通用组件的,比如用来显示 svg 的 svg-icon.vue。而业务开发中所需要的业务组件,无法给全局使用的建议放到 views 文件夹下的 components 中。

全局常量 /const

存放一些全局通用的常量,比如任务状态等。

export const TaskStatusMap = {
    1: "waiting",
    2: "running",
    3: "completed",
    4: "pause",
    5: "cancel",
    6: "error"
}

国际化文件 /locales

较为简单参考 vue-i18n 的文档即可,不过要注意的是表单校验的文言就需要单独封装一个方法来进行配置了。而还有一种前端国际化覆盖不到的就是后台接口返回的文言,这种文言解决方案建议是处理请求头,请求头中可以携带国际化信息,后台根据请求头来返回文言,而不是通过前端 body 传参的方式。

参考文档

类型文件 /models

用于规范类型,也是为了规范而存在的。

// 后台返回的分页数据类型
export interface MetaModel {
    pageNo: number;
    pageSize: number;
    total: number;
}

路由 /router

路由方面官方文档也比较健全,唯一需要注意的地方就是可以添加一个匹配规则,当用户输入的路由不存在时默认跳转到首页或者错误页,而不是给用户一个报错。

{
   path: "/:pathMatch(.*)*",
   redirect: { name: "Home" },
}

状态管理 /store

使用了新一代状态管理 pinia,官方有文档,略。

参考文档

样式文件 /styles

样式文件主要有两个,一个是 theme.less,这个文件用来适配项目主题,一些通用样式的修改都在这里,比如主题色、element 组件样式,原生组件比如单选框、a标签的样式等。

另一个是 variables.less,这个文件主要定义一些通用变量和用来封装一些样式 class。比如文字超出时显示…的效果,就可以定义成一个 class,这样全局使用的时候不需要每个页面复写一遍样式,直接加个 class 即可。

以前做的很多项目,拿到设计图之后由于每个人负责不同的页面,都在各自的页面里去修改样式。但是设计往往是有一个固定的规范的,比如按钮这种组件整个系统应该是一致的,这种时候就需要在 theme.less 中对组件库的按钮样式进行更改,而不是在每个页面中都去修改一遍按钮样式。而且要依照组件库文档进行修改而不是去改 background-color 这些基础 css,因为组件库的一个组件可能包含多种动效比如 hover、disabled、click 等是静态设计图体现不出来的,直接用基础 css 样式修改可能会覆盖掉原本的动效。

// element 官方建议的其中一种修改主题的方式
:root {
    --el-color-primary: rgba(95, 1, 133, 1);
    --el-color-primary-light-1: rgba(95, 1, 133, 0.9);
    --el-color-primary-light-2: rgba(95, 1, 133, 0.8);
    --el-color-primary-light-3: rgba(95, 1, 133, 0.7);
    --el-color-primary-light-4: rgba(95, 1, 133, 0.6);
    --el-color-primary-light-5: rgba(95, 1, 133, 0.5);
    --el-color-primary-light-6: rgba(95, 1, 133, 0.4);
    --el-color-primary-light-7: rgba(95, 1, 133, 0.3);
    --el-color-primary-light-8: rgba(95, 1, 133, 0.2);
    --el-color-primary-light-9: rgba(95, 1, 133, 0.1);
}

工具方法 /utils

放一些全局方法,比如对数字加逗号的处理、监听 localstorage 存储等。

三、一些额外问题

二次封装

这套前端基础框架没有对组件库二次封装,而选择直接使用官方组件库。

很多论坛有帖子是对组件库的二次封装,前司甚至自己写了一套 angular 组件库出来,而这是否有必要论坛里对此也是褒贬不一,需要衡量一下二次封装的成本。

一是二次封装的维护成本,二是新人上手的开发成本,进行二次封装后的组件很难有官方组件库那样详尽的文档,同时也需要开发者长期的进行维护与迭代,这样必然会造成资源的占用。而新人的上手成本也需要考量,花多长的学习时间才能熟练运用也是需要进行评估的,目前大部分二次封装的组件因为没有文档的辅助无法做到开箱即用。

而官方组件库经过多年的持续打磨与迭代,很多优秀工程师的共同努力,已经是一个相对来说较为平衡的版本,足够满足大多数功能而又维持必要的可拓展性。因此如果项目每个页面都是较为定制化,那么使用官方组件库即可。如果公司项目以外包为主或者重复性高比如每个页面都是xx管理这种一套增删改查类表格的话,可以根据业务对组件库进行二次封装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】webpack的基本使用

✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录webpack的学习目标前端工程化 小白眼中的前端开发 vs 实际的前端开发 什么是前端工程…

CISP考试大纲/范围

CISP考试主要是考CISP知识体系大纲,分别为信息安全保障、信息安全技术、信息安全管理、信息安全工程和信息安全标准法规这五大知识类,每个知识类根据其逻辑划分为多个知识体,每个知识体包含多个知识域,每个知识域由一个或多个知识…

Java项目:SSM失物招领管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 主要功能包括: 用户发布失物,或者招领失物,管理员对用户,失物信息进行增删改查。 环境需要 1…

新课程教学杂志新课程教学杂志社新课程教学编辑部2022年第19期目录

核心素养 核心素养视域下的历史教学设计——以“清朝君主专制的强化”为例 王威; 1-3 新中考背景下文本分析能力与核心素养的培育 黄嫄; 4-5《新课程教学》投稿:cn7kantougao163.com 基于核心素养的物理教学评价改良 李红; 6-7 初中语文综合性学习的…

Metabase学习教程:系统管理-6

Metabase可扩展性 扩展Metabase以支持更多人和数据库的最佳实践。 Metabase是一个可扩展的、经过实战的软件,被成千上万的公司用来提供高质量的自助服务分析。它通过水平扩展支持高可用性,而且它是开箱即用的高效工具:一台拥有4gb内存的单核…

vue.js axios 数据不刷新

getServerList(){axios.get(/server/showList).then(function(response){this.servers response.data // 不刷新console.log(response.data)}).catch(function (error) {console.log(error);}); } 打印this:this不是vue对象修改为:getServerList(){axi…

Mysql各种缓冲区的功能及之间的联系

buffer poolmysql数据存放在磁盘里面,如果每次查询都直接从磁盘里面查询,会影响性能,因此需要内存态缓存池。另外缓存池的淘汰机制不是基础LRU,而是是改进版LRU,防止大量临时缓存挤出热点数据。buffer pool读缓存分为老…

代码随想录算法训练营第五十三天| LeetCode1143. 最长公共子序列、LeetCode1035. 不相交的线、LeetCode53. 最大子数组和

一、LeetCode1143. 最长公共子序列 1:题目描述(1143. 最长公共子序列) 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一…

Leetcode 1687. 从仓库到码头运输箱子 [四种解法] 动态规划 从朴素出发详细剖析优化步骤

你有一辆货运卡车,你需要用这一辆车把一些箱子从仓库运送到码头。这辆卡车每次运输有 箱子数目的限制 和 总重量的限制 。给你一个箱子数组 boxes 和三个整数 portsCount, maxBoxes 和 maxWeight ,其中 boxes[i] [ports​​i​, weighti] 。ports​​i …

网页制作课作业基于HTML+CSS+JavaScript+jquery仿慕课网教学培训网站设计实例 企业网站制作

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

【强化学习论文】离线元强化学习中基于对比学习的稳定表示

离线元强化学习中基于对比学习的稳定表示 最近几年来深度强化学习在算法上有很多进展,已初步用在很多场景中。目前深度强化学习有两个重要的问题:数据利用问题,泛化能力。深度强化学习通常要与环境进行大量的交互,通常效率较低&am…

Redis数据库 ---- 五种数据类型常用命令汇总

❤️ 作者简介:大家好我是小鱼干儿♛是一个热爱编程、热爱算法的大三学生,蓝桥杯国赛二等奖获得者🐟 个人主页 :https://blog.csdn.net/qq_52007481⭐ 个人社区:【小鱼干爱编程】 文章目录RedisRedis键(key)数据库相关…

Java面向对象:对象的概念及面向对象的三个基本特征

面向对象简称 OO(Object Oriented),20 世纪 80 年代以后,有了面向对象分析(OOA)、 面向对象设计(OOD)、面向对象程序设计(OOP)等新的系统开发方式模型的研究。…

element-ui 中 el-tree 和 el-table 样式调整

使用 el-tree 和 el-table 时&#xff0c;往往需要根据项目整体环境做一些样式调整&#xff0c;记录一下常用样式。 el-tree <!-- 树结构 --> <el-treeref"tree":data"data":props"defaultProps":default-expand-all"isExpanded&…

51单片机烟雾报警器mq2烟雾报警ADC0832采集实践制作DIY- GC0026-烟雾报警器

一、功能说明&#xff1a; 基于51单片机设计-烟雾报警器 功能介绍&#xff1a; STC89C52单片机&#xff08;AT89C51/52&#xff09;lcd1602adc0832mq2烟雾传感器蜂鸣器2个按键设定报警阈值 1.通过ADC0832采集MQ2烟雾输出的电压换算位烟雾浓度0~100 2.如果烟雾浓度超过设定…

机器学习9衡量线性回归法的指标,MSE,RMS,MAE

文章目录一、衡量线性回归法的指标&#xff0c;MSE,RMS,MAE1、MSE均方误差&#xff08;Mean Squared Error&#xff09;2、RSE均方误差&#xff08;Root Mean Squared Error&#xff09;3、平均绝对误差MAE&#xff08;Mean Absolute Error&#xff09;二、演示&#xff1a;三、…

清华、北大、中科大、UMA、MSU五位博士生畅聊深度学习理论

点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入&#xff01;伴随着深度学习的蓬勃发展&#xff0c;进入人们视线的好像都是算法或AlphaGo等应用层面的东西。但是在理论上&#xff0c;深度学习似乎却没有很出圈的相关理论。因此&#xff0c;部分人也在批评深度学习是缺乏理论…

易基因课程回顾|表观遗传学和表观育种在品种改良中的应用研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 传统作物育种包括杂交、选择所需性状的遗传变异&#xff0c;导致遗传基础缩窄和遗传多样性缺失&#xff0c;从而阻碍作物改良。表型性状受遗传学和表观遗传学影响&#xff0c;利用表观遗传…

简单个人网页设计作业 静态HTML个人主题网页作业 DW个人网站模板下载 大学生简单个人网页作品代码 个人网页制作 学生个人网页Dreamweaver设计作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Spring框架(十二):实现日志功能通过SpringBean后处理器

实现日志功能通过SpringBean后处理器引子需求分析实现Log功能Spring Bean的后置处理器引子 痛定思痛&#xff0c;主要问题出现在自己雀氏不熟悉框架底层、一些面试题&#xff0c;以及sql的一些情况淡忘了。 本章节的开始是对于过去的重新回顾&#xff0c;当然&#xff0c;我也…