2026/4/18 4:21:35
网站建设
项目流程
设置网络的网站,乐潍清网站额建设,敬请期待换个说法,网站icp 备案查询一、前置认知#xff1a;为什么前端需要架构设计#xff1f;前十三篇我们完成了从基础开发、工程化到跨端开发的能力构建#xff0c;这些技能足以支撑中小项目或单一模块的开发。但职场中#xff0c;当面对“10人以上团队维护、千万级用户访问、年迭代百次以上”的大型项目…一、前置认知为什么前端需要架构设计前十三篇我们完成了从基础开发、工程化到跨端开发的能力构建这些技能足以支撑中小项目或单一模块的开发。但职场中当面对“10人以上团队维护、千万级用户访问、年迭代百次以上”的大型项目时仅关注“功能实现”会导致项目陷入“牵一发而动全身”的困境——比如修改一个通用按钮样式导致多个页面错乱新增业务模块时需要重构大量原有代码高并发场景下页面加载卡顿甚至崩溃。前端架构设计的核心价值在于以“长期可维护性、高扩展性、高性能、高可用性”为目标通过抽象化、模块化、规范化的设计解决大型项目中的复杂性问题支撑业务持续迭代。这是前端开发者从“中级”迈向“高级”的核心标志也是企业保障大型项目稳定运行的关键。职场数据据字节跳动前端团队实践报告显示实施规范架构设计的大型项目新增模块开发效率提升35%线上故障率降低45%代码重构成本降低60%未进行架构设计的项目在迭代1年后维护成本会增长2-3倍。二、Day40架构思维建立——从“开发者”到“设计者”的转变架构设计的本质是“权衡与决策”而非单纯的技术堆砌。在动手设计前需先建立架构思维明确架构设计的核心原则和决策维度避免陷入“为了架构而架构”的误区。1. 前端架构设计的4大核心原则架构设计没有“银弹”但遵循核心原则可确保设计方向不偏离目标这是所有大型项目架构的共性基础高内聚低耦合核心定义模块内部职责单一且紧密关联高内聚模块之间依赖关系清晰且尽量减少低耦合实战体现将“用户登录、注册、信息修改”封装为用户模块模块内部提供完整的用户管理能力对外仅暴露标准化接口其他模块无需关心其内部实现反例将用户登录逻辑和商品展示逻辑混在同一组件中修改登录逻辑时可能影响商品展示。开闭原则核心定义对扩展开放对修改关闭——新增功能时通过扩展模块实现而非修改原有稳定代码实战体现设计支付模块时预留支付方式扩展接口新增“支付宝支付”时只需开发支付宝支付插件并接入接口无需修改原有微信支付的核心代码价值减少修改原有代码带来的风险保障核心模块稳定性。单一职责原则核心定义每个模块、组件、函数只负责一个明确的职责实战体现将“数据请求、数据格式化、UI渲染”拆分为三个独立模块——api模块负责请求utils模块负责格式化components模块负责渲染价值提高代码复用性便于测试和维护如修改数据格式时仅需调整utils模块。最小知识原则核心定义模块之间仅通过公开接口交互不深入了解彼此的内部实现实战体现订单模块需要用户信息时通过用户模块提供的getUserInfo()接口获取而非直接读取用户模块的内部状态价值降低模块间的依赖风险当用户模块内部重构时只要接口不变订单模块无需修改。2. 架构决策的5大关键维度架构设计的过程是基于业务需求在多个维度上做决策的过程不同项目的决策优先级不同需结合实际场景权衡决策维度核心关注点高优先级场景决策示例性能页面加载速度、交互响应速度、并发处理能力电商首页、直播页面、高并发活动页采用“CDN加速懒加载服务端渲染SSR”架构可扩展性新增业务模块的成本、技术栈升级的兼容性SaaS平台、多业务线聚合平台采用“微前端”架构支持独立业务模块开发和部署可维护性代码可读性、文档完整性、问题定位效率长期迭代的核心业务系统如交易系统制定统一的代码规范、模块命名规则和接口文档标准可用性系统稳定性、容错能力、降级策略支付系统、金融相关业务采用“接口熔断降级重试”机制关键接口多活部署开发效率团队协作效率、脚手架支持、复用能力快速迭代的创业项目、营销活动页采用“组件库模板工程”减少重复开发3. 实战1架构需求分析——从业务到技术的拆解架构设计必须基于业务需求脱离业务的架构是空中楼阁。以“电商平台”为例进行架构需求拆解业务需求梳理核心业务商品展示、购物车、订单管理、支付、用户中心非核心业务营销活动秒杀、优惠券、评价系统、物流查询业务特点商品和订单数据实时性要求高秒杀场景并发量大支付流程安全性要求高。技术需求转化性能需求商品列表首屏加载时间1.5s秒杀场景支持10万用户并发扩展性需求支持新增“跨境商品”业务线支持接入新的支付方式可用性需求支付模块可用性99.99%支持故障自动降级如支付失败时提示重试维护性需求团队按业务线分工商品组、订单组、支付组模块需独立开发和测试。架构目标确定核心目标支撑高并发秒杀场景保障支付流程稳定支持多业务线扩展次要目标提升团队协作效率降低跨模块沟通成本。三、Day41核心架构模块设计——大型项目的“骨架”搭建基于架构思维和需求分析接下来进行核心模块设计。大型前端项目的架构骨架通常由“分层架构核心模块”组成分层确保代码职责清晰核心模块支撑业务落地。1. 前端通用分层架构设计分层架构是前端架构的基础通过纵向分层实现“关注点分离”不同层级负责不同职责便于维护和扩展。以Vue3项目为例推荐采用“6层架构”src/ ├── 1. 接入层Entry # 应用入口负责初始化和环境配置 │ ├── main.js # 应用入口文件初始化Vue、路由、Pinia等 │ ├── App.vue # 根组件路由出口、全局布局 │ └── environments/ # 环境配置开发、测试、生产环境变量 ├── 2. 路由层Router # 路由管理负责页面跳转和权限控制 │ ├── index.js # 路由实例创建 │ ├── routes/ # 路由配置按业务线拆分 │ └── guards/ # 路由守卫权限控制、页面拦截 ├── 3. 视图层View # 页面组件负责UI渲染和用户交互 │ ├── common/ # 通用页面404、登录页 │ ├── product/ # 商品业务页面 │ ├── order/ # 订单业务页面 │ └── user/ # 用户业务页面 ├── 4. 组件层Component # 通用和业务组件负责UI复用 │ ├── common/ # 通用组件按钮、表格、弹窗 │ ├── product/ # 商品业务组件商品卡片、详情页组件 │ └── order/ # 订单业务组件订单列表项、支付弹窗 ├── 5. 业务逻辑层Service # 业务逻辑处理负责数据加工和逻辑封装 │ ├── productService.js # 商品业务逻辑商品查询、筛选、排序 │ ├── orderService.js # 订单业务逻辑创建订单、取消订单 │ └── userService.js # 用户业务逻辑登录、获取用户信息 ├── 6. 数据层Data # 数据获取和存储负责与后端交互和本地存储 │ ├── api/ # 接口请求按业务线拆分 │ ├── store/ # 状态管理Pinia模块 │ └── storage/ # 本地存储localStorage、sessionStorage封装 └── 公共工具层Common # 全局通用资源支撑各层运行 ├── utils/ # 工具函数格式化、校验、加密 ├── styles/ # 全局样式主题、变量、混入 └── assets/ # 静态资源图片、图标、字体各层核心职责与交互流程接入层启动应用加载全局依赖初始化环境配置路由层接收用户跳转请求通过路由守卫校验权限后渲染对应视图层页面视图层页面组件通过调用业务逻辑层的方法获取数据渲染组件层的组件接收用户交互并触发业务逻辑业务逻辑层接收视图层的请求调用数据层获取原始数据进行业务加工如筛选、格式化后返回给视图层封装核心业务逻辑数据层api模块负责与后端接口交互store模块负责全局状态管理storage模块负责本地数据存储交互流程用户点击商品详情按钮 → 路由层跳转 → 视图层商品详情页渲染 → 调用productService.getProductDetail() → api模块请求后端接口 → 业务逻辑层加工数据 → 视图层渲染商品详情组件。2. 核心模块设计实战——以电商平台为例在分层架构基础上针对核心业务设计独立模块确保业务逻辑的内聚性。以下是电商平台3个核心模块的设计方案实战2商品模块设计高并发场景优化商品模块是电商平台的核心面临“高并发访问、数据实时更新、多维度筛选”等需求设计重点在于“性能优化”和“数据缓存”# 1. 数据层api/productApi.js—— 接口请求封装 import request from ../request; export const productApi { // 获取商品列表支持分页、筛选 getProductList: (params) { return request({ url: /api/product/list, method: GET, params, // 缓存配置列表数据缓存5分钟减少重复请求 cache: { enabled: true, expire: 5 * 60 * 1000, key: productList_${JSON.stringify(params)} // 按参数生成唯一缓存key } }); }, // 获取商品详情实时性要求高不缓存 getProductDetail: (id) { return request({ url: /api/product/${id}, method: GET }); }, // 秒杀商品接口高并发场景添加请求限流 getSeckillProduct: (id) { return request({ url: /api/product/seckill/${id}, method: GET, // 限流配置同一用户1秒内最多请求1次 throttle: { enabled: true, delay: 1000, key: seckill_${id}_${localStorage.getItem(userId)} } }); } };# 2. 业务逻辑层service/productService.js—— 业务逻辑封装 import { productApi } from ../data/api/productApi; import { useProductStore } from ../data/store/productStore; import { formatPrice, formatDate } from ../../common/utils/format; export const productService { // 获取商品列表带筛选和格式化 async getProductList(params) { const productStore useProductStore(); // 显示加载中状态 productStore.setLoading(true); try { const res await productApi.getProductList(params); // 业务数据加工格式化价格和日期添加默认图片 const formattedList res.data.list.map(item ({ ...item, price: formatPrice(item.price), // 格式化价格为“XX.XX” createTime: formatDate(item.createTime), // 格式化日期 coverImage: item.coverImage || https://default-product.png // 默认图片 })); // 存储到状态管理 productStore.setProductList(formattedList); productStore.setTotal(res.data.total); return formattedList; } catch (err) { console.error(获取商品列表失败, err); // 错误处理显示错误提示 uni.showToast({ title: 商品加载失败, icon: none }); throw err; } finally { // 隐藏加载中状态 productStore.setLoading(false); } }, // 秒杀商品抢购核心业务逻辑 async seckillProduct(productId, quantity) { const productStore useProductStore(); // 1. 校验库存本地先校验减少无效请求 const product productStore.productList.find(item item.id productId); if (!product || product.stock quantity) { uni.showToast({ title: 库存不足, icon: none }); return false; } // 2. 调用秒杀接口 try { await productApi.seckillProduct(productId, { quantity }); // 3. 秒杀成功更新本地库存跳转订单页 productStore.updateProductStock(productId, quantity); uni.navigateTo({ url: /views/order/Create?productId${productId}quantity${quantity} }); return true; } catch (err) { // 秒杀失败根据错误类型提示 if (err.response.data.code 1001) { uni.showToast({ title: 秒杀已结束, icon: none }); } else { uni.showToast({ title: 抢购失败请重试, icon: none }); } return false; } } };!-- 3. 视图层views/product/List.vue—— 页面渲染与交互 -- template div classproduct-list-page !-- 筛选组件组件层 -- ProductFilter searchhandleSearch / !-- 加载中状态 -- Loading v-ifproductStore.loading / !-- 商品列表组件层 -- div classproduct-list ProductCard v-forproduct in productStore.productList :keyproduct.id :productproduct clickhandleGoDetail(product.id) seckillhandleSeckill(product.id) / /div !-- 分页组件组件层 -- Pagination :totalproductStore.total :page-sizepageSize page-changehandlePageChange / /div /template script setup import { ref, onMounted } from vue; import { useRouter } from vue-router; import { productService } from ../../service/productService; import { useProductStore } from ../../data/store/productStore; import ProductFilter from ../../components/product/ProductFilter.vue; import ProductCard from ../../components/product/ProductCard.vue; import Loading from ../../components/common/Loading.vue; import Pagination from ../../components/common/Pagination.vue; const router useRouter(); const productStore useProductStore(); const pageSize ref(10); const currentPage ref(1); const searchParams ref({ category: , priceRange: }); // 页面加载时获取商品列表 onMounted(() { handleGetProductList(); }); // 获取商品列表调用业务逻辑层 const handleGetProductList async () { await productService.getProductList({ page: currentPage.value, pageSize: pageSize.value, ...searchParams.value }); }; // 筛选事件 const handleSearch (params) { searchParams.value params; currentPage.value 1; // 重置为第一页 handleGetProductList(); }; // 分页切换 const handlePageChange (page) { currentPage.value page; handleGetProductList(); }; // 跳转到商品详情 const handleGoDetail (id) { router.push(/product/detail/${id}); }; // 秒杀商品 const handleSeckill async (id) { const success await productService.seckillProduct(id, 1); if (success) { // 秒杀成功逻辑业务逻辑层已处理跳转 } }; /script实战3权限模块设计通用型架构权限控制是大型项目的必备模块涉及“路由权限、按钮权限、接口权限”设计重点在于“通用化、可配置”避免在业务代码中散落权限判断逻辑# 1. 数据层store/permissionStore.js—— 权限状态管理 import { defineStore } from pinia; import { permissionApi } from ../api/permissionApi; export const usePermissionStore defineStore(permission, { state: () ({ roles: [], // 用户角色如admin、user、merchant permissions: [] // 用户权限列表如product:view、order:create }), actions: { // 初始化权限登录后调用 async initPermission(userId) { const res await permissionApi.getUserPermission(userId); this.roles res.data.roles; this.permissions res.data.permissions; // 存储到本地避免刷新丢失 localStorage.setItem(roles, JSON.stringify(this.roles)); localStorage.setItem(permissions, JSON.stringify(this.permissions)); }, // 从本地加载权限页面刷新时调用 loadPermission() { const roles localStorage.getItem(roles); const permissions localStorage.getItem(permissions); if (roles permissions) { this.roles JSON.parse(roles); this.permissions JSON.parse(permissions); } }, // 检查是否有指定权限 hasPermission(permission) { // admin角色拥有所有权限 if (this.roles.includes(admin)) return true; return this.permissions.includes(permission); }, // 检查是否有指定角色 hasRole(role) { return this.roles.includes(role); } } });# 2. 路由层guards/permissionGuard.js—— 路由权限守卫 import { usePermissionStore } from ../../data/store/permissionStore; import { useUserStore } from ../../data/store/userStore; // 路由权限守卫控制页面访问权限 export const permissionGuard (to, from, next) { const permissionStore usePermissionStore(); const userStore useUserStore(); const isLogin userStore.isLogin; // 1. 未登录跳转到登录页 if (!isLogin) { next(/login?redirect to.path); return; } // 2. 已登录但未加载权限加载权限后再判断 if (permissionStore.permissions.length 0) { permissionStore.initPermission(userStore.userId).then(() { handlePermissionCheck(); }); return; } // 3. 已加载权限判断是否有权限访问当前页面 handlePermissionCheck(); // 权限检查核心逻辑 function handlePermissionCheck() { // 无需权限的页面如首页 if (!to.meta.requirePermission) { next(); return; } // 需要指定权限检查是否拥有 const requirePermission to.meta.requirePermission; if (permissionStore.hasPermission(requirePermission)) { next(); } else { // 无权限跳转到403页面 next(/403); } } };!-- 3. 组件层components/common/PermissionButton.vue—— 按钮权限组件 -- template button v-ifhasPermission :classclassName click$emit(click) :disableddisabled slot/slot /button /template script setup import { computed } from vue; import { usePermissionStore } from ../../data/store/permissionStore; const permissionStore usePermissionStore(); // 接收权限参数 const props defineProps({ permission: { type: String, required: true, // 必须指定需要的权限 default: }, className: { type: String, default: }, disabled: { type: Boolean, default: false } }); // 计算是否拥有权限 const hasPermission computed(() { return permissionStore.hasPermission(props.permission); }); /script!-- 4. 视图层中使用权限按钮 -- template div classorder-page h2订单管理/h2 !-- 只有拥有order:create权限的用户才能看到创建订单按钮 -- PermissionButton permissionorder:create classNamecreate-btn clickhandleCreateOrder 创建订单 /PermissionButton !-- 只有拥有order:delete权限的用户才能看到删除按钮 -- PermissionButton permissionorder:delete classNamedelete-btn clickhandleDeleteOrder :disabled!selectedOrderId 删除订单 /PermissionButton /div /template四、Day42架构落地与演进——从“设计”到“实践”的闭环架构设计不是一成不变的需要通过“规范落地、技术支撑、持续演进”形成闭环确保架构在项目迭代中持续发挥价值避免设计与实践脱节。1. 架构规范落地——确保团队执行一致性架构设计需要通过规范固化让团队所有成员按统一标准执行。大型项目需制定以下核心规范目录结构规范明确各层目录的命名规则如业务模块以业务名称命名工具函数按功能分类规定文件命名规则如组件采用PascalCase工具函数采用camelCase常量采用UPPER_SNAKE_CASE示例商品业务组件命名为ProductCard.vue工具函数文件命名为formatUtils.js常量文件命名为CONSTANT.js。接口规范统一api模块的请求封装如所有请求携带token统一错误处理规定接口命名规则如获取列表用getXXXList新增用addXXX修改用updateXXX要求接口文档化使用Swagger或YApi管理接口文档api模块添加接口注释。代码提交规范延续工程化阶段的huskycommitlint配置按“类型(模块): 描述”格式提交如feat(product): 新增商品筛选功能要求提交时关联需求或bug编号如fix(order): 修复订单支付失败问题 #123便于追溯。架构评审规范新增业务模块前必须进行架构评审确认模块在分层架构中的位置和依赖关系评审重点是否符合高内聚低耦合原则、是否有扩展能力、是否与现有架构冲突。2. 架构落地的技术支撑工具通过工具自动化支撑架构规范落地减少人工约束成本提升执行效率脚手架工具基于Vue CLI或Vite定制项目脚手架内置分层架构目录、规范配置和基础模块新增业务模块时通过脚手架命令快速生成模板如npm run new:module product生成商品模块的目录和基础文件。ESLint定制规则在ESLint中添加架构相关的自定义规则如禁止视图层直接调用api模块必须通过业务逻辑层、禁止跨模块直接引用组件示例规则禁止在.vue文件中直接import api模块// .eslintrc.js 自定义规则rules: {no-direct-api-import: error // 自定义规则禁止直接导入api模块}可视化工具使用Webpack Bundle Analyzer分析模块依赖关系发现耦合过高的模块并优化使用SonarQube监控代码质量设置架构相关的质量门禁如模块依赖深度不超过3层。3. 架构持续演进——应对业务变化的核心策略业务在不断变化架构也需要持续演进避免成为“技术负债”。架构演进需遵循“小步迭代、灰度验证、数据驱动”的原则演进触发场景业务扩张如新增跨境电商业务线原有商品模块无法支撑多语言、多货币需求性能瓶颈如原有单体架构在并发量提升后出现加载卡顿需要拆分为微前端技术升级如Vue2升级到Vue3需要调整状态管理和组件写法。演进实战案例——从单体架构到微前端原有问题电商平台初期采用单体架构商品、订单、用户模块耦合紧密新增营销模块时需要修改大量原有代码团队协作冲突频繁演进方案采用qiankun微前端架构按业务线拆分为独立应用主应用负责路由分发、权限管理、全局状态共享子应用商品应用、订单应用、用户应用、营销应用独立开发、部署和迭代通信方式通过qiankun的全局通信机制实现子应用间数据交互。演进步骤第一步主应用搭建实现路由分发和基础权限控制第二步将原有单体应用中的商品模块拆分为独立子应用接入主应用第三步依次拆分订单、用户、营销模块为子应用逐步替换原有功能第四步优化子应用间通信和共享依赖提升性能。演进效果各团队独立开发子应用协作冲突减少70%新增营销活动迭代周期从15天缩短至5天。演进注意事项避免“大爆炸式”重构一次性重构整个架构风险极高采用“逐步拆分、灰度替换”的方式保留兼容层新架构上线初期保留原有架构的兼容接口确保业务平滑过渡数据驱动决策通过性能监控、错误统计等数据判断架构是否需要演进避免主观决策。五、3天总结前端架构设计职场能力清单架构思维掌握高内聚低耦合、开闭原则等核心架构原则能基于业务需求进行架构决策明确性能、扩展性等维度的优先级分层架构设计能设计“接入层-路由层-视图层-组件层-业务逻辑层-数据层”的分层架构明确各层职责和交互流程核心模块设计能针对高并发、权限控制等场景设计核心业务模块实现业务逻辑封装和性能优化架构落地能力能制定目录结构、接口、提交等架构规范通过脚手架、ESLint等工具保障规范落地架构演进能力能识别架构演进的触发场景采用“小步迭代”的方式实现架构升级如从单体架构迁移到微前端作业基于之前的电商项目完成以下任务① 按照“6层架构”重构项目目录结构② 设计并实现权限模块包含路由守卫和按钮权限控制③ 撰写架构设计文档说明架构分层、核心模块设计和规范要求。下一篇预告Day43-45 前端性能优化进阶——从“可用”到“极致”对标职场“高并发场景优化”需求