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

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

Сравнение подходов

NSH — это фреймворк для полноценных приложений на iOS, Android, macOS, Windows, Linux и в вебе, а также среда выполнения для UI, который доставляется в приложения после релиза. На этой странице NSH сначала сравнивается с кроссплатформенными фреймворками, на которых пишут приложения, а затем со способами, которыми приложения получают UI, не входивший в их поставку. Зелёный означает, что возможность доступна; жёлтый — что она требует больше собственной работы приложения или отдельного проекта; красный — что она не предоставляется. Отметки описывают доступность, а не производительность. Версии — это документированные минимумы каждого фреймворка на момент написания: проверяйте их для используемого релиза.

Легенда: Да · Частично · Нет.

#Кроссплатформенные фреймворки

ВозможностьNSHReact NativeFlutterQt 6GPUIGPUI FastSlint
Чем рисуетсяUI платформыПредставления платформыСобственный движокГраф сценыСобственный, GPUСобственный, GPUСобственный рендерер
Модель UIRetainedRetainedRetainedRetainedImmediateImmediate + retainedРеактивная, retained
ЯзыкRust, TSXJS, TSDartC++, QMLRustRustSlint + Rust, C++
iOS 15+ 15.1+ 15+ 17+ Rust
Android 9+ 7+ 7+ 9+
macOS 14+ Отдельно 12+ 13+ 12+ 12+ 13+
Windows 10 1809+ Отдельно 10+ 10 1809+ 10+ 10+ 10+
Linux GTK 4.14+ Debian 10+ Debian 11+ Vulkan Vulkan
Веб HTML Библиотека Canvas Canvas Canvas
Системный текст
UX под устройство
Без среды выполнения JS Rust-приложения C++
Подписанная доставка OTA QML Shell Shell
ЛицензияApache-2.0MITBSD-3-ClauseLGPL, GPL, коммерческаяApache-2.0Apache-2.0GPL, коммерческая

Immediate-режим заново строит описание UI в каждом кадре; retained-режим хранит его и обновляет только то, что изменилось. GPUI Fast сочетает оба режима поверх GPUI и работает там, где работает GPUI. «Shell» — это GPUI Shell.

NSH — единственный из перечисленных фреймворков, который объединяет всё это: собственный UI и собственный ввод текста каждой платформы; телефоны, десктопы и веб из одного приложения (веб — в виде HTML); Rust-приложения без среды выполнения JavaScript; подписанный UI в песочнице, доставляемый после релиза.

#Что означают строки

  • Чем рисуется, модель UI. NSH монтирует собственные представления каждой платформы и сохраняет их (retained-режим): изменение обновляет только затронутые представления. React Native тоже монтирует представления платформы — на iOS и Android. Flutter, Qt Quick, GPUI и Slint рисуют собственными рендерерами; GPUI строит дерево элементов в каждом кадре (immediate-режим), а GPUI Fast повторно использует то, что не изменилось.
  • Платформы. Минимумы NSH собственные (Platforms). Остальные взяты из React Native 0.76 (iOS 15.1, Android 7 / API 24; macOS и Windows — через отдельные проекты react-native-macos и react-native-windows, веб — через библиотеку react-native-web), Flutter 3.47, Qt 6.10, требований Zed для GPUI и руководств Slint по платформам (iOS — из Rust). «Canvas» означает, что фреймворк рисует в canvas на странице; веб-приложения NSH — это HTML-элементы со стилями CSS, которые браузер сам прокручивает, выделяет и редактирует (Web).
  • Системный текст. Текстовые поля NSH — это редакторы платформы: UITextView, EditText, NSTextView, TextView в GTK, редакторы браузера, — с системными методами ввода, маркерами выделения и меню редактирования; в Windows собственный редактор NSH работает с DirectWrite и системными методами ввода (IMM32). React Native тоже использует текстовые поля платформы. Фреймворки с самостоятельной отрисовкой реализуют редактирование текста сами и подключают его к системным методам ввода.
  • UX под устройство. Базовые компоненты NSH следуют устройству: один и тот же Menu — это всплывающее окно у элемента-триггера при использовании указателя и панель снизу на телефоне, а ContextMenu открывается по правому клику или долгому нажатию пальцем. В остальных фреймворках адаптация взаимодействия под устройство в основном остаётся работой самого приложения.
  • Без среды выполнения JS. Раннеры Rust-приложения не подключают движок JavaScript ни на одной платформе; TSX — второй путь, на том же движке. QML в Qt Quick работает на JavaScript-движке Qt; Qt Widgets на C++ — нет.
  • Подписанная доставка. NSH проверяет подписанные пакеты .nshpkg по доверенным ключам и списку отзыва и запускает каждый в виртуальной машине с ограничениями и возможностями, которые предоставляет хост (Signed packages, Sandbox and capabilities). Обновления React Native «по воздуху» доставляют доверенный код приложения; Qt умеет загружать файлы QML; приложения GPUI принимают модули JavaScript через GPUI Shell.

