桌面应用太臃肿?zero-native:轻量级 Zig 原生外壳,解决跨平台开发的体积焦虑!
前端技术向桌面端渗透这倒也算不得什么新鲜的野心。早年间用 Electron 套个壳前端代码原封不动搬上去也就成了一个能独立运行的桌面软件。跨平台的红利固然诱人代价却也十分具体——十几二十年前的桌面软件开发者是直接对着系统 API 抠字节斤斤计较每一兆内存的开销如今硬件宽裕了软件却越写越懒。随便装个待办事项、小笔记或是一个纯文本的编辑器动辄占去几百兆的硬盘空间运行起来又要吃掉几百兆的内存。开发者乐得省事一次编写到处运行可用户其实一直被按在地上摩擦为一个简单的输入框搭上整整一套 Chromium 引擎。多数人根本不知道自己的内存在被谁吞噬只觉得机器的散热风扇转得莫名其妙。大家都在找更轻的替代品此前 Tauri 用 Rust 探了路如今又多了一个 zero-native。其切入点极其直白无非是给现代 Web 前端套上一个用 Zig 写的轻量级原生外壳借此解决跨平台开发带来的体积失控与内存焦虑。前端依旧可以心安理得地用 Next.js、React 或者 Vue 来堆界面生态里的轮子照转不误底层的运行环境则全权交给零依赖的 Zig 来打理。把壳做薄最干脆的做法便是放弃打包庞大的浏览器运行库直接调用系统自带的 WebView——在 macOS 上用 WKWebView在 Linux 上是 WebKitGTK到了 Windows 则是 Edge 的 WebView2。既然借用了系统底层的现成组件编译出的程序体积也就大幅缩减下来启动速度跟着提了上去。这本不是什么新鲜思路但多数框架往往倒在渲染一致性上。系统自带的 WebView 固然轻巧可一旦遇上复杂的 CSS 动画或者偏门的接口不同平台间的兼容性差异也就暴露无遗。zero-native 并没有在这里假装提供完美的跨平台魔法。倘若产品对渲染一致性有苛刻的要求它也不拦着照样允许塞入 CEF 去打包完整的 Chromium 环境。这种把选择权交还给开发者的做法未尝不透露着一种克制的清醒要极度轻量就得忍受兼容性调试的麻烦要绝对一致就得承担体积膨胀的代价世界上本没有两全其美的好事。底层选了 Zig这本身就是个极具针对性的决定。比起近年来在系统级开发里风头正劲的 RustZig 的犀利之处全在于它与 C 语言的交互极其顺滑没有任何多余的过渡层消耗。当 Web 页面遇到需要调动底层硬件、系统编解码器或者本地文件系统的硬茬时原生层可以直接越过 Web 的沙盒去接管。前端在熟悉的工具链里垒砖底层用 Zig 去扛重活各自待在舒适区里。我总觉得与其让前端框架去生硬地模拟底层操作不如交给真正为系统级编程而生的语言。更要紧的是Zig 的零依赖特性让这个外壳极为干净没有复杂的构建链编译出来的可执行文件也就是清清爽爽的一个二进制程序这账算得很清楚。权限往往是这类套壳应用最容易出岔子的地方。许多框架为了迎合前端开发者的习惯默认开了一堆本地接口让 JavaScript 可以随意读写系统文件反而留下极大的安全隐患。在 zero-native 的设定里WebView 默认是个不被信任的隔离区。想要调用本地命令、开个新窗口或是跳转外部链接统统得在配置文件里白纸黑字地签下权限放行单。这种把丑话说在前面的设计开发初期固然要多费几步手脚长期看却拦下了不少越界调用的麻烦。当一个 Web 应用试图获取原生权限时本就理当经过最严格的盘问。归根结底桌面端开发哪有什么一劳永逸的解药。桌面端开发多半是在体积、性能与开发效率之间反复拉扯这大概是这些年很少有人真正说开心过的一件事。既舍不得 Web 界面那现成的开发效率又受不了动辄几百兆的内存开销zero-native 也就成了一条体面的退路——把系统层那些重活统统还给原生工具前端便只管去侍弄画面渲染那一摊罢了至于把整个浏览器引擎硬生生剥离出去这回事听起来固然爽利可一旦落进真实业务线里那些防不胜防的兼容性暗礁究竟能不能一一绕过想来终究还得老老实实地用测试去敲定。https://github.com/vercel-labs/zero-native