前端架构
主要罗列些一些前端领域里的架构设计上的思考点、要素、问题以及收集的开源项目方案...
- 前端架构
- 前端框架-视图层的解决方案
- MDV
- 组件化
- 组件是对视图以及与视图相关的逻辑、数据、交互等的封装
- 视图驱动、组件优先的开发模式
- 在前后分离的模式下,大多数前端业务开发流程都是以视图驱动为主,并且在前端框架组件概念的设计下,形成了以组件优先的开发模式:
- 先根据 UI 稿子拆分成组件、面向组件写页面
- 再根据原型文档与接口完成业务交互
- 在视图驱动下,State 是围绕 View 的消费和交互需求而产生的,View 是组件真正核心的部分,这就导致在视图组件里编写越来越多的代码,并成了一个流行趋势,组件同时承载了界面逻辑和业务逻辑
- 在前后分离的模式下,大多数前端业务开发流程都是以视图驱动为主,并且在前端框架组件概念的设计下,形成了以组件优先的开发模式:
- 组件拆分与复用:组件拆分可以从以下几个维度进行:
- 按页面组件层次结构:拆分时需要你理解页面结构、和业务和交互
- 按功能逻辑角度:前端框架的组件是应用构成基本单位,而不是逻辑复用的最小单位:组件包含视图渲染逻辑和状态交互逻辑,比如在某些业务场景下,视图一样但面对用户角色不同需要的业务交互逻辑不一样;反之,同样的业务逻辑在移动端和 PC 端表现的视图又不一样的情况。按功能逻辑拆分有:
- 视图组件
- UI 组件
- headless UI 组件
- 逻辑组件
- 业务逻辑组件
- 视图组件
- 组件范式
UI = f(state)=> 组件即函数的范式- react
- component:
(props) => jsx - hooks:
(props) => others
- component:
- vue:
(props, ctx) => render/others
- 组件驱动下的前端状态管理
- 组件化
- Component Tree => state tree + 单向数据流
- 通信困难:整个应用最终以组件树的形式组织展示,组件封装状态逻辑,逻辑自治,但分散在组件树,树形结构阻碍了组件数据通信
- 状态提升、分层
- 容器模式
- 单向数据流
- 状态提升、分层
- 全局化
- 状态与组件分离: Flux 架构,单向数据流 state -> UI
- 全局状态的生命周期管理很麻烦
- 职责分类:业务状态、UI 状态、应用状态
- 业务状态倾向于放到高层模块里
- UI 状态作为 UI 的映射关系适合放到组件等局部状态里
- 应用状态则作为全局状态
- 状态管理库设计
- 范式,如
- 不可变
- 状态机
- 生命周期管理
- 页面路由级 栈
- 数据持久化
- DX
- devtools
- 热模块更新
- 事件回溯
- 范式,如
- 组件化
- 项目架构
- MVC
- MV*
- View:展示数据、用户交互
- Event => Logic => State => UI => ...
- 事件驱动业务逻辑:人机交互的业务逻辑本身,是【针对人的行为做出反馈】
- 数据驱动视图
- ViewModel
- Event => Logic => State => UI => ...
- Store:存储状态
- Servcie:后端接口交互
- Model 贫血的 data
- View:展示数据、用户交互
- SSR
- 页面适配
- 图标
- 前端项目开发中的规范
- 前端工具
- 低代码
- 微前端
- 前端框架-视图层的解决方案
SSR
- SSR
- 原理
- Vue
- Vue SSR 基础教程
- vue hydrate
- 原理:vnode 与原生 node 做 diff
- 激活失败,即预渲染的 HTML 的 DOM 结构与 vDom 结构匹配不上时。它将尝试自动恢复并调整预渲染的 DOM 以匹配客户端的状态,这将导致一些渲染性能的损失,因为需要丢弃不匹配的节点并渲染新的节点
- SSG = SSR + prerender
- 通用框架 = 前端框架 + BFF
低代码
- 低代码
- 核心
- 数据模型
- 数据协议模型
- UI 描述模型
- UI 组件
- 交互逻辑描述
- 数据校验
- 数据逻辑联动
- 提示
- 设计器
- 渲染器
- 核心
- JSON Schema
- JSON Schema 验证器:ajv
- XRender
图标
- Web 图标方案
- 图片
- CSS sprites +
background-image+background-position
- CSS sprites +
- 字体图标
- 原理:占用私有 Unicode 字符编码区域
- 使用:
@font-face+ class-name + 伪元素(::before,::after) - 缺点
- 无法按需引入
- 网络开销大
- 字体冲突
- SVG
- 保真
- 控制图标的颜色
- 无需编码,可按需加载
- SVG Symbol
<svg> <defs> <symbol id="shape-icon-1"> <!-- icon paths and shapes --> <symbol> <symbol id="shape-icon-2"> <!-- icon paths and shapes --> <symbol> <!-- etc --> </defs> </svg> <svg viewBox="0 0 16 16" class="icon"> <use xlink:href="#shape-icon-1"></use> </svg>
- 图片
- 设计思考
- 优先 SVG 图标
- 在前端视图层框架中封装成组件使用
- 图标类型提示和按需引入,如
- 组件类型,每个图标单独一个组件
- 图标名枚举 + SVG Symbol
- 第三方开源
前端工具
- 构建工具
- feature
- 输入
- 资源模块化:一切皆模块,非 JavaScript 类型资源支持导入
- 转化
- 链接打包
- 压缩
- 转译
- 死代码消除(DCE,Dead Code Elimination/TreeShaking)
- 符号内联替换
- 环境变量
- 输出
- 代码拆分
- URL Hash
- Target
- 模块机制
- 环境
- 输入
- 工具
- feature
- 测试工具
- 单元测试
- jest
- vitest
- e2e 测试
- 单元测试
- 调试工具
- DevServer
- 热模块替换
- APIMock
- DevTools
- SourceMap
- DevServer
- 文档
其他文章
交流区
加载中...