Zylix — 基于 Zig 的 UI 框架,适用于 7 个平台

发布: (2025年12月25日 GMT+8 11:16)
6 min read
原文: Dev.to

Source: Dev.to

Zylix 封面图 — 基于 Zig 的 7 平台 UI 框架

Kazuhiro Kotsutsumi

Introduction

“我们能只用 Zig 构建所有东西吗?”

正是这个简单的问题启动了 Zylix

Zylix 是一个围绕 Zig 构建的跨平台 UI 框架。通过单一代码库,你可以为以下平台构建原生应用:

  • Web (WASM)
  • iOS
  • Android
  • macOS
  • Linux
  • Windows

受支持的目标现在总计 7 个。

我们刚刚发布了 v0.19.0,标志着概念验证阶段的结束。项目仍然年轻,但我想分享其背后的理念和设计。

名称

如果你是 Delphi 的老用户,Zylix 这个名字可能会让你感到熟悉。

是的——它的灵感来源于 Kylix,Borland 在 2000 年代初期尝试将 Delphi 带到 Linux 上的项目。Kylix 没能持久,但“一种语言,多平台”的理念仍然非常有吸引力。

Zylix 是一次使用 Zig 重新唤起这种精神的现代尝试。

Zig + Kylix = Zylix.

为什么选择 Zig?

跨平台开发已经有很多选项。每种都有权衡:

框架权衡
Flutter自定义 Skia 渲染 → 原生感受较弱
React NativeJS 桥接 → 性能开销
ElectronChromium 包 → 二进制体积庞大
TauriWebView → 原生集成受限

Zig 看起来是一种有前景的方式来突破这些限制:

  • 零成本抽象 – 无运行时开销
  • 可预测的性能 – 无垃圾回收,确定性内存管理
  • 跨编译就绪 – 一个工具链支持所有目标平台
  • 完整的 C ABI 兼容性 – 易于与 Swift/Kotlin/C# 集成
  • 编译时安全 – 空指针安全,边界检查

Zylix 方法

核心思想很简单:

不要统一 UI。统一意义和决策。

像 Flutter 和 React Native 这样的框架旨在统一 UI 本身。Zylix 保留原生 UI 框架(SwiftUI、Jetpack Compose、GTK4、WinUI 3 等),仅共享 逻辑层

在 Zig 中共享的内容

  • 应用状态
  • 业务逻辑
  • 数据验证
  • 事件处理

保持平台原生的内容

  • UI 组件
  • 动画
  • 操作系统 API
  • 原生手势

架构

Zylix uses a Central Brain architecture:

┌──────────────────────────────────────────────┐
│                 Your Application             │
├──────────┬──────────┬──────────┬─────────────┤
│ SwiftUI  │ Compose  │  GTK4    │  WinUI 3    │  HTML/JS
├──────────┴──────────┴──────────┴─────────────┤
│                C ABI Layer                   │
├──────────────────────────────────────────────┤
│               Zylix Core (Zig)               │
│   Virtual DOM | State | Events | Diff | ...  │
└──────────────────────────────────────────────┘

好处

对用户而言

  • 原生外观与手感
  • 完整的无障碍支持
  • 小体积应用
  • 更好的电池续航

对开发者而言

  • 单一逻辑来源
  • 编译时类型安全
  • 使用单一工具链跨平台编译
  • 可预测的内存行为

支持的平台

Zylix 目前支持 7 个平台。今天稳定的有:

  • Web / WASM
  • iOS
  • Android
  • macOS
  • Linux
  • Windows
  • watchOS

实现示例

跨平台的最小计数器。

Zig core(共享逻辑)

pub const State = struct {
    counter: i64 = 0,
};

pub fn increment(state: *State) void {
    state.counter += 1;
}

SwiftUI(iOS/macOS)

Text("\(zylixState.counter)")

Button("Increment") {
    zylix_dispatch(.increment)
}

Jetpack Compose(Android)

Text("${zylixState.counter}")

Button(onClick = { zylixDispatch(INCREMENT) }) {
    Text("Increment")
}

相同的逻辑,完全原生 UI.

项目布局

zylix/
├── core/           # Zig core library
├── platforms/      # Platform implementations
│   ├── android/    # Kotlin / Jetpack Compose
│   ├── ios/        # Swift / SwiftUI
│   ├── linux/      # GTK4
│   ├── macos/      # SwiftUI
│   ├── web/        # WASM
│   └── windows/    # WinUI 3
├── site/           # Docs site
└── examples/       # Sample projects

当前状态与下一步

Zylix v0.19.0 现已超出概念验证阶段。根据 Zenn 文章
(https://zenn.dev/kotsutsumi/articles/bd4607160de5be):

  • 支持的目标已增长至 7
  • 核心功能实现已完成
  • 自动化测试已就绪
  • 我现在正处于使用它构建真实应用并验证体验的阶段

这是最关键的阶段:不仅要“它能运行”,更要感受在真实项目中使用它的体验。

欢迎贡献

Zylix 是开源的(Apache License 2.0)。欢迎所有贡献:

  • 🐛 Bug 报告
  • 💡 功能想法
  • 📝 文档改进
  • 🔧 拉取请求

GitHub:
Docs:

如果你对 Zig 感兴趣,或想要一种跨平台原生应用的新方法,欢迎来看看。

结束

“在 Zig 中做所有事”听起来可能很鲁莽,但我想看看有什么可能。
我们能在不失去原生用户体验的情况下共享逻辑吗?
我们能保持性能并仍然面向多个平台吗?

— Kazuhiro Kotsutsumi

tforms?

Zylix 仍处于早期阶段,但如果这与你产生共鸣,我很愿意一起构建它。

感谢阅读。

Back to Blog

相关文章

阅读更多 »