#Чем NSH отличается

  • Нативность на каждой платформе, в обоих смыслах. Каждый бэкенд построен на собственных представлениях, тексте и методах ввода своей платформы — UIKit, представления Android, AppKit, Win32 с Direct2D, GTK 4, HTML, — а вместе с ними приходит и взаимодействие, принятое на платформе. Выделение текста, методы ввода и доступность — системные, и всё, что новый выпуск ОС приносит в них, доходит до приложения (Introduction).
  • Телефоны, десктопы и веб из одного приложения. Шесть платформ — это бэкенды одного фреймворка, с раскладками, которые перестраиваются, и вводом, который следует устройству; в вебе приложение — это HTML, публикуемый как статический сайт.
  • Сначала Rust, без среды выполнения JavaScript. Приложение целиком может быть на Rust от начала до конца, скомпилированное в нативный код, с типами, потоками и крейтами Rust. TSX — второй путь, на том же движке, для быстро пишущихся экранов (Building with Rust).
  • Retained-представления для повседневных приложений. Чаты, формы, списки и документы в покое почти не потребляют ресурсов, потому что изменение отправляет только затронутые представления (Introduction).
  • UI, доставляемый после релиза, подписанный и в песочнице. Приложения, созданные на NSH, — а также нативные приложения, написанные штатными инструментами каждой платформы, — получают модули TSX во время выполнения; их пишет команда или генерирует ИИ (Dynamic UI).
  • Один набор инструментов — для людей и агентов. Один исполняемый файл nsh создаёт, запускает, тестирует на реальных платформах, упаковывает и подписывает приложения для всех целей.

#React Native

React Native ближе всего по замыслу: оба сокращают дублирование клиентской работы и используют представления платформы. В центре React Native — JavaScript или TypeScript с React и его экосистемой пакетов, на iOS и Android, а поддержка десктопов вынесена в отдельные проекты. В центре NSH — Rust: его среда выполнения, рендерер и модули написаны на Rust, Rust сам является языком приложений, а TSX — один из двух путей; шесть платформ, включая десктопы и веб, — это бэкенды одного и того же фреймворка.

#Flutter

Flutter рисует каждый пиксель собственным движком, поэтому приложение выглядит одинаково на всех платформах. NSH идёт другим путём: он использует представления, текст и ввод текста каждой платформы, а в вебе — HTML-элементы и собственные прокрутку, выделение и ввод браузера. Редактирование текста, методы ввода и выделение принадлежат платформе и не реализуются заново для каждой из них.

#Qt

Qt — зрелый тулкит с двумя UI-технологиями, Qt Widgets и Qt Quick, а также с давними инструментами и поддержкой платформ. NSH отличается основой и моделью: Rust как основной язык с путём через TSX, набор инструментов, рассчитанный на автоматизированную (в том числе управляемую ИИ) разработку, веб, отображаемый как HTML, и взаимодействие на мобильных устройствах, десктопе и в вебе, адаптированное внутри одной модели компонентов.

#GPUI и GPUI Fast

GPUI — UI-фреймворк на Rust, который рисует с помощью GPU и создан для требовательных десктопных приложений; GPUI Fast — форк от Longbridge с retained-рендерингом: он повторно использует неизменённые представления, раскладку и измерения текста, а также слои прокрутки и нативную композицию окон. NSH, напротив, строится на представлениях каждой платформы, поэтому ввод текста, выделение, методы ввода и системное взаимодействие — родные для платформы, а кроме того, NSH охватывает телефоны и веб; бэкенд NSH для GPUI встраивает приложения NSH в приложения на GPUI и GPUI Kit (GPUI).

