Vue3 UIKit 实战:把聊天、会话、主题和移动端适配全部封装好
最近需要给一个 Vue 3 项目补上聊天能力,我原本以为工作量主要在 SDK 接入:登录、建连、收消息、发消息。真正把需求拆开后才发现,SDK 只是开始。
会话列表要处理未读数、置顶和草稿;消息区要考虑历史消息加载、滚动位置、发送状态、撤回和引用;图片、语音、文件各有一套交互;到了移动端,还会遇到安全区、软键盘和长按菜单。
这些功能都能自己写,但很难一次写完整。更现实的问题是:它们并不是产品真正想做出差异化的部分,却会持续占用大量开发时间。
我换了个思路,直接体验并梳理了一遍 Vue3 UIKit(@easemob-community/uikit-im)。 Vue3 UIKit 是基于 easemob-websdk(SDK5)构建的 Vue 3 UI 组件库。它把「会话列表、聊天页、通讯录、群管理、消息收发、已读回执、主题、H5 适配」这些每个 IM 产品都要重做一遍的东西,做成了一套开箱即用的组件。
我的目标不是看它的 Demo 漂不漂亮,而是解决以下三个实际问题:
文中的界面截图都来自线上 Demo。如果对某项能力感兴趣,可以直接打开验证。
然后在页面里放一个容器组件,一个完整的聊天应用就立起来了:
对比一下自研的成本:会话列表的未读数与置顶排序、消息气泡的十几种状态、历史消息的分页加载与滚动锚定、断线重连后的数据恢复……每一项都是以「周」为单位的工程量,而在这里它们是默认值。
当然,“三行代码接入”不等于项目从此不需要开发。登录体系、用户数据、权限规则和业务消息仍然要接。但至少 IM 界面中最通用的部分,不用再从消息气泡开始造一遍。
接入过程比我预想的快。安装 UIKit、Pinia 和 Vue:
然后在入口文件里注册 UIKit,并引入 SDK 适配器和主题:
做到这里,出来的并不是两块静态 UI,而是已经串起来的会话列表和聊天页。对于技术验证阶段,这一点很重要:我可以先确认账号、会话、消息链路是否符合需求,再决定要不要继续投入,而不是先花一两周搭页面骨架。
当然,“几行代码接入”不等于项目从此不需要开发。登录体系、用户数据、权限规则和业务消息仍然要接。但至少 IM 界面中最通用的部分,不用再从消息气泡开始造一遍。
一开始我最关注的是消息类型,实际体验后反而觉得,会话状态和消息交互的完整度更有价值。
UIKit 的 EmConversationContainer 已经处理了全部、未读、@我、单聊和群组等分栏,也带有搜索、未读徽标、置顶、免打扰、草稿提示和下拉刷新,每一项都可以通过 props 开关或定制。
如果自己实现,这些功能看起来都不难,麻烦的是组合在一起:新消息到达后未读数要变,置顶会话仍要按规则排序,草稿不能被最后一条消息覆盖,筛选结果还要同步刷新。UIKit 的意义,是把这些相互关联的状态放进了一套现成逻辑里。
EmChatContainer 是真正的重头戏。长按或右键消息后,可以看到引用、复制、转发、多选、编辑、撤回、置顶、翻译和删除等操作。转发也不只支持单条消息,还包括逐条转发和合并转发。
消息类型覆盖文本、图片、语音、视频、文件、位置、合并转发和自定义消息。输入区自带 Emoji 与 IP 表情包面板。
群聊里的成员昵称、消息时间分组和气泡状态也有默认处理,不需要为了群聊再拼一套页面。
这里有几个细节让我觉得它不只是为了截图做出来的 Demo:
单看其中任何一项都不算“黑科技”,但如果自己补齐,每一项都会带来状态、异常路径和测试成本。组件库的价值,恰恰体现在这些不值得重复开发、又不能做得太糙的地方。
不少聊天 UI 方案只把重点放在消息页,真正接入时才发现联系人、好友申请、黑名单和群管理都要自己做。
这套 UIKit 的 EmContactContainer 已经包含好友、群组、新请求和黑名单视图。好友列表有搜索和字母索引,联系人详情里可以备注、发消息、拉黑和删除。
群详情抽屉里则可以管理成员、群名称、群公告和群文件,也包括免打扰、置顶、清空记录与解散群聊。
来源:稀土掘金 原文