Snapchat 开源的移动端跨平台框架 Valdi 详细介绍
1. 背景与动机
- 为何诞生:Snapchat 在内部的多款生产应用中已经使用了 8 年的跨平台 UI 方案。传统的跨平台框架(基于 WebView 或 JavaScript Bridge)在性能、手势、动画等方面往往成为瓶颈。为了解决“开发快但性能差”与“性能好但开发慢”之间的矛盾,Snapteam 打造了 Valdi,并在 2025 年 11 月正式以 MIT 许可证开源。
2. 核心概念
| 概念 | 说明 |
|---|---|
| 声明式 TypeScript/TSX | 开发者使用类似 React 的 JSX 语法编写 UI,所有组件都是声明式的,框架负责把它们编译成原生视图。 |
| 直接编译为原生视图 | 代码在编译阶段被转化为 iOS(UIKit/SwiftUI)、Android(Jetpack Compose/View)以及 macOS(AppKit)层面的原生控件,不依赖 WebView 或 JS Bridge。 |
| 跨平台一次编写,多端运行 | 同一套 TypeScript 代码可生成 iOS、Android、macOS 三个平台的 UI,极大降低了维护成本。 |
3. 技术实现
- 编译器链
- TSX → 中间表示(IR) → 平台特定代码生成(Swift/Obj‑C、Kotlin/Java)。
- 通过 Bazel 完成增量编译与缓存,支持 即时热重载(Hot Reload)和 全 VSCode 调试。
- 渲染引擎
- 自动视图回收(View Recycling)和 视口感知渲染(Viewport‑aware Rendering),保证列表滚动、复杂手势等场景的原生流畅度。
- Flexbox 布局 与 原生动画系统 完全映射,开发者可以使用熟悉的 CSS‑like 样式描述布局与动画。
- 双向通信 & 原生 API
- 自动生成 TypeScript ↔︎ 原生桥接代码,支持 Protobuf、多线程 JavaScript 执行(Worker)以及 原生 API 直接调用,实现高效的数据交互。
- 模块化与插件
- 支持 平台特定视图、嵌入原生模块、以及 多语言模块(如 Swift、Kotlin、C++)的混合开发,便于在已有原生项目中逐步迁移。
5. 主要特性
| 特性 | 价值 |
|---|---|
| 原生性能 | 直接生成原生控件,避免跨平台层的性能瓶颈。 |
| 热重载 & 快速调试 | 代码改动即时生效,提升开发效率。 |
| 声明式组件 | 类 React/TSX 语法,降低学习成本。 |
| 自动视图回收 | 高效列表渲染,降低内存占用。 |
| Flexbox 布局 | 跨平台统一布局模型。 |
| 完整的 VSCode 调试 | 断点、变量查看、堆栈追踪均可在编辑器中完成。 |
| 跨平台代码生成 | 同一套代码产出 iOS、Android、macOS 原生 UI。 |
| MIT 开源许可证 | 允许商业使用、修改、再分发。 |
| 社区与文档 | 官方 GitHub、Discord 讨论区、详细教程与 API 文档。 |
5. 开源情况与许可证
- 仓库地址:
https://github.com/Snapchat/Valdi(GitHub 官方页面) - 开源时间:2025 年 11 月首次公开。
- 许可证:MIT(宽松的开源许可,适用于商业项目)。
- 当前状态:Beta(文档与工具链仍在完善中),但核心功能已在 Snap 的生产环境中稳定运行 8 年。
6. 使用案例与生态
- Snapchat 内部:已在多个核心产品(如聊天、相机、AR 体验)中使用,验证了高并发、复杂手势与实时渲染的可靠性。
- 外部项目:社区已有若干开源示例项目,展示了如何在纯原生项目中嵌入 Valdi 组件,或从零构建跨平台应用。
- 生态:提供 Bazel 构建规则、VSCode 插件、Discord 社区支持,方便开发者快速上手并贡献代码。
7. 入门指南(简要步骤)
- 环境准备:安装 Node.js、Bazel、对应平台的 SDK(Xcode、Android Studio)。
- 克隆仓库:
git clone https://github.com/Snapchat/Valdi.git。 - 创建项目:使用
valdi init脚手架生成 TypeScript/TSX 项目结构。 - 编写组件:在
src/目录下使用 TSX 编写 UI,例如:export const Counter = () => ( <View style={{ flexDirection: 'row', alignItems: 'center' }}> <Text>{state.count}</Text> <Button onPress={() => setState({ count: state.count + 1 })}>+</Button> </View> ); - 编译运行:
bazel build //:app_ios、bazel build //:app_android,或使用valdi dev --hot进行热重载调试。 - 调试:在 VSCode 中设置断点,直接调试 TypeScript 代码,框架会映射到对应的原生堆栈。
8. 适用场景与局限性
| 场景 | 适合度 |
|---|---|
| 高性能社交/媒体 App(实时滤镜、AR、视频) | ★★★★★(原生渲染、低延迟) |
| 企业内部工具(跨平台 UI) | ★★★★☆(开发效率高) |
| 需要大量原生平台特性(系统级权限、硬件加速) | ★★★★☆(可直接调用原生 API) |
| 极度轻量的单页面 Web App | ★★☆☆☆(Valdi 目标是原生而非 Web) |
9. 社区与后续发展
- Discord 讨论区:官方维护的实时聊天社区,开发者可以提问、报告 Bug、提交 PR。
- 文档与教程:官方 GitHub Wiki、博客文章(如《Valdi——一个提供原生性能的跨平台 UI 框架》)提供从入门到进阶的完整指南。
- Roadmap:计划在 2026 年 Q1 前完成 文档全覆盖、插件生态(如图表库、网络层)以及 更完善的 Android Jetpack Compose 支持。
小结
Valdi 是 Snapchat 为了解决跨平台开发“性能‑效率”矛盾而打造的 声明式 TypeScript → 原生视图 编译框架。它通过直接生成 iOS、Android、macOS 原生 UI,摆脱了 WebView 与 JS Bridge 的性能瓶颈,并提供热重载、VSCode 调试、自动视图回收等开发者友好特性。现已以 MIT 许可证在 GitHub 开源,处于 Beta 阶段但核心功能已在 Snap 的生产环境中稳定运行 8 年,适合需要高性能、快速迭代的移动端项目使用。
声明:文章均为AI生成,请谨慎辨别信息的真伪和可靠性!