07 — 与 uni-app 等方案的横向对比
说明:uni-app 源码不在本仓库内,下表基于 公开架构信息 与 Taro 本仓库可验证实现 对比;建议表述为「典型差异」,避免绝对化。
1. 目标与边界
| 维度 | Taro(本仓库) | uni-app(业界常见描述) |
|---|---|---|
| 主战场 | 强依赖 React / Vue / Solid 等真实框架语义;小程序是「另一宿主」 | 以 Vue 为主(vue2/3),另支持部分其他写法;跨端历史更久 |
| DSL | 业务代码即框架代码(JSX/SFC) | 单文件 .vue + 条件编译(#ifdef)常见 |
| 渲染 | 小程序:自定义运行时 + 模板 + setData;H5:更接近标准 Web | 小程序:Vue runtime 定制 + 模板;H5:Web |
2. 「一套语法 → 各端源码」在实现上的差异
Taro(可引用本仓库)
- JS/TS:Babel(Webpack)或 esbuild(Vite)转译 + bundler 打包。
- UI 树:框架通过 Reconciler / universal renderer 操作 Taro 实现的类 DOM。
- 视图数据:
hydrate把节点树变成 小程序 data 协议,模板(shared生成)负责 如何绑定。 - 样式:PostCSS 链按端转换单位与资源;class/style 进 data(见
template.ts的styles映射)。
uni-app(概念层)
- 编译期 更多把 Vue template 转到 小程序 template,script 侧运行 裁剪后的 Vue runtime。
- 条件编译 在预处理阶段删掉部分代码,实现端差异(Taro 更常用 运行时 API 抽象 + 平台包;也有
p等模式)。rocess.env.TARO_ENV
总结句:Taro 3+ 强调 「框架完整 + 宿主薄适配层」;uni-app 传统上更偏 「以 Vue 为轴心的编译转换」。
3. 生态与扩展
- Taro:插件内核
Kernel+platform-*分包;官方 RFC 流程(见根 README)。 - uni-app:
uni_modules、easycom、更重的 DCloud 工具链一体(CLI、HBuilderX)。
4. 选型启发(非拉踩)
- 团队 React 技术栈、需要 react-reconciler 级语义 → Taro 更自然。
- 团队 Vue 为主、强依赖 条件编译与 uni 生态物料 → uni-app 往往更省整合成本。
- 鸿蒙 / RN 等:两者都在演进,需看 当前版本平台包成熟度(本仓库可见
taro-platform-harmony、taro-rn多条线)。
5. 可追溯的 Taro 依据(答「你怎么知道 Taro 这么干的」)
- 模板两维度注释:
packages/shared/src/template.ts文首。 - React 接入:
packages/taro-react/src/reconciler.ts。 - setData 调度:
packages/taro-runtime/src/dom/root.ts。 - 编译器只认 webpack5/vite:
packages/taro-service/src/platform-plugin-base/platform.ts。