探索 Valdi:一个高效的跨平台 UI 框架
大家好,我是这里的一个开发者爱好者。今天,我想和你聊聊 Valdi 这个框架。它是一个跨平台 UI 框架,能让你用 TypeScript 写一次代码,就能在 iOS、Android 和 macOS 上运行原生视图。听起来挺实用的,对吧?如果你是软件工程或相关专业的毕业生,正在找一个能平衡开发速度和性能的工具,Valdi 可能就是你要的那个。我们一步步来了解它,从基础开始,到怎么参与贡献,再到社区规范。别担心,我会用简单的话解释清楚,还会预测一些你可能有的问题,直接给你答案。
先说说 Valdi 是什么。Valdi 是一个开源项目,已经在 Snap 的生产应用中用了 8 年。它现在处于 beta 阶段,主要因为开源后的工具和文档还需要更多实际测试。但核心功能已经很稳固了。它的目标是解决跨平台开发的老问题:要么开发快但性能差,要么性能好但开发慢。Valdi 用声明式的 TypeScript 组件,直接编译成原生视图,不用 web 视图或 JavaScript 桥接。这意味着你的 app 运行起来像原生的一样流畅。
Valdi 的核心优势
你可能会问:“为什么我要用 Valdi,而不是其他跨平台框架?” 好问题。Valdi 的设计就是为了在性能和开发体验上找到平衡点。让我列出几个关键点:
-
真正的原生性能:不像有些框架依赖 web 视图,Valdi 的组件直接转成平台的原生视图。比如在 iOS 上是 UIKit,在 Android 上是对应的视图系统。这避免了桥接的开销。 -
自动视图回收:有一个全局视图池,能重用视图,减少加载时间。想象一下,切换屏幕时不用每次都新建视图,这对 app 的响应速度有大帮助。 -
优化的渲染:组件独立重渲染,不影响父组件。布局引擎用 C++ 写,在主线程跑,跨线程开销小。 -
视口感知渲染:只渲染可见的部分,适合无限滚动列表,不会卡顿。
除了这些,Valdi 还有其他性能优化,比如 worker 线程用于后台处理,native 动画和手势识别。这些都让 app 感觉更 native。
开发体验呢?Valdi 知道传统 native 开发周期长,所以加了热重载:改代码几毫秒就看到变化,不用重编译。还能在 VSCode 里调试,设置断点、检查变量、性能分析。语法用 TSX,熟悉 React 的会觉得亲切,但它是为 native 优化的。
Valdi 的灵活性也很强。你可以把它嵌入现有 native app,或者反过来把 native 视图放进 Valdi 布局。支持 polyglot 模块,用 C++、Swift、Kotlin 或 Objective-C 写关键代码,和 TypeScript 安全交互。还有 protobuf 支持,数据序列化高效。
它支持 Flexbox 布局,自动 RTL;内置测试框架;集成 Bazel 构建系统,确保构建可重复和增量。
Valdi 在生产中证明了自己,能处理复杂动画、实时渲染和手势系统。如果你做的是需要高性能的 app,比如社交或媒体类,Valdi 是个好选择。
一个简单的 Valdi 示例
想看看 Valdi 怎么用?这里有个基本组件的例子。用 TypeScript 写,声明式渲染:
import { Component } from 'valdi_core/src/Component';
class HelloWorld extends Component {
onRender() {
const message = 'Hello World! 👻';
<view backgroundColor='#FFFC00' padding={30}>
<label color='black' value={message} />
</view>;
}
}
这个组件创建一个黄色背景的视图,里面有个黑字的标签显示 “Hello World! 👻”。在 iOS 上运行看起来像这样:

