Skip to content

快速入门 (Quick Start)

zero-native 是一个支持可选 Web 引擎的 Zig 桌面应用外壳(Shell)。对于轻量级应用,可以使用系统内置的 WebView(WKWebView、WebKitGTK);在 macOS 上,则可以通过 CEF 捆绑 Chromium,以获得可预测的 Chromium 渲染效果。仅需不到一分钟,即可创建一个带 Web UI 的原生桌面应用。

Beta 阶段支持范围

当前 Beta 阶段的目标是 macOS 桌面应用。系统 WebView 构建支持 macOS 和 Linux,而 Chromium/CEF 构建与打包功能目前仅限 macOS,对 Windows 的支持以及 Linux 下的 Chromium 支持已列入路线图。

前提条件

  • Zig: 0.16.0 或更高版本
  • Node.js: 带有 npm,用于处理生成的前端项目
  • 操作系统: macOS 11 或更高版本,或者 Linux(Windows 支持正在开发中)

创建项目

bash
zero-native init my_app --frontend next
cd my_app

前端框架选项:nextvitereactsveltevue

这将搭建一个完整的 zero-native 项目结构:

文件/目录用途
build.zig包含平台、追踪 (trace)、调试覆盖层 (debug-overlay)、自动化、JS 桥接 (js-bridge) 和 Web 引擎选项的 Zig 构建图 (Build graph)
build.zig.zonZig 包清单文件,声明 zero-native 依赖项
app.zon应用元数据:名称、图标、权限、桥接命令、安全策略、窗口定义
src/main.zig包含 app() 和可选的 bridge() 方法的 App 结构体
src/runner.zig平台适配:追踪接收器 (trace sinks)、文件日志、异常捕获 (panic capture)、状态存储、运行时初始化
assets/icon.icns适用于 macOS 打包的应用图标
frontend/使用 --frontend 参数选定的前端框架初始项目

运行应用

bash
zig build run

首次前端构建会自动安装依赖项。随后您的应用将打开一个渲染 HTML 的原生 WebView 窗口。

macOS Beta 工作流

在 macOS Beta 上验证应用时,请使用以下开发与打包流程:

bash
zero-native init my_app --frontend next
cd my_app
zig build run
zero-native cef install
zig build run
zero-native package --target macos --signing identity --identity "Developer ID Application: Your Name"
zero-native doctor --manifest app.zon --strict

在运行 Chromium 之前,请在 app.zon 中设置 .web_engine = "chromium".cef = .{ .dir = "third_party/cef/macos", .auto_install = false }-Dweb-engine--web-engine 参数仍可用于单次覆盖,但标准的应用工作流会直接读取清单配置。

对于前端框架,在开发期间请通过开发服务器(Dev Server)运行前端,然后在发布时打包构建好的静态资源。

Hello World

最简单的 zero-native 应用只需提供名称和内联 HTML 即可:

zig
const HelloApp = struct {
    fn app(self: *@This()) zero_native.App {
        return .{
            .context = self,
            .name = "hello",
            .source = zero_native.WebViewSource.html(
                \\<!doctype html>
                \\<html>
                \\<body style="font-family: system-ui; padding: 2rem;">
                \\  <h1>Hello from zero-native</h1>
                \\</body>
                \\</html>
            ),
        };
    }
};

后续步骤