تُرجمت هذه الصفحة آليًا وقد تحتوي على أخطاء. اقرأ الأصل الإنجليزي

التوثيق

نظرة عامة على المنصات

يعمل NSH على الهواتف وأجهزة سطح المكتب والويب: iOS وAndroid وmacOS وWindows وLinux وGPUI وصفحات الويب. لكل منصة واجهة خلفية خاصة بها ترسم باستخدام واجهة المستخدم الأصلية للمنصة، فيكون التطبيق عناصر UIKit على iPhone، وعناصر AppKit على Mac، وعناصر GTK 4 على Linux، وعناصر GPUI في تطبيق GPUI، وHTML في المتصفح، مع نص المنصة وإدخالها وإمكانية الوصول فيها والوضع الداكن. كل ما يعلو الواجهة الخلفية مشترك: الرسم البياني التفاعلي والمُصيِّر وتخطيط Taffy والمكوّنات والوحدات الأصلية هي نفسها شيفرة Rust في كل مكان، لذلك يعمل تطبيق واحد على جميعها. التطبيق المكتوب بلغة Rust هو هذه الشيفرة مع الـ crate الخاص بك، دون آلة JavaScript الافتراضية؛ أما تطبيق TSX فيشغّل وحداته على QuickJS فوقها (البناء باستخدام 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 والـ crate الخاص به مُصرَّفَين إلى WebAssembly، وتضمّن صفحتك الخاصة تطبيقًا باستخدام createPlayer أو iframe. كما يشغّل العروض التجريبية الحية وplayground على هذا الموقع.
  • 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 (التثبيت).

يُشغَّل تطبيق Rust (يحدد nsh.json فيه مكوّن "root") ويُغلَّف من مجلده: يبني nsh المشغّل الخاص بالتطبيق للهدف، مع الـ crate الخاص بك ودون 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. يغطي التغليف مخرجات كل هدف والتوقيع والأيقونات.

#التضمين في تطبيق أصلي

المنصةعرض المضيفيشغّليُوزَّع على شكللغة المضيف
macOSAppView (NSView)جذر Rust وحزم TSXالـ crate nsh-platform-macosRust
WindowsAppView (نافذة فرعية)جذر Rust وحزم TSXالـ crate nsh-platform-windowsRust
LinuxAppView (عنصر GTK)جذر Rust وحزم TSXالـ crate nsh-platform-linuxRust
GPUI (macOS وWindows وLinux)AppView (عرض GPUI)جذر Rust وحزم TSX وحزم موقّعةالـ crate nsh-platform-gpuiRust
iOSAppView (UIView)جذر Rust وحزم TSXالـ crate 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، ويزوّد محرّكاته بمجموعات واجهة المستخدم الخاصة بالتطبيق باستخدام set_ui_sets، فيستورد TSX الذي يحمّله مكوّنات التطبيق ووحداته الخاصة. كل عرض هو محرّك واحد، ويمكن للتطبيق أن يعرض عدة محرّكات. ويسجّل المضيف عروضه الأصلية الخاصة لتستخدمها التطبيقات على كل منصة (المكوّنات الأصلية).

#الكتابة لكل المنصات

لا يحتاج معظم التطبيق إلى فحوص للمنصة: العناصر والأنماط والتخطيط والوحدات تتصرف بالطريقة نفسها في كل مكان. وحيثما تختلف المنصات، يمنح NSH الاختلاف موضعًا واحدًا (الشيفرة الخاصة بالمنصة):

  • تخبرك البيئة أين يعمل التطبيق: في 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.

#انظر أيضًا