多渠道移动端组件库 Titian 开发实践

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. 多渠道移动端组件库 Titian 开发实践 牛壮 - 前端技术专家 2023 Weimob Technical Salon 丨 FE 回复“沙龙” 进群与讲师互动
2.
3. 讲师介绍 牛壮 微盟 · 前端技术团队技术专家,移动端组 件库 Titian 和交易前端负责人。主要负 责移动端组件库 Titian 的前端架构设计、 开发、底层能力设计和对外开源,以及交 易前端的公共业务框架设计和开发维护。 主要专注于多渠道组件库与核心交易体系 搭建,在该领域有丰富的经验。
4. 目 录 01. Titian的价值点 背景 & 解决问题 02. Titian 提供了什么 能力 & 应用场景 03. Titian 的技术方案 研发过程与技术方案 04. 后续规划 Figma转码 & UI Tokens
5. 01. Titian 的价值点 背景 & 解决问题
6. 背景 研发 设计 - 代码重复冗余,导致小程 序体积变大 - 各模块各自实现功能,面 临多次重复验收 - 小程序/H5 各有一套代 码实现,增加工作量 - 需要统一收口样式,减轻 验收压力
7. 实现价值 提高开发效率 统一UI设计语言 降低代码冗余 沉淀技术品牌 多端小程序/H5提供统一的 API 接入方式 有效避免UI多次反复验收的情况 提高验收效率 重复冗余的代码统一收敛到 组件库内部 打造有影响力的技术资产 可持续发展
8. 02. Titian 提供了什么 组件 / 规范 / 多渠道
9. 大量组件 - - - 60+ 组件 全局 / 布局 / 表单 / 展示 / 反 馈 / 导航 / 业务 自由搭配,千变万化
10. 设计规范 - 颜色 / 圆角 / 布局 / 字体 / 图标 / 投 影 - 全局变量:颜色 / 圆角 / 图标
11. 多渠道&多框架 多渠道 小程序 - H5 & 小程序 API 一致 - 丰富的渠道支持 H5 多 前端框 架
12. 反馈组件 小红书小 程序 css 变量 github 开源 p np m 多端编译 种草笔 记 - uild 快手小 程序 微盟云 ISV 接入 按需 加载 导购 - e sb 小程序多渠道 / React / Vue 支付宝小 程序 分销 - CMS 开发效率高 WOS 内 300+ 页面 微信小程 序 H5多框架 百度小 程序 - H5 QQ小 程序 互动营 销 OneCR M 商城 展 示 组 件 件 组 单 表 生态 企微助 手 线下大 屏 Titian UI 微盟 C 端组件库 统一接口 web components 可交互示例 jest单测 主题 动态 切换 d oc u sa u r us
13. 03. Titian 的技术方案 小程序 / H5 / 周边工具 / 文档
14. 目录 1. 小程序 框架分层解析 / 研发流程举例 / 示例 / 源码 / 单测 / 多渠道能力 02. H5 Web Components 技术 / Stencil 框架介绍 03. 周边工具 & 文档 TouchEmulator / 文档建设 / 开源建设
15. 3.1 小程序框架分层 文档: Button / Tag / Popup / … 示例 & 单测: Button / Tag / Popup / … 组件: Button / Tag / Popup / … 公共层:全局 CSS 变量 / 公共 utils 函 数 编译打包: 从 ts / less 生成 esm 包 版本管理: SemVer 版本 / npm 发版脚本 小程序文件结构 包管理: pnpm 及辅助工具
16. 3.1 小程序 3.1.1 包管理 & 辅助工具 pnpm: 快速 / 高速 / 单体仓库 / 权限严格 - 同类工具速度的2倍 - 采用硬链接方式,节省 node_modules 体积 - 默认非扁平结构,防止“幽灵依赖” 辅助工具 - - - eslint stylelint cz-customizable
17. 3.1 小程序 3.1.2 多仓库介绍 - - - - - cli: 打包工具入口 snippets: vscode 提示插件 compiler: 自研打包编译工具 prettier-plugin-wxml: 自研 wxml 格式化插件 weapp: 小程序源码
18. 3.1 小程序 3.1.3 CLI titian-cli 工具: - 提供基础的 start, build, release 命令 - 提供 CommandHooks 钩子框架 - 基于 tapable 的 syncHook 能力 - - 编译阶段钩子: beforeInit / init / afterInit / beforeRun/ run / afterRun / watch / release UserConfig 配置 - 指定配置,如项目路径/hooks/编译 器等
19. 3.1 小程序 3.1.4 Compiler 选择 esbuild 工具: - 基于 Go 语言写的打包器,比 webpack 快 100倍 - 支持 js / ts / css / jsx,可输出 esm 和 commonJS 使用 titian-cli 提供的生命周期 hooks 钩子 - buildTs - buildLess
20. 3.1 小程序 3.1.5 SemVer 版本管理 语义化版本管理 - - 支持多个环境,如开发/测试/灰度/正式 支持破坏性的更新。 举例: 16.7.1-alpha.0 < 16.7.1-beta.0 < 16.7.1-rc.0 < 16.7.1 ▪ ▪ ▪ ▪ alpha - 不稳定测试版 beta - 预发布版 rc - 稳定测试版 latest - 线上正式版
21. 3.1 小程序 3.1.6 发版脚本 - - - - - - - 1.从当前分支切出 feature/ 发版分支 2.选择要发布的 packages 3.根据 SemVer 约定,通过 command 选 择版本号 4.拉取 commit msg,生成 change log 5.提交,生成tag 6.推送远程分支,推送 npm 7.小程序自动发布预览码
22. 3.1 小程序 3.1.7 公共基础 CSS 变量 内容: 颜色 / 圆角 / 布局 / 字体 / 图标 / 投 影 组件内变量,继承自基础变量
23. 3.1 小程序 3.1.8 全局圆角方案 需求 - 潮流型 = 椭圆角 - 通用型 = 直角 - 可爱型 = 圆角 方案 - 对于业务方: - 设置 –base-radius-size 变量 - 设置 –capsule-radius-size 变量 - 对于组件: - 小圆角组件使用 @radius-4 - 胶囊圆角组件使用 @special-radius-4
24. 3.1 小程序 3.1.9 Icon 多风格方案 需求: - 潮流型 - 通用型 - 可爱型 方案: - 多个 font family 实现同一个 icon - 切换 font family 名即可 优点: - 业务方无感接入 - 体积
25. 3.1 小程序 3.1.10 公共 BaseComponent - 所有组件继承于该 Class - 提供能力: - externalClasses 中,增加 ext-class - parent / children 转换为 ancestor / descendant - options 中, 打开 multipleSlots / addGlobalClass 价值:提供公共的属性 -
26. 3.1 小程序 3.1.11 公共 Utils - 工具函数 - 提供能力: - 兼容 nextTick - 兼容 requestAnimationFrame - 数据类型判断方法 - 节流 / 防抖 - 日期辅助计算函数
27. 3.1 小程序 3.1.12 组件 API 设计原则 属性 / 方法 / CSS 变量 / 事件 / 插槽 文档在先,开发在后 经历内部评审之后,再开始研发 组件之间有共性,也有特殊性
28. 3.1 小程序 3.1.13 举例:Dialog 组件 - 常规设计: - 属性 / 方法 / 插槽 / CSS 变量 / 外部 样式类 - 特殊点:两种调用方式 - DOM 式 = <ti-dialog /> - API 式 = $tiDialog.show - 继承封装:通过封装 Popup 组件,得到 Dialog 组件
29. 3.1 小程序 3.1.13 举例:Dialog 组件 - 如何实现 API 式调用 $tiDialog.show: - 方案:$tiDialog 下挂载静态方法 show; show 方法使用 selectComponent 查询 DOM 节点 - 如何适配分包异步加载: - 方案:返回 proxy,劫持get 方法;然 后使用 selectComponent 轮询
30. 3.1 小程序 3.1.14 举例:SkuSelector 组件 背景 1. 2. 已知数据如右,SKU + 规格 + 默认 SKU ID 交互有 3 种状态:选中 / 可选 / 不可 选 思考 1. 2. 3. 4. 5. 选中项 = onTap 或初始化即可得到 可选项= ? 不可选项= ? 如果再加一种状态:售罄项 = ? 入参 / 事件 / 插槽 / CSS 变量,如 何设计? 套餐 套餐1 套餐2 套餐3 颜色 红色 紫色 - 内存 64G 128 G 256 G 表1. 规格集合 ID 1 紫色 套装1 128 G ID 2 紫色 套装1 64G ID 3 紫色 套装2 128 G ID 4 红色 套装2 256 G ID 5 表2. 可用 SKU 集合 红色 套装2 128 G
31. 3.1 小程序 3.1.14 举例:SkuSelector 组件 A.选中项: 无向图 红色:可以切换的顶点;同类; 蓝色:可以连通的顶点;不同类; 相邻:红色 + 蓝色 onTap 或 默认值 B.可选项: 所有“选中项”相邻顶点的集 合 → 如何得到相邻顶点? C.不可选项: 所有“选中项”都不相邻的顶 点 → 如何得到不相邻顶点? 邻接表 右:可连通表 略:可切换表/不可连通表 红色 套装2 128G 256G - 紫色 套装2 64G 128G - 套装1 64G 128G - - 套装2 红色 紫色 128G 256 G 64G 紫色 套装1 - - 128 G 红色 紫色 套装1 套装2 256
32. 3.1 小程序 3.1.14 举例:SkuSelector 组件 三层数据,流转清晰 1. 2. 1. View Model 视图模型 - 属性及状态=可选/禁用/售罄 Data Model 数据模型 - Graph 邻接表=可选表 / 禁用表 / 售罄表 - Selected 选中项 = 动态变化 - Disabled 禁用项 = 随 Selected 变化 - Soldout 售罄项 = 随 Selected 变化 Props 属性 - SKU 列表 - 属性 SPECS 列表 - 默认 SKU ID
33. 3.1 小程序 3.1.15 可交互示例 PagePanel 面板式设计 - 视觉展示 - 根据 attrs 展示组件 - 属性面板 - 生成 attrs
34. 3.1 小程序 3.1.16 单测 工具:miniprogram-simulate / jest 原理:将原本小程序自定义组件双线程分离运行 的机制调整成单线程模拟运行,利用 dom 环境 进行渲染,借此来完成整个自定义组件树的搭建。 getComponent 方法: - 传入组件名/参数 - 加载自定义组件,使用 id 渲染组件,返 回实例 - 对组件做了一个 Cache 缓存 能力举例: - 获取数据 / 更新数据 - 触发事件 - 触发生命周期 - 获取 this
35. 3.1 小程序 3.1.17 接入多渠道 - 中台 titan-cli 转码工具的第一个用户 - 支付宝渠道,反馈 150 + bug,包括诸 多关键能力: - relations 能力 - CSS 的 :host 能力 - externalClass 支持能力 - observer 监听器问题 - 小红书渠道,反馈 70+ bug - wxs 支持能力 - observers 监听器问题
36. 3.2 H5 3.2.1 使用 Stencil 框架 - Stencil 是一个编译器,可以生成 Web Components 代码 - 能力: - 使用 TypeScript, JSX, CSS - 使用 Virtual DOM - 类似于 React 的生命周期 - 支持生成 Vue 和 React
37. 3.2 H5 3.2.2 深入 Web Components 三大组成部分: - 1.Shadow DOM - 2.Template - 3.Custom Elements
38. 3.2 H5 3.2.2 深入 Web Components Shadow DOM & 自定义事件 - retarget: - 内部正常冒泡 - 外部以 web components 组件为起点 - slot 元素正常冒泡 - 自定义事件: - bubbles 是否冒泡 - composed 是否穿越边界 - event.composedPath() 原始事件完整路 径
39. 3.2 H5 3.2.2 深入 Web Components Shadow DOM & CSS - 常规情况,样式是内外隔离的 - :part - 外部指定内部元素的样式 - :host - 指定外部宿主样式 - CSS 变量穿透 插槽 Slot - 具名插槽 / 不具名插槽 - slotChange 事件
40. 3.2 H5 3.2.3 Stencil 如何支持 React Stencil 源码中,支持 React 共计 114 行代码 diaplayName - dash 转为 pascal 格式 生命周期 - 原样调用 componentDidMount - 原样调用 componentDidUpdate 属性 - 通过 forwardedRef 原样传入 事件 - 把 onAbc 事件名改为 abc
41. 3.3 文档 3.3.1 Docusaraus 工具 - 支持 markdown / react 页面 - API 文档采用 markdown - 首页采用 react 页面 - 100+ 模块,可插拔/重写/覆盖
42. 3.4 周边建设 3.4.1 touch-emulator 背景 - PC 上如何支持 Titian 组件库的触摸事 件? 调研 - hammerjs/touch-emulator - 局限:Web Components 内部的 touch 事件无法冒泡,因此滑动不了 方案: - fork 并增加 Web Components 支持能 力 - 从 composedPath() 取 target 元素,依 次冒泡
43. 3.4 周边建设 3.4.2 开源准备 - 代码安全审查 - 删除各种 key - 删除内网域名 - 检查注释内容 - 内网/外网 npm 隔离 - 官网建设 - 首页建设 - 主题样式调整 - 文案宣发
44. 04. 后续规划 更丰富的能力
45. 接入 Figma 转码 Design to Code, D2C 减少前台重复工作量,提升需求流转效率
46. 接入 UI Tokens Tokens 即基础的设计变量; 如:颜色 / 主题 / 字体 / 边距 UED 通过配置,即可定制视觉主题;跳过繁琐的 手写代码阶段;解放生产力。
47. 联动 CanCode 低代码平台 使用 Titian 组件库,拖拽快速成型 与 Figma 联动互通,从 UI 到 CanCode
48. THANK YOU 谢谢你的观看 牛壮 - 前端技术专家 2023 Weimob Technical Salon 丨 FE 回复“沙龙” 进群与讲师互动

首页 - Wiki
Copyright © 2011-2024 iteam. Current version is 2.125.0. UTC+08:00, 2024-05-06 20:05
浙ICP备14020137号-1 $访客地图$