Эта страница переведена машинным способом и может содержать ошибки. Читать оригинал на английском

Документация

Обзор платформ

NSH работает на телефонах, настольных компьютерах и в вебе: iOS, Android, macOS, Windows, Linux, GPUI и веб-страницы. У каждой платформы есть собственный бэкенд, который рисует средствами её родного UI, поэтому приложение состоит из представлений UIKit на iPhone, представлений AppKit на Mac, виджетов GTK 4 в Linux, элементов GPUI в приложении GPUI и HTML в браузере, с текстом, вводом, доступностью и тёмной темой самой платформы. Всё, что выше бэкенда, общее: реактивный граф, рендерер, раскладка Taffy, компоненты и нативные модули — это один и тот же код на Rust везде, поэтому одно приложение работает на всех платформах. Приложение на Rust — это этот код и ваш крейт, без виртуальной машины JavaScript; приложение на TSX запускает свои модули на QuickJS поверх него (Building with Rust).

На любой платформе приложение используется двумя одинаковыми способами: упаковывается как устанавливаемое приложение этой платформы (nsh package) или встраивается в ваше собственное нативное приложение, независимо от того, подключает ли хост корень на Rust или загружает TSX во время выполнения. Разрабатывать его можно с помощью nsh run (правки на Rust пересобирают и перезапускают приложение, правки на TSX применяются как горячие обновления).

#Коротко

ПлатформаБэкенд; текстРаботает наРазработкаУпаковка
iOSUIKit; CoreTextiOS 15.0+, устройства и симуляторnsh run --target ios.app (симулятор), подписанный .ipa
AndroidAndroid views; StaticLayoutAndroid 9 (API 28)+, arm64-v8a, armeabi-v7a и x86_64nsh run --target androidподписанный .apk
macOSAppKit и Core Animation; CoreTextmacOS 14+nsh run --target macos.app с ad hoc-подписью
Windowsокна Win32, отрисованные через Direct2D; DirectWriteWindows 10 1809+, Windows 11nsh run (по умолчанию в Windows)каталог и .zip
Linuxвиджеты GTK 4; PangoGTK 4.14+nsh run (по умолчанию в Linux)каталог и .tar.gz
GPUIGPUI; текстовая система GPUImacOS, Windows, Linux (Vulkan)в вашем приложении GPUI; TSX также с nsh run --target gpuiвнутри приложения GPUI, которое его встраивает
WebHTML и CSS; шрифты браузерасовременные браузеры, на компьютерах и телефонахnsh run --target webстатический сайт
  • GPUI рисует приложения с помощью GPUI, фреймворка родственного проекта GPUI Kit, одинаково на macOS, Windows и Linux: это бэкенд для встраивания в приложения GPUI и GPUI Kit, которые размещают AppView в собственном дереве элементов. Автономные настольные приложения запускаются и упаковываются с собственным бэкендом каждой ОС (AppKit, Win32, GTK 4).
  • Web отображает приложения как HTML на веб-странице: nsh package --target web публикует статический сайт для любого веб-сервера или CDN, при этом движок и крейт приложения на Rust компилируются в WebAssembly, а ваша собственная страница встраивает приложение через createPlayer или iframe. Он же запускает живые демо и песочницу на этом сайте.
  • Mac Catalyst запускает бэкенд iOS в окне размером с iPhone (390×844) на Mac, для разработки. Выберите его через --target catalyst, чтобы увидеть, как приложение выглядит на телефоне.

#Разработка и упаковка

nsh run выбирает собственную платформу машины, если вы не указали --target: AppKit на macOS, окно GTK в Linux и окно Win32 в Windows. К телефонам обращаются с компьютера: к iOS — с Mac с установленным Xcode, к Android — с macOS, Linux или Windows с Android SDK (Installation).

Приложение на Rust (его nsh.json называет компонент "root") запускается и упаковывается из своего каталога: nsh собирает собственный раннер приложения для целевой платформы, с вашим крейтом и без QuickJS. Приложение на TSX указывает свою точку входа:

# A Rust app, from its directory
nsh run --target macos             # or ios, android, windows, linux, web, catalyst
nsh package --target macos         # or ios, ios-simulator, android, windows, linux, web

