Azimjon Abdurasulov

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-state kabi 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 UIViewRepresentable qobiqlari 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:

MezonYandex DivKitO'zingning Custom SDUI Dvigateling
Boshlash Tezligi2-3 kunda integratsiya qilinadi2-3 hafta (arxitektura + prototip)
Ilova Hajmiga Ta'siri (Binary Size)+7.5 MB (Katta qo'shimcha yuk)< 280 KB (Sof Native Swift)
Dizayn-Tizimga MoslashuvchanlikDivKit ibtidoiylariga bo'ysunasizKompaniyangizning har qanday SwiftUI komponentini ulay olasiz
Swift 6 & SwiftUI MosligiQisman (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 UnumdorlikYaxshi (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:

  1. **SDUICore (Zero UI Dependency):**
  2. Bu modulga import SwiftUI yoki import UIKit yozish qat'iyan taqiqlanadi.
  3. Faqat sof Swift: Decodable modellar, Schema validatori, Action protokollari va xatolar iyerarxiyasi (SDUIError).
  4. Nega muhim? Ushbu modulni hatto server tomonida (Swift Server / Vapor) ham qayta ishlatish mumkin!
  5. **SDUIRenderer (Presentation Layer):**
  6. SDUICore modellarini qabul qilib, ularni haqiqiy SwiftUI Viewlariga aylantiruvchi ComponentRegistry va Layout konteynerlari.
  7. **SDUINavigation (Routing Layer):**
  8. Serverdan kelgan dynamic navigatsiya komandalarini (push, sheet, fullScreenCover, deeplink) ilovaning navigatsiya stekiga xavfsiz ulovchi universal Router.
  9. **SDUIAnalytics (Event Bus):**
  10. 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:

  1. Uni UIKit loyihalarida yoki server tomonida (Swift Server / Vapor) qayta ishlatib bo'lmaydi.
  2. SDUICore Unit testlari UI oynasi yaratilmasdan, sof CPU registrlarida 10x tezroq bajariladi.
  3. 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!

Markdown manba

iOS Lessons