Они подходят для разных нагрузок. В тесте производительности NSH (Linux, таблица котировок из 500 строк, NSH на бэкенде GTK 4) обычные нагрузки обходятся одинаково: при 1000 котировок в секунду NSH Rust использует 18% ядра, а GPUI Fast — 20%. При длительных плотных обновлениях GPUI Fast впереди: при 20 000 котировок в секунду он использует 25% ядра, тогда как NSH — 73–78%, а покадровая анимация 1000 блоков обходится ему примерно в треть от нагрузки NSH на CPU.

#Slint

Slint — декларативный UI-тулкит со своим языком и лёгкими рендерерами для десктопов и встраиваемых устройств, используемый из Rust, C++, JavaScript или Python. Оба ценят нативную производительность; путь NSH — собственный UI и взаимодействие каждой платформы, HTML в вебе, Rust и TSX как языки приложений и разработка с помощью ИИ на шести платформах.

#Electron и Tauri

Electron включает в поставку Chromium, а Tauri использует системный web view: оба создают десктопные приложения (а Tauri — и мобильные) из веб-контента, с текстом и вводом браузера. NSH же строит собственные представления каждой платформы и отображает HTML только в самом вебе.

#UI, доставляемый после релиза

У приложения, которому нужен UI, не поставлявшийся вместе с ним, — ответы, сгенерированные моделью, функции от партнёров или других команд, экраны, меняющиеся без релиза, — есть несколько устоявшихся вариантов, как на телефонах, так и на десктопах. Они различаются тем, что рисует UI, что может делать доставляемый код и насколько сильно нужно изменить приложение, чтобы его принять.

ВозможностьNSHWeb viewServer-driven UIМини-программыOTA-обновления
Кто рисуетUI платформыДвижок браузераПредставления приложенияВеб-движок + слойРендерер фреймворка
Нативный внешний вид и поведение
Собственное состояние, логика и раскладка
Нативные компоненты хоста Мост
Песочница, настраиваемая хостом Same-origin Схема
Подписанные пакеты с возможностью отзыва
Подходит для UI, сгенерированного ИИ Веб-страницы
Цена для приложения-хостаОдно представление и библиотекаДвижок браузера на каждое представлениеРендерер на каждый компонентSDK контейнераВсё приложение внутри фреймворка
  • Web view (H5). Страница в движке браузера: всё, что можно выразить в HTML, с внешним видом браузера и написанным вручную мостом к нативному коду.
  • Server-driven UI. JSON, который заново комбинирует компоненты и действия, уже поставляемые с приложением: его легко генерировать, но у него нет локального состояния и логики сверх того, что даёт схема.
  • Контейнеры мини-программ. Специфичный для платформы фреймворк и API поверх веб-движка внутри большого SDK контейнера.
  • Обновления по воздуху (например, React Native с сервисом code-push). Весь фреймворк целиком, но обновления — это доверенный код приложения, и само приложение должно быть написано на этом фреймворке.
  • NSH. Модуль на TSX со своим состоянием, логикой, анимацией и раскладкой, отображаемый средствами UI самой платформы и способный использовать зарегистрированные хостом нативные представления. Он приходит как подписанный пакет, который приложение проверяет, работает в собственной VM с ограничениями на память, время вызова и число узлов и получает доступ только к тем сетевым хостам, веб-страницам и системным настройкам, которые разрешил хост (Песочница и возможности). Хост добавляет одно представление в том месте, где появляется модуль (Платформы), а один и тот же бандл работает на всех платформах. Именно поэтому NSH существует наряду с GPUI Shell.

#Когда лучше подойдёт другой вариант

  • Экран определяется длительными плотными обновлениями тысяч представлений — терминал рыночных данных, получающий десятки тысяч котировок в секунду, или пользовательская визуализация, перерисовываемая каждый кадр: retained-рендеринг GPUI Fast на GPU использует лишь долю CPU (см. GPUI и GPUI Fast).
  • Приложение должно выглядеть пиксель в пиксель одинаково на каждой платформе: фреймворк, который рисует всё сам, например Flutter или Slint, обеспечивает это по своей конструкции.
  • Вам уже сегодня нужна большая экосистема сторонних пакетов: у React Native, Flutter и Qt она копилась годами.
  • UI — это документ или существующая веб-страница: web view покажет её как есть.
  • Набор экранов фиксирован и невелик, а меняются только содержимое и порядок: server-driven UI вообще не требует рантайма.

#См. также