02. Open-Source vs Custom SPM Dvigateli
⚡ Server-Driven UI (SDUI) — Mukammal Enterprise & System Design
02. Ochiq Manbali SPM Kutubxonalari vs O'z Dvigatelingni Yozish
"Tayyor framework sizga 1-kunda tezlik beradi, ammo 1-yildan keyin uning cheklovlari asiriga aylantiradi. In-house dvigatel esa boshida puxta arxitektura talab qiladi, ammo kompaniyangizga to'liq mustaqillik, minimal hajm va cheksiz moslashuvchanlik taqdim etadi."
1. Dunyodagi Yetakchi Ochiq Manbali SDUI Kutubxonalari Tahlili
Bugungi kunda iOS ekotizimida SDUI joriy qilish uchun bir nechta yirik ochiq manbali va tijoriy yechimlar mavjud:
flowchart TD
subgraph Solutions["SDUI Yechimlari Ekotizimi"]
direction TB
DivKit["Yandex DivKit\n(Eng yetuk Open-Source)"]
Judo["Judo.app\n(Vizual No-Code + SDK)"]
Hyperview["Hyperview\n(XML-based Hypermedia)"]
Epoxy["Airbnb Epoxy\n(Komponentlar bazasi)"]
Custom["In-House Custom SPM\n(Sof Native Swift 6)"]
end
style DivKit fill:#181d26,stroke:#60a5fa,stroke-width:1px
style Custom fill:#181d26,stroke:#bef264,stroke-width:2px
1. Yandex DivKit (github.com/divkit/divkit)
DivKit — bu Yandex tomonidan ochiq manbali (Apache 2.0) qilingan, dunyodagi eng ilg'or multiplatform (iOS, Android, Web) SDUI tizimidir.
- Arxitekturasi: Server JSON formatida
div-container,div-text,div-image,div-gallery,div-statekabi ibtidoiy (primitive) bloklarni yuboradi. - Kuchli Tomonlari:
- Expressions Engine: Serverdan yuborilgan dinamik hisob-kitoblarni klientda bajaradi:
"color": "@{user.balance > 0 ? '#4ade80' : '#f87171'}" - Reaktiv O'zgaruvchilar (Variables): Klientda lokal o'zgaruvchilarni saqlash va ularga qarab layoutni avtomatik qayta chizish imkoniyati.
- Tayyor Layout Motori: Matn o'lchamini hisoblash, Flexbox uslubidagi joylashtirish va kesh tizimi allaqachon mukammal ishlangan.
- Jiddiy Kamchiliklari:
- Binary Size Shishishi: DivKit iOS ilova hajmiga to'g'ridan-to'g'ri +6.5 MB dan +8.2 MB gacha qo'shimcha hajm qo'shadi!
- UIKit Qoldiqlari: Framework'ning asosiy qismi Objective-C/UIKit davrida boshlangan, zamonaviy SwiftUI va Swift 6 Strict Concurrency bilan ishlashda ko'plab
UIViewRepresentableqobiqlari orqali xotira xarajatlari ortadi.
2. Hyperview (hyperview.org)
- JSON o'rniga XML formatini ishlatadi (Veb HTML uslubida mobil ilovalar uchun gipermedia).
- Har bir ekran alohida XML hujjati bo'lib, navigatsiya
href="/screen2.xml"shaklida ishlaydi. - Kamchiligi: Mobil protsessorlarda XML parslash JSON va Protobuf'ga nisbatan 3-4x ko'proq CPU va batareya sarflaydi.
2. Katta Tanlov: Tayyor Framework vs In-House Custom Engine?
Staff Mobile Architect darajasidagi qiyosiy tahlil matritsasi:
| Mezon | Yandex DivKit | O'zingning Custom SDUI Dvigateling |
|---|---|---|
| Boshlash Tezligi | 2-3 kunda integratsiya qilinadi | 2-3 hafta (arxitektura + prototip) |
| Ilova Hajmiga Ta'siri (Binary Size) | +7.5 MB (Katta qo'shimcha yuk) | < 280 KB (Sof Native Swift) |
| Dizayn-Tizimga Moslashuvchanlik | DivKit ibtidoiylariga bo'ysunasiz | Kompaniyangizning har qanday SwiftUI komponentini ulay olasiz |
| Swift 6 & SwiftUI Mosligi | Qisman (Asosi UIKit bazasida) | 100% Sof SwiftUI + Strict Concurrency |
| Uchinchi Tomon Bog'liqligi (Supply Chain Risk) | Yuqori (Tashqi repozitoriyga bog'liqsiz) | Nol (To'liq sizning jamoangiz nazoratida) |
| Xotira va 120 FPS Unumdorlik | Yaxshi (ammo C++/ObjC ko'priklari bor) | Maksimal Native (Zero Bridging Overhead) |
flowchart TD
Start["Qaysi yo'lni tanlash kerak?"] --> CheckPlatforms{"Barcha platformalarda (Android, iOS, Web)\n1 ta backend jamoasi 100% bir xil\nUI boshqarishi shartmi?"}
CheckPlatforms -->|"Ha, resurs kam"| DivKitPath["✅ Yandex DivKit yoki Judo tanlang\n(Tez, ammo ilova og'irlashadi)"]
CheckPlatforms -->|"Yo'q, Apple tajribasi 1-o'rinda"| CheckQuality{"FinTech, E-Commerce, 120 FPS silliqlik,\nminimal hajm va qat'iy xavfsizlik kerakmi?"}
CheckQuality -->|"Ha (Yuqori daraja)"| CustomPath["✅ O'z Custom SPM Frameworkingizni quring!\n(Tavsiya etiladigan yo'l)"]
CheckQuality -->|"Yo'q"| DivKitPath
style CustomPath fill:#0d1f14,stroke:#4ade80,stroke-width:2px
style DivKitPath fill:#181d26,stroke:#60a5fa,stroke-width:1px
3. Enterprise In-House SDUI SPM Arxitekturasi
Agar siz kompaniyangizda professional darajadagi SDUI tizimini qursangiz, uni hech qachon asosiy loyiha kodi ichiga aralashtirib yozmasligingiz kerak. Uni toza, mustaqil va alohida test qilinadigan Swift Package (SPM) sifatida loyihalash shart.
Quyidagi diagrammada enterprise-darajadagi modulli ajratish ko'rsatilgan:
graph TD
subgraph HostApp["Mobil Ilova (FinTech / Storefront)"]
AppFeature["Features (Home, Orders, Profile)"]
end
subgraph SDUIPackage["EnterpriseSDUI (Swift Package)"]
direction TB
SDUINavigation["SDUINavigation\n(Router, Coordinators, Deeplink Resolver)"]
SDUIRenderer["SDUIRenderer\n(View Builders, Registry, Modifiers)"]
SDUIAnalytics["SDUIAnalytics\n(Impression & Click Tracker)"]
SDUICore["SDUICore\n(Pure Models, JSON Schema, Safe Decoding, Protocols)"]
SDUINavigation --> SDUICore
SDUIRenderer --> SDUICore
SDUIAnalytics --> SDUICore
end
AppFeature --> SDUINavigation
AppFeature --> SDUIRenderer
AppFeature --> SDUIAnalytics
style SDUICore fill:#131720,stroke:#bef264,stroke-width:2px
style SDUIRenderer fill:#131720,stroke:#7da2ce,stroke-width:1px
style SDUINavigation fill:#131720,stroke:#7da2ce,stroke-width:1px
Modullarning Qat'iy Vazifalari:
- **
SDUICore(Zero UI Dependency):** - Bu modulga
import SwiftUIyokiimport UIKityozish qat'iyan taqiqlanadi. - Faqat sof Swift:
Decodablemodellar, Schema validatori, Action protokollari va xatolar iyerarxiyasi (SDUIError). - Nega muhim? Ushbu modulni hatto server tomonida (Swift Server / Vapor) ham qayta ishlatish mumkin!
- **
SDUIRenderer(Presentation Layer):** SDUICoremodellarini qabul qilib, ularni haqiqiy SwiftUIViewlariga aylantiruvchiComponentRegistryva Layout konteynerlari.- **
SDUINavigation(Routing Layer):** - Serverdan kelgan dynamic navigatsiya komandalarini (
push,sheet,fullScreenCover,deeplink) ilovaning navigatsiya stekiga xavfsiz ulovchi universal Router. - **
SDUIAnalytics(Event Bus):** - Komponentlar ekranga chiqqanda (Impression) va bosilganda (Click) server belgilagan parametrlarni avtomatik ravishda tahlil tizimiga (Firebase/Amplitude) uzatuvchi qatlam.
4. Aniq Kod: Enterprise Package.swift Konfiguratsiyasi
Quyida Swift 6 Strict Concurrency standartiga moslashtirilgan mukammal Package.swift fayli:
// swift-tools-version: 6.0
import PackageDescription
let package = Package(
name: "EnterpriseSDUI",
platforms: [
.iOS(.v17),
.macOS(.v14)
],
products: [
.library(name: "SDUICore", targets: ["SDUICore"]),
.library(name: "SDUIRenderer", targets: ["SDUIRenderer"]),
.library(name: "SDUINavigation", targets: ["SDUINavigation"]),
.library(name: "SDUIAnalytics", targets: ["SDUIAnalytics"])
],
targets: [
// 1. Asosiy Kontrakt va Modellar (Sof Swift, UI kutubxonalarisiz)
.target(
name: "SDUICore",
dependencies: [],
swiftSettings: [
.enableUpcomingFeature("StrictConcurrency"),
.enableUpcomingFeature("ExistentialAny")
]
),
// 2. Chizuvchi Dvigatel (SwiftUI & UIKit)
.target(
name: "SDUIRenderer",
dependencies: ["SDUICore"]
),
// 3. Dinamik Navigatsiya va Routing
.target(
name: "SDUINavigation",
dependencies: ["SDUICore"]
),
// 4. Analitika va Event Bus
.target(
name: "SDUIAnalytics",
dependencies: ["SDUICore"]
),
// 5. Unit & Snapshot Testlar
.testTarget(
name: "EnterpriseSDUITests",
dependencies: [
"SDUICore",
"SDUIRenderer",
"SDUINavigation",
"SDUIAnalytics"
]
)
]
)
5. Loyiha Papkalar Strukturasi (Directory Blueprint)
Enterprise SPM paketi quyidagi fayl strukturasiga ega bo'lishi kerak:
EnterpriseSDUI/
├── Package.swift
├── Sources/
│ ├── SDUICore/
│ │ ├── Models/
│ │ │ ├── ComponentNode.swift
│ │ │ ├── ActionNode.swift
│ │ │ └── LayoutNode.swift
│ │ ├── Decoding/
│ │ │ ├── SafeDecodableArray.swift
│ │ │ └── AnyCodable.swift
│ │ └── Protocols/
│ │ └── SDUIActionHandling.swift
│ ├── SDUIRenderer/
│ │ ├── Registry/
│ │ │ ├── ComponentRegistry.swift
│ │ │ └── FallbackViews.swift
│ │ └── Containers/
│ │ ├── SDUIScreenView.swift
│ │ └── SDUIDynamicGrid.swift
│ ├── SDUINavigation/
│ │ ├── Router/
│ │ │ ├── SDUIRouter.swift
│ │ │ └── PresentationStyle.swift
│ │ └── Resolvers/
│ │ └── DeeplinkResolver.swift
│ └── SDUIAnalytics/
│ └── Tracker/
│ └── SDUIEventDispatcher.swift
└── Tests/
└── EnterpriseSDUITests/
├── DecodingTests.swift
└── RouterTests.swift
6. Interaktiv Savol-Javob (Self-Check Quiz)
<details> <summary><b>1-Savol: Nega SDUICore moduliga 'import SwiftUI' qilish Clean Architecture tamoyillarini buzadi?</b> (Yechimni ko'rish uchun bosing)</summary>
Tahlil va Yechim: Domen va Kontrakt qatlami (Domain/Contract Layer) taqdimot qatlamidan (Presentation Layer) butunlay mustaqil bo'lishi shart. Agar SDUICore SwiftUI'ga bog'lansa:
- Uni UIKit loyihalarida yoki server tomonida (Swift Server / Vapor) qayta ishlatib bo'lmaydi.
SDUICoreUnit testlari UI oynasi yaratilmasdan, sof CPU registrlarida 10x tezroq bajariladi.- SwiftUI versiya o'zgarishlari (masalan iOS 17 -> iOS 18) Core modellarga hech qanday ta'sir ko'rsatmaydi.
</details>
<details> <summary><b>2-Savol: Qaysi holatda DivKit'ni tanlash o'z dvigatelingizni yozishdan afzalroq bo'ladi?</b> (Yechimni ko'rish uchun bosing)</summary>
Tahlil va Yechim: Agar kompaniyada alohida iOS, Android va Web mobil jamoalari bo'lmasa yoki dasturchilar soni cheklangan bo'lsa, va 1 ta yagona backend jamoasi barcha 3 ta platforma uchun 1 kunda bir xil layout ishlab chiqarishi shart bo'lsa. DivKit har uchala platforma uchun tayyor chizish dvigateliga ega bo'lgani sababli bir necha oylik ishlab chiqish vaqtini tejab beradi. </details>
7. Amaliy Topshiriq (Senior Challenge)
Terminalingizda alohida EnterpriseSDUI nomli SPM paketi yarating va yuqoridagi Package.swift konfiguratsiyasini kiriting. swift build buyrug'i orqali barcha 4 ta modul muammosiz kompilyatsiya bo'lishini va modullar o'rtasida circular dependency (aylanma bog'liqlik) yo'qligini tekshiring!