- uni-ui:v1.5.12
- wot ui:v2.3.2
- 2026-08-20 00:34:36
uni-app 多端底层适配,性能可能会更好?
比如 SwipeAction 组件:
uniapp 在 App Vue、H5、微信小程序使用 WXS 类视图层优化,nvue 使用 BindingX,其他不支持的平台才回退普通 JS。(uniapp.dcloud.net.cn)
Wot UI v2 的 wd-swipe-action 源码使用 touchstart、touchmove、touchend 在 Vue 逻辑层计算位移,并在移动过程中获取宽度、更新 translate3d 样式,没有使用 WXS。(raw.githubusercontent.com)
所以在大列表和持续跟手操作里,uni-swipe-action 的技术路线更让人有信心。
但也不能说“整个 Wot UI 性能差”。Button、Tag、Input、Cell、Popup、Form 这些组件通常不是高频跟手计算场景, WOT UI 视觉设计统一,完整 Design Token、CSS 变量、ConfigProvider,方便定制主题接入系统, 主题定制比 uni-ui 方便很多。
以下来自Codex gpt-5.6-sol 极高推理总结:
一句话概括:
uni-ui 更像“跨端基础设施组件库”,Wot UI 更像“带完整视觉体系的产品级组件库”。
核心对比
| 维度 | uni-ui | Wot UI v2 |
|---|---|---|
| 核心优势 | 官方、跨端、稳定、性能优化 | 视觉统一、组件丰富、主题定制完善 |
| 跨端可靠性 | 更强,平台覆盖更广 | 主流端较好,但需要认真回归 |
| 主题系统 | 很弱,变量零散,组件硬编码较多 | 三层 Design Token,支持全局、局部和组件级变量 |
| 全量换肤 | 很困难,需要覆盖源码或维护补丁 | 基本可行,少数细节仍需局部覆盖 |
| 默认视觉 | 简单、偏工具化,不够统一 | 现代、完整,一致性更好 |
| 性能敏感交互 | 部分组件有 WXS、BindingX 等专项优化 | 普通场景没有明显问题,但手势长列表需要实测 |
| easycom | 原生支持 | 支持,npm 模式增加配置即可 |
| PC、H5 | 官方明确考虑宽屏适配 | 支持 H5,但整体仍偏移动端设计 |
| 暗色模式 | 没有完整统一体系 | 原生支持 |
| 维护保障 | DCloud 官方,长期风险较低 | 社区团队,维护风险高于 DCloud |
| 二次开发成本 | 初期较低,深度美化后很高 | 初期迁移有成本,后续维护更轻松 |
uni-ui 的优点
- DCloud 官方维护,与 uni-app 编译器、easycom 和各小程序平台结合更紧密。
- 跨端覆盖广,支持 App、H5、nvue、各种小程序以及宽屏设备。
- 部分性能敏感组件做了平台专项处理。
- 例如 uni-swipe-action 在微信小程序、H5、App Vue 中使用 WXS 优化,其他平台提供 JavaScript 回退。
- 平台差异、状态栏、节点测量、后台资源消耗等问题,官方拥有更多处理经验。
- 适合业务功能和跨端稳定性优先、视觉要求相对一般的项目。
uni-ui 的缺点
最大问题正是目前发现的:uni-ui 没有真正意义上的统一主题系统。
uni-sass 主要是一套颜色、间距、圆角等辅助样式类,需要单独引入。它并不代表所有 uni-ui 组件都会自动读取 uni.scss 中的变量。
结合当前项目使用的 uni-ui 版本和组件源码来看:
- 项目的 uni.scss 并不是引入错了。
- 很多 uni-ui 组件根本没有读取 uni.scss 中的变量。
- 有些组件使用另一组变量,例如 $uni-primary。
- 有些组件在内部重新定义了同名变量。
- 有些颜色、字号和高度直接硬编码在组件中。
- 输入框高度、背景色、组件圆角等缺少统一配置入口。
因此,如果继续使用 uni-ui,并希望实现全量统一视觉,通常只能选择:
- 编写大量局部样式覆盖。
- 使用 patch-package 修改组件源码。
- 维护自己的 uni-ui fork。
随着组件数量和页面数量增加,后续升级和维护成本也会越来越高。
Wot UI v2 的优点
Wot UI v2 的主题系统更加符合建设统一设计系统的需求。
它的主题变量主要分为以下层级:
- 基础变量:基础颜色、字号和尺寸。
- 语义变量:品牌主色、正文色、边框色和背景色。
- 组件变量:按钮背景、Input 高度、字号、圆角和内边距等。
它支持:
- 全局 CSS 变量。
- 局部 ConfigProvider 配置。
- 组件级主题变量。
- 暗色模式。
- 国际化。
项目可以把自己的主题变量映射给 Wot UI:
page,
.wd-root-portal {
--wot-primary-6: var(--app-color-primary);
--wot-text-main: var(--app-text-color);
--wot-border-main: var(--app-border-color);
--wot-input-height: 88rpx;
}
具体组件还会提供类似下面的变量:
--wot-input-bg
--wot-input-font-size
--wot-button-primary-bg
--wot-popup-radius
这种方式比依赖组件内部 class 名进行样式覆盖稳定得多。
Wot UI v2 目前拥有较为完整的组件体系,支持微信小程序、支付宝小程序、钉钉小程序、H5 和 App 等主流平台。
Wot UI 支持 easycom
npm 安装方式可以在 easycom 中增加下面的规则:
{
"easycom": {
"autoscan": true,
"custom": {
"^wd-(.*)": "@wot-ui/ui/components/wd-$1/wd-$1.vue"
}
}
}
配置完成后,页面可以直接使用:
<wd-button>提交</wd-button>
<wd-input></wd-input>
因此,Wot UI 可以使用 easycom,不需要在每个页面手动导入组件。
Wot UI v2 的缺点
- 不是 DCloud 官方组件库,团队规模和长期持续维护能力无法与 DCloud 相比。
- 虽然支持主流平台,但不代表每个小程序平台都经过相同强度的验证。
- 小程序样式隔离、root-portal、弹层尺寸初始化等场景仍需特殊处理。
- 部分被移动到页面根节点的组件,可能无法自动继承外层 ConfigProvider。
- Tabs、Slider 等依赖尺寸测量的组件放在延迟渲染弹层中时,可能需要在打开后重新计算尺寸。
- 长列表滑动、SwipeAction 和复杂手势场景需要在真实设备上测试。
Wot UI 可以做到高度主题化,但也不能理解为绝对百分之百覆盖所有样式。
- Wot UI 组件自身的大部分视觉可以由主题变量接管。
- 少数组件细节仍可能需要 custom-class、custom-style 或 :deep() 覆盖。
- 页面本身、uni-app 原生组件、系统导航栏等内容仍需由项目自己的主题系统控制。
如何选择
如果项目更看重以下目标:
- 覆盖更多小程序平台。
- App 和 nvue 能力。
- 跨端稳定性。
- 性能敏感的手势组件。
- 官方长期维护保障。
那么更适合选择 uni-ui。
如果项目更看重以下目标:
- 统一品牌视觉。
- 完整的主题变量体系。
- 统一控制颜色、字号、高度、背景和圆角。
- 暗色模式。
- 更丰富、更现代的组件。
- 降低后续页面样式维护成本。
那么更适合选择 Wot UI v2。
针对当前项目的建议
当前项目的主要目标是:
- 支持 H5、微信小程序和 App。
- 建立统一的视觉设计。
- 统一控制颜色、字号、Input 高度、背景色和圆角。
- 继续对组件进行深度美化。
- PC 端基本可用即可。
基于这些需求,我更倾向于:
使用 Wot UI v2 作为主要 UI 组件库,配合 uni-app 原生组件。少数性能或平台敏感组件经过实测后,再决定是否保留 uni-ui。
现在的需求已经不只是偶尔修改主色,而是在建设项目自己的设计系统。
继续使用 uni-ui,短期迁移成本更低,但后续每增加一个页面或组件,都可能继续面对组件硬编码样式和主题变量不生效的问题。
Wot UI 初期存在迁移和跨端验证成本,但在视觉统一、主题维护和后续开发效率方面更有优势。
建议先做跨端验证
不建议立即全量迁移,可以先建立一个组件验证页面,重点测试:
- Navbar 和状态栏安全区。
- Input、Textarea、Form 和 Picker。
- Popup、Dialog 和 Toast。
- Tabs 和 Steps。
- 长列表中的 SwipeAction。
- 键盘顶起。
- 弹层滚动穿透。
- 底部安全区。
- 主题变量和暗色模式。
- H5、微信小程序和 App 的实际表现。
验证通过后,再逐步迁移当前项目使用的 uni-ui 组件。
项目规范注意事项
当前项目的 AGENTS.md 明确规定:
- UI 框架固定使用经典 npm 版 uni-ui。
- 禁止重新引入 Wot UI 或其他 UI 组件库。
这属于当前项目规范,并不是技术层面的最终结论。
如果最终决定切换到 Wot UI,需要先明确修改这条项目规范,然后再调整依赖、easycom 配置和现有页面组件。