Section 7/221 menit

7. Modular Architecture untuk Build Speed

7. Modular Architecture untuk Build Speed

Mengapa Modularisasi Mempercepat Build

Dengan membagi app ke beberapa framework/package, Xcode bisa:

  1. Mengkompilasi modul secara paralelNetworkKit dan UIComponents bisa dikompilasi bersamaan
  2. Skip recompile modul yang tidak berubah — ubah NetworkKit, Xcode tidak recompile UIComponents
  3. Cache pre-compiled modules — modul stabil jarang dikompilasi ulang

Struktur Modular yang Efektif

swift
MyApp/
├── App/                    # Main target — tipis, hanya composition root
├── Packages/
│   ├── NetworkKit/         # HTTP client, endpoints, models API
│   ├── UIComponents/       # Design system, reusable views
│   ├── CoreDomain/         # Business logic, use cases, entities
│   ├── DataLayer/          # Repository, persistence, caching
│   └── FeatureModules/
│       ├── HomeFeature/    # Feature-specific: hanya depend on Core + Network
│       ├── ProfileFeature/
│       └── CheckoutFeature/
└── Podfile / Package.swift

Package.swift untuk Local Package

swift
// Packages/NetworkKit/Package.swift
// Local package untuk modul Network

// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "NetworkKit",
    platforms: [.iOS(.v16)],
    products: [
        .library(name: "NetworkKit", targets: ["NetworkKit"]),
    ],
    dependencies: [],
    targets: [
        .target(
            name: "NetworkKit",
            dependencies: [],
            swiftSettings: [
                .enableExperimentalFeature("StrictConcurrency"),
            ]
        ),
        .testTarget(
            name: "NetworkKitTests",
            dependencies: ["NetworkKit"]
        ),
    ]
)

Aturan Dependency Antar Modul

Hindari circular dependency — ini akan membuat build graph rumit dan memperlambat semuanya.

swift
# ✓ Dependency yang baik (unidirectional)
MainApp → FeatureModules → CoreDomain → (tidak ada dependency internal)
MainApp → UIComponents   → (tidak ada dependency internal)
MainApp → DataLayer      → CoreDomain

# ❌ Circular dependency — akan error atau sangat lambat
CoreDomain → DataLayer → CoreDomain  (SIRKULAR — hindari!)