简单吧?它直接编译成原生视图,性能 native。
如何开始使用 Valdi
你可能在想:“我怎么安装和启动 Valdi?” 别急,我一步步告诉你。Valdi 支持 iOS、Android 和 macOS。详细指南在 docs/INSTALL.md 里,但这里总结一下。
步骤 1: 设置环境
-
确保有 Node.js 和 TypeScript(5.x 版本)。 -
对于 iOS,需要 Xcode;Android 需要 Android Studio;macOS 类似 iOS。 -
Clone 仓库: git clone https://github.com/Snapchat/Valdi.git(假设这是仓库地址,根据 README 推测)。
步骤 2: 安装依赖
用 yarn 或 npm 安装。Valdi 用 Bazel 构建,所以安装 Bazel。
步骤 3: 构建和运行
-
运行 Bazel 构建命令。 -
对于热重载,启动 Hermes 调试器在 VSCode。 -
嵌入现有 app:用 native-bindings 把 Valdi 组件加进 UIKit 或 Android 视图。
更多细节看 Getting Started Guide。如果你卡住了,加入 Discord 问问:https://discord.gg/uJyNEeYX2U。
Valdi 的文档覆盖了从安装到高级主题,比如性能优化、动画、手势等。还有 codelabs 教程,帮助你上手。
Valdi 的社区和贡献
Valdi 是开源的,欢迎大家参与。社区用 Discord 交流,还有 Contributor Covenant 风格的行为准则,确保大家友好相处。
你可能会问:“我能贡献什么?” Valdi 欢迎各种形式:
-
修复 bug -
改进文档 -
加测试或性能优化
新功能?先在 Discord 讨论。
如何贡献:一步步指南
-
阅读准则:先看 CONTRIBUTING.md 和 CODE_OF_CONDUCT.md。 -
Fork 仓库:创建你的分支。 -
做修改:遵循编码标准——用现有风格,文档齐全,加测试,别加多余依赖。 -
写 commit:用 conventional commit,比如 “feat: Add new feature” 或 “fix: Resolve bug”。 -
跑测试:确保不破现有功能。 -
提交 PR:描述清楚变化。维护者会 review,建议修改,然后 merge。
贡献后,你会被加到 All Contributors 列表,认可代码、文档、设计等所有贡献。
法律方面:贡献时,你保证是原创或有权提交,授予 MIT 许可下的使用权。如果有专利,授予免费许可。不需要 CLA,但确保第三方代码兼容 MIT 并 attribution。
Valdi 的行为准则
社区健康很重要。Valdi 的 Code of Conduct 基于 Contributor Covenant 2.1,确保每个人不受骚扰,包容多样性。
我们承诺什么?
作为成员、贡献者和领导,我们承诺让社区无骚扰,无论年龄、体型、残疾、民族、性别、经验、教育、经济地位、国籍、外貌、种族、种姓、颜色、宗教或性取向。
我们会以促进开放、欢迎、多样、包容和健康社区的方式行事。
积极行为示例
-
对他人表现出同理和善良 -
尊重不同意见、观点和经验 -
给出并优雅接受建设性反馈 -
承认错误、道歉,并从中学习 -
关注社区整体利益,而非个人
不可接受行为
-
使用性化语言或图像,性关注或 advances -
挑衅、侮辱、贬低评论,个人或政治攻击 -
公开或私下骚扰 -
未获许可发布他人私人信息,如地址或 email -
其他在专业环境中不适当的行为
执行责任
社区领导澄清和执行标准,对不适当行为采取公平行动。能移除、编辑或拒绝不符贡献,并解释原因。
准则适用于社区空间和代表社区的公共场合,如用官方 email 或社交账号。
报告问题
遇到问题?报告给 opensource@snap.com。会快速公平调查,尊重隐私。
执行指南
领导根据影响决定后果:
-
修正:不适当语言——私人书面警告,解释为什么,可能要公开道歉。 -
警告:单一或系列违反——警告,指定期无互动,违反可禁。 -
临时禁:严重违反——临时禁互动。 -
永久禁:模式违反,如持续不适当、骚扰或贬低群体——永久禁。
更多 FAQ 在 https://www.contributor-covenant.org/faq。
常见问题解答 (FAQ)
我预测了一些你可能的问题,直接回答。基于 Valdi 的文档,这些是常见疑问。
Valdi 是什么?
Valdi 是一个跨平台 UI 框架,用 TypeScript 写声明式组件,编译成 iOS、Android、macOS 的原生视图。目标是 native 性能加快速开发。
Valdi 支持哪些平台?
iOS、Android 和 macOS。见 platforms badge。
Valdi 是开源的吗?
是的,MIT 许可。见 LICENSE.md。
Valdi 的状态如何?
Beta,因为开源工具和文档需更多测试。但核心已在生产用 8 年。
如何报告 bug 或请求功能?
开 issue,提供细节:重现步骤、OS、Valdi 版本、预期 vs 实际行为、可能原因。
Valdi 有组件库吗?
组件库即将推出:https://github.com/Snapchat/Valdi_Widgets。
Valdi 如何处理性能?
通过自动视图回收、独立渲染、C++ 布局引擎、视口渲染。详见 Performance Optimization Guide。
我能把 Valdi 嵌入现有 native app 吗?
能,用 native-bindings。反之也行,用 加 native 视图。
Valdi 支持 native API 吗?
支持,通过 polyglot 模块和自动代码生成。TypeScript 接口编译成 Kotlin、Objective-C、Swift 绑定。
Valdi 有测试框架吗?
有,组件级单元测试。见 workflow-testing.md。
如何加入社区?
Discord:https://discord.gg/uJyNEeYX2U。
贡献需要签 CLA 吗?
不需要,但同意 MIT 兼容许可和专利授予。
如果违反行为准则会怎样?
根据严重度,从警告到永久禁。报告给 opensource@snap.com。
如何优化 Valdi app 的性能 (HowTo)
假设你已经在用 Valdi,想提升性能。这里是基于文档的步骤指南。
步骤 1: 理解视图回收
Valdi 的全局池重用视图。确保组件设计支持回收,比如避免状态依赖特定视图。
步骤 2: 优化渲染
用独立组件渲染。避免不必要重渲染,通过 shouldComponentUpdate 控制。
步骤 3: 用 worker 线程
对于后台任务,用 worker-service 移到别线程,减少主线程阻塞。
步骤 4: 布局优化
用 Flexbox,测试 RTL。布局引擎高效,但复杂布局测试性能。
步骤 5: 视口渲染
在列表用 viewport-aware,确保只 inflate 可见项。
更多见 performance-optimization.md。
如何在 Valdi 中添加 native 代码 (HowTo)
想混用 native?这样:
步骤 1: 创建 polyglot 模块
用 annotations 定义接口,生成绑定。
步骤 2: 写 native 实现
在 C++、Swift 等写,暴露给 TypeScript。
步骤 3: 在组件用
导入模块,调用方法。数据和回调安全传递。
详见 native-polyglot.md。
Valdi 的高级特性表格
为了清晰,这里用表格总结高级特性:
| 特性 | 描述 | 文档链接 |
|---|---|---|
| 动画 | Native 动画,原生感觉 | advanced-animations.md |
| 手势 | 平台 native 处理 | core-touches.md |
| Worker 线程 | 多线程 JS 执行 | advanced-worker-service.md |
| Protobuf | 高效数据序列化 | advanced-protobuf.md |
| Full-stack | 整个特征在 Valdi 建,少桥接 | advanced-full-stack.md |
| Bazel 集成 | 可重复构建 | workflow-bazel.md |
| 调试 | VSCode 断点、堆 dump | workflow-hermes-debugger.md |
贡献时的法律注意事项
贡献时,确保原创。授予 MIT 下使用、修改、分发权。专利授予免费许可。道德权 waived 或不主张干扰项目。
如果你是公司贡献,确保有权。
为什么 Valdi 适合你的项目?
想想你的需求。如果你要跨平台、native 性能、快速迭代,Valdi 合适。它不是万能,但对需要嵌入 native 或处理复杂 UI 的项目强。
例如,在 Snap app 中,它处理实时渲染和动画,没问题。
结束语:加入 Valdi 社区
Valdi 不只是框架,是社区。跟着准则贡献,享受过程。有什么问题,Discord 见。我们一起让它更好。
