指南
平台概览
nsh 同时运行在手机和桌面上:iOS、Android、macOS、Windows 和 Linux。每个平台都有自己的后端,用平台的原生界面绘制:同一个模块在 iPhone 上是 UIKit 视图,在 Mac 上是 AppKit 视图,在 Linux 上是 GTK 4 控件,文本、输入、无障碍和深色模式都是平台自己的。后端之上的部分全部共享:QuickJS、响应式图、渲染器、Taffy 布局和组件在每个平台上都是同一份 Rust 代码,所以一个 bundle 可以在所有平台上运行。
在每个平台上,nsh 的主要用途都一样:把模块嵌入你自己的原生应用,由它在运行时加载。开发时借助热更新(nsh run);同样的模块也可以打包成可安装的应用(nsh package),这是受支持的第二种用法。
#一览
| 平台 | 后端;文本 | 运行环境 | 开发 | 打包 |
|---|---|---|---|---|
| iOS | UIKit;CoreText | iOS 15.0+,真机和模拟器 | nsh run --target ios | .app(模拟器)、签名的 .ipa |
| Android | Android 视图;StaticLayout | Android 9(API 28)+,arm64-v8a 和 x86_64 | nsh run --target android | 签名的 .apk |
| macOS | AppKit 与 Core Animation;CoreText | macOS 14+ | nsh run --target macos | ad hoc 签名的 .app |
| Windows | 用 Direct2D 绘制的 Win32 窗口;DirectWrite | Windows 10 1809+、Windows 11 | nsh run(Windows 上的默认目标) | 一个目录和一个 .zip |
| Linux | GTK 4 控件;Pango | GTK 4.14+ | nsh run(Linux 上的默认目标) | 一个目录和一个 .tar.gz |
另外还有两个目标用于开发和本站、不用于发布,还有一个在规划中:
- Mac Catalyst 在 Mac 上用 iPhone 尺寸的窗口(390×844)运行 iOS 后端。它是 macOS 上
nsh run的默认目标,因为不用启动模拟器,就能最快看到模块在手机上的样子。 - Web(WebAssembly)在浏览器里运行同一个引擎,用 DOM 绘制。本站的在线示例和 Playground 都由它驱动;它不是用来发布应用的目标。
- GPUI 是规划中的桌面后端,用姊妹项目 GPUI Kit 所基于的 GPUI 绘制。它正在开发,还不是 nsh 的一部分;目前桌面上运行的是上面 macOS、Windows 和 Linux 的原生后端。
#开发与打包
不传 --target 时,nsh run 选择本机的平台:macOS 上是 Mac Catalyst,Linux 上是 GTK 窗口,Windows 上是 Win32 窗口。手机要从电脑上连接:iOS 需要装有 Xcode 的 Mac,Android 可以在装有 Android SDK 的 macOS、Linux 或 Windows 上开发(安装)。
nsh run my-app --target macos # 或 ios、android、windows、linux、catalyst
nsh package my-app --target macos # 或 ios、ios-simulator、android、windows、linux
桌面后端只为运行它的机器构建:Mac 应用在 Mac 上打包,Windows 应用在 Windows 上打包,Linux 应用在 Linux 上打包。各目标的输出、签名和图标见打包。
#嵌入原生应用
| 平台 | 宿主视图 | 发布形式 | 宿主语言 |
|---|---|---|---|
| iOS | NshAppView(一个 UIView) | NativeShell.xcframework | Swift |
| Android | NshView(一个 FrameLayout) | nsh.aar | Java 或 Kotlin |
| macOS | AppView(一个 NSView) | nsh-platform-macos crate | Rust |
| Windows | AppView(一个子窗口) | nsh-platform-windows crate | Rust |
| Linux | AppView(一个 GTK 控件) | nsh-platform-linux crate | Rust |
每个视图都是一个拥有独立虚拟机的引擎,一个应用可以同时显示多个。在每个平台上,宿主都可以注册自己的原生视图给模块使用(原生组件)。
#为每个平台编写
应用的大部分代码不需要判断平台:元素、样式、布局和模块在各处行为一致。平台确实不同的地方,nsh 给它一个固定的位置(平台特定代码):
- 平台专属属性放在
ios={{…}}、android={{…}}或desktop={{…}}(macOS、Windows 和 Linux)里。 Platform.select按操作系统取值,也可以按mobile和desktop整体取值;Platform.OS是"ios"、"android"、"macos"、"windows"或"linux"。- 输入跟随平台。 手机上是触摸和软键盘;桌面上是鼠标、触控板和键盘。
nsh/ui/mobile 的组件由 nsh 绘制,所以在桌面上也能运行,样子和在手机上一样。目前还没有桌面 UI 套件:桌面布局用基础元素(View、Text、Scroll、List 等)和 Platform.select({ desktop: … }) 搭建,示例应用 gallery 的桌面布局就是这样做的。
每个后端都列出了它尚不支持的内容:macOS、Windows、Linux。