# A TSX app
nsh run App.tsx --target macos     # or ios, android, windows, linux, gpui, web, catalyst
nsh package App.tsx --target macos

Каждая настольная ОС упаковывает приложения со своим бэкендом, собранным для той машины, на которой он запускается: приложение для Mac упаковывайте на Mac, приложение для Windows — в Windows, а для Linux — в Linux. В разделе Packaging описаны результат сборки, подпись и значки для каждой цели.

#Встраивание в нативное приложение

ПлатформаПредставление хостаЗапускаетПоставляется какЯзык хоста
macOSAppView (NSView)корень на Rust, бандлы TSXкрейт nsh-platform-macosRust
WindowsAppView (дочернее окно)корень на Rust, бандлы TSXкрейт nsh-platform-windowsRust
LinuxAppView (виджет GTK)корень на Rust, бандлы TSXкрейт nsh-platform-linuxRust
GPUI (macOS, Windows, Linux)AppView (представление GPUI)корень на Rust, бандлы TSX, подписанные пакетыкрейт nsh-platform-gpuiRust
iOSAppView (UIView)корень на Rust, бандлы TSXкрейт nsh-platform-iosRust
iOSNshAppView (UIView)бандлы TSX, подписанные пакетыNativeShell.xcframeworkSwift
AndroidNshView (FrameLayout)бандлы TSX, подписанные пакетыnsh.aarJava или Kotlin
WebcreatePlayer (элемент страницы) или iframeбандлы TSX; приложение на Rust — как его опубликованный сайтфайлы среды выполнения из nsh package --target webJavaScript или HTML

Хост на Rust подключает корень на Rust (Root::of::<App>()) как AppSource::Rust или App::Rust и передаёт его движкам наборы UI приложения через set_ui_sets, поэтому загружаемый им TSX импортирует собственные компоненты и модули приложения. Каждое представление — это один движок, и приложение может показывать несколько. Хост регистрирует собственные нативные представления, которые приложения используют на каждой платформе (Native components).

#Код для всех платформ

Большая часть приложения не требует проверок платформы: элементы, стили, раскладка и модули ведут себя везде одинаково. Там, где платформы различаются, NSH отводит различию одно место (Platform-specific code):

  • Окружение сообщает, где запущено приложение: в Rust — os(), idiom() и is_desktop() (nsh_core::prelude), в TSX — platform.os, platform.idiom, platform.desktop и platform.select из nsh. ОС — это iOS, Android, macOS, Windows, Linux или веб.
  • Свойства только для определённой платформы задаются в ios={{…}}, android={{…}}, web={{…}} или desktop={{…}} в TSX (desktop: macOS, Windows, Linux и браузеры на компьютерах).
  • Ввод зависит от платформы. На телефонах — касания и экранная клавиатура; на настольных компьютерах — мышь, трекпад и клавиатура.

Компоненты приложения рисуются примитивами NSH, поэтому они работают как на настольных компьютерах, так и на телефонах и выглядят одинаково на обоих. Раскладка для компьютера строится из примитивов (view, text, scroll, virtual_list, …; View, Text, Scroll, List, … в TSX) и проверки на десктоп, как это сделано в десктопной раскладке галереи:

use nsh_core::prelude::*;

#[component]
pub fn Shell() -> impl IntoElement {
    // macOS, Windows, Linux and desktop browsers get a sidebar; phones get tabs.
    view()
        .flex_1()
        .child(if is_desktop() { sidebar_layout() } else { tab_layout() })
}

fn sidebar_layout() -> AnyElement {
    view().flex_1().flex_row().into_element()
}

fn tab_layout() -> AnyElement {
    view().flex_1().flex_col().into_element()
}

Каждый бэкенд перечисляет то, что делает по-своему: macOS, Windows, Linux, GPUI.

#См. также

  • Getting started: первое приложение, запущенное на каждой платформе.
  • Building with Rust: приложения на Rust и Rust с TSX.
  • Installation: инструменты, необходимые каждой платформе.
  • Architecture: что является общим и что делает каждый бэкенд.