文档

平台概览

NSH 运行在手机、桌面和网页上:iOS、Android、macOS、Windows、Linux、GPUI 和 Web。每个平台都有自己的后端,用平台自己的界面技术绘制:同一个模块在 iPhone 上是 UIKit 视图,在 Mac 上是 AppKit 视图,在 Linux 上是 GTK 4 控件,在 GPUI 应用里是 GPUI 元素,在浏览器里是 HTML,文本、输入、无障碍和深色模式都是平台自己的。后端之上的部分全部共享: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
GPUIGPUI;GPUI 的文字系统macOS、Windows、Linux(Vulkan)nsh run --target gpui与所在桌面平台相同
WebHTML 与 CSS;浏览器的字体现代浏览器,桌面和手机nsh run --target web一个静态网站
  • GPUI 用姊妹项目 GPUI Kit 所基于的 GPUI 绘制模块,在 macOS、Windows 和 Linux 上表现一致:一套渲染覆盖三个桌面平台,AppView 可以放进 GPUI 和 GPUI Kit 应用自己的元素树。
  • Web 把应用渲染成浏览器页面里的 HTML:nsh package --target web 发布一个静态网站,可部署到任意 Web 服务器或 CDN;你自己的网页可以用 createPlayer 或 iframe 嵌入应用。本站的在线示例和 Playground 也由它运行。
  • Mac Catalyst 在 Mac 上用 iPhone 尺寸的窗口(390×844)运行 iOS 后端,用于开发。它是 macOS 上 nsh run 的默认目标:最快看到模块在手机上的样子。

#开发与打包

不传 --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、gpui、web、catalyst
nsh package my-app --target macos  # 或 ios、ios-simulator、android、windows、linux、gpui、web

桌面后端只为运行它的机器构建: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
GPUI(macOS、Windows、Linux)AppView(一个 GPUI 视图)nsh-platform-gpui crateRust
WebcreatePlayer(一个页面元素)或 iframensh package --target web 生成的运行时文件JavaScript 或 HTML

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

#为每个平台编写

应用的大部分代码不需要判断平台:元素、样式、布局和模块在各处行为一致。平台确实不同的地方,NSH 给它一个固定的位置(平台特定代码):

  • 平台专属属性放在 ios={{…}}、android={{…}}、web={{…}} 或 desktop={{…}}(macOS、Windows、Linux 和桌面浏览器)里。
  • Platform.select 按操作系统取值,也可以按 mobile 和 desktop 整体取值;Platform.OS 是 "ios"、"android"、"macos"、"windows"、"linux" 或 "web"。
  • 输入跟随平台。 手机上是触摸和软键盘;桌面上是鼠标、触控板和键盘。

nsh/ui/mobile 的组件由 NSH 绘制,所以在桌面上也能运行,样子和在手机上一样。桌面布局用基础元素(View、Text、Scroll、List 等)和 Platform.select({ desktop: … }) 搭建,示例应用 gallery 的桌面布局就是这样做的;桌面 UI 套件也在路上。

每个后端都列出了它尚不支持的内容:macOS、Windows、Linux、GPUI。

#另请参阅

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