指南

平台概览

nsh 同时运行在手机和桌面上:iOS、Android、macOS、Windows 和 Linux。每个平台都有自己的后端,用平台的原生界面绘制:同一个模块在 iPhone 上是 UIKit 视图,在 Mac 上是 AppKit 视图,在 Linux 上是 GTK 4 控件,文本、输入、无障碍和深色模式都是平台自己的。后端之上的部分全部共享:QuickJS、响应式图、渲染器、Taffy 布局和组件在每个平台上都是同一份 Rust 代码,所以一个 bundle 可以在所有平台上运行。

在每个平台上,nsh 的主要用途都一样:把模块嵌入你自己的原生应用,由它在运行时加载。开发时借助热更新(nsh run);同样的模块也可以打包成可安装的应用(nsh package),这是受支持的第二种用法。

#一览

平台后端;文本运行环境开发打包
iOSUIKit;CoreTextiOS 15.0+,真机和模拟器nsh run --target ios.app(模拟器)、签名的 .ipa
AndroidAndroid 视图;StaticLayoutAndroid 9(API 28)+,arm64-v8a 和 x86_64nsh run --target android签名的 .apk
macOSAppKit 与 Core Animation;CoreTextmacOS 14+nsh run --target macosad hoc 签名的 .app
Windows用 Direct2D 绘制的 Win32 窗口;DirectWriteWindows 10 1809+、Windows 11nsh run(Windows 上的默认目标)一个目录和一个 .zip
LinuxGTK 4 控件;PangoGTK 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 上打包。各目标的输出、签名和图标见打包。

#嵌入原生应用

平台宿主视图发布形式宿主语言
iOSNshAppView(一个 UIView)NativeShell.xcframeworkSwift
AndroidNshView(一个 FrameLayout)nsh.aarJava 或 Kotlin
macOSAppView(一个 NSView)nsh-platform-macos crateRust
WindowsAppView(一个子窗口)nsh-platform-windows crateRust
LinuxAppView(一个 GTK 控件)nsh-platform-linux crateRust

每个视图都是一个拥有独立虚拟机的引擎,一个应用可以同时显示多个。在每个平台上,宿主都可以注册自己的原生视图给模块使用(原生组件)。

#为每个平台编写

应用的大部分代码不需要判断平台:元素、样式、布局和模块在各处行为一致。平台确实不同的地方,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。

#另请参阅

  • 快速开始:第一个模块,在每个平台上运行。
  • 安装:每个平台需要的工具。
  • 架构:哪些部分共享,每个后端做什么。