Snapchat 开源了他们的移动端跨平台框架 Valdi

AI资讯 3小时前 硕雀
4 0

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. 技术实现

  1. 编译器链
    • TSX → 中间表示(IR)‍ → 平台特定代码生成(Swift/Obj‑C、Kotlin/Java)。
    • 通过 Bazel 完成增量编译与缓存,支持 即时热重载(Hot Reload)和 VSCode 调试
  2. 渲染引擎
    • 自动视图回收(View Recycling)和 视口感知渲染(Viewport‑aware Rendering),保证列表滚动、复杂手势等场景的原生流畅度。
    • Flexbox 布局 与 原生动画系统 完全映射,开发者可以使用熟悉的 CSS‑like 样式描述布局与动画。
  3. 双向通信 & 原生 API
    • 自动生成 TypeScript ↔︎ 原生桥接代码,支持 Protobuf多线程 JavaScript 执行(Worker)以及 原生 API 直接调用,实现高效的数据交互。
  4. 模块化与插件
    • 支持 平台特定视图嵌入原生模块、以及 多语言模块(如 Swift、Kotlin、C++)的混合开发,便于在已有原生项目中逐步迁移。

5. 主要特性

特性 价值
原生性能 直接生成原生控件,避免跨平台层的性能瓶颈。
热重载 & 快速调试 代码改动即时生效,提升开发效率。
声明式组件 类 React/TSX 语法,降低学习成本。
自动视图回收 高效列表渲染,降低内存占用。
Flexbox 布局 跨平台统一布局模型。
完整的 VSCode 调试 断点、变量查看、堆栈追踪均可在编辑器中完成。
跨平台代码生成 同一套代码产出 iOS、Android、macOS 原生 UI。
MIT 开源许可证 允许商业使用、修改、再分发。
社区与文档 官方 GitHubDiscord 讨论区、详细教程与 API 文档。

5. 开源情况与许可证

  • 仓库地址https://github.com/Snapchat/Valdi GitHub 官方页面)
  • 开源时间:2025 年 11 月首次公开。
  • 许可证:MIT(宽松的开源许可,适用于商业项目)。
  • 当前状态:Beta(文档与工具链仍在完善中),但核心功能已在 Snap 的生产环境中稳定运行 8 年。

6. 使用案例与生态

  • Snapchat 内部:已在多个核心产品(如聊天、相机、AR 体验)中使用,验证了高并发、复杂手势与实时渲染的可靠性。
  • 外部项目:社区已有若干开源示例项目,展示了如何在纯原生项目中嵌入 Valdi 组件,或从零构建跨平台应用。
  • 生态:提供 Bazel 构建规则、VSCode 插件、Discord 社区支持,方便开发者快速上手并贡献代码。

7. 入门指南(简要步骤)

  1. 环境准备:安装 Node.js、Bazel、对应平台的 SDK(Xcode、Android Studio)。
  2. 克隆仓库git clone https://github.com/Snapchat/Valdi.git
  3. 创建项目:使用 valdi init 脚手架生成 TypeScript/TSX 项目结构。
  4. 编写组件:在 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>
    );
    
  5. 编译运行bazel build //:app_iosbazel build //:app_android,或使用 valdi dev --hot 进行热重载调试。
  6. 调试:在 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 年,适合需要高性能、快速迭代的移动端项目使用。

来源:www.aiug.cn
声明:文章均为AI生成,请谨慎辨别信息的真伪和可靠性!