Valdi – Framework UI lintas platform dengan performa native
(github.com/Snapchat)- Valdi buatan Snap adalah framework UI lintas platform yang menghadirkan performa native di iOS, Android, dan macOS, dengan langsung mengompilasi UI yang ditulis secara deklaratif dalam TypeScript menjadi view native di tiap platform
- Berjalan tanpa WebView atau JavaScript bridge, serta mempertahankan performa tinggi lewat daur ulang view otomatis, mesin layout yang dioptimalkan, dan rendering berbasis viewport
- Mempercepat pengembangan dengan hot reload instan, debugging VSCode, dan dukungan sintaks TSX, sekaligus mendukung integrasi dengan aplikasi native yang sudah ada secara fleksibel
- Menyediakan struktur integrasi native yang mendalam melalui binding aman tipe antara TypeScript dan kode native, dukungan protobuf, serta interoperabilitas C++·Swift·Kotlin
- Merupakan teknologi yang telah teruji selama 8 tahun di aplikasi produksi Snap, dan menjadi fondasi pengembangan UI yang skalabel dengan fitur lanjutan seperti animasi skala besar, gesture, dan pemrosesan multithread
Ikhtisar Valdi
- Valdi adalah framework UI lintas platform yang telah digunakan Snap selama 8 tahun di aplikasi produksinya
- Saat UI ditulis secara deklaratif dalam TypeScript, hasilnya langsung dikompilasi menjadi view native di iOS, Android, dan macOS
- Menghadirkan performa native tanpa WebView atau JavaScript bridge
- Saat ini masih dalam tahap beta, dan direncanakan beralih ke versi resmi setelah alat dan dokumentasinya di lingkungan open source stabil
Fitur utama dan contoh
- Contoh komponen dasar memperlihatkan penyusunan UI sederhana di kelas
HelloWorldmenggunakandan - Menggunakan struktur komponen deklaratif berbasis TypeScript, dan dapat dijalankan dengan kode yang sama di tiap platform
- Menyediakan materi pengembang seperti dokumentasi resmi, panduan instalasi, referensi API, dan Codelab
Optimasi performa
- Untuk memastikan performa native, Valdi mengadopsi struktur berikut
- Daur ulang view otomatis: sistem pooling view global untuk memakai ulang view antar layar dan meminimalkan penundaan inflasi
- Rendering komponen independen: hanya komponen individual yang diperbarui tanpa memengaruhi rendering induk
- Mesin layout berbasis C++: berjalan dengan overhead minimal di thread utama
- Rendering sadar viewport: hanya meng-inflate view yang terlihat di layar sehingga meningkatkan performa infinite scroll
- Dokumen terkait Performance Optimization Guide juga tersedia
Pengalaman pengembang
- Fitur hot reload memungkinkan perubahan kode langsung diterapkan
- Dukungan debugging VSCode: dapat menetapkan breakpoint, memeriksa variabel, melakukan profiling performa, dan menangkap heap dump
- Menyediakan lingkungan pengembangan yang familier lewat sintaks TSX dan keamanan tipe
Struktur integrasi yang fleksibel
- Dapat menyisipkan Valdi ke aplikasi native yang sudah ada (
Embed Valdi in native) - Dapat menggunakan view native di dalam Valdi (
Embed native in Valdi) - Melalui modul Polyglot, dapat terhubung secara aman tipe dengan kode C++, Swift, Kotlin, dan Objective-C
- Dengan arsitektur full-stack, seluruh fungsi dapat diimplementasikan memakai background worker thread
Integrasi native
- Generasi kode otomatis mengubah antarmuka TypeScript menjadi binding Kotlin, Objective-C, dan Swift
- Melalui modul Polyglot, dapat langsung mengakses API platform dan library native pihak ketiga
- Komunikasi dua arah memungkinkan pertukaran struktur data kompleks dan callback dengan aman
- Mendukung protobuf untuk serialisasi data yang efisien
Stabilitas dan fitur yang telah terbukti
- Teknologi inti yang menjalankan fitur-fitur produksi utama Snap
- Mendukung animasi lanjutan, rendering real-time, dan sistem gesture kompleks
- Mencakup beragam fitur seperti layout Flexbox, worker multithread, animasi native, pengenalan gesture lanjutan, framework pengujian bawaan, dan build terintegrasi Bazel
Dukungan dan lisensi
- Menyediakan dukungan melalui komunitas Discord
- Dirilis di bawah lisensi MIT, sehingga bebas digunakan dan dikontribusikan
2 komentar
Komentar Hacker News
Perusahaan kami menggunakan React Native, dan kami sangat berharap bisa lepas dari perbedaan bahasa antara app store dan tiap platform.
Tahun depan kami mempertimbangkan untuk berbasis situs web saja, lalu aplikasi mobile cukup dibungkus dengan WebView, sementara fitur seperti notifikasi, GPS, dan HealthKit ditangani dengan kode native.
Belakangan ini saya juga merasa, berkat AI, mungkin justru lebih baik membuat UI terpisah untuk tiap platform.
Kuncinya adalah jangan membuat komponen UI terlalu unik, dan cukup sesuaikan sedikit hal-hal seperti gaya tombol atau back stack di masing-masing platform.
Kami juga menambahkan fungsi offline dengan Service Worker, dan menjalankan alat diagnostik jaringan saat aplikasi dimulai agar masalah bisa cepat terdeteksi.
Tapi aplikasi saya memang untuk B2B, jadi pendekatan seperti ini memungkinkan.
Saya menganggap web pada dasarnya adalah jalan untuk menghindari app store dan code signing.
Sebagian besar fitur tetap bisa dibuat di web, dan HealthKit saja yang ditangani lewat aplikasi pendamping terpisah.
Menggunakan anggaran pemasaran untuk mempromosikan QR code atau tautan mungkin jauh lebih efisien daripada bersaing di app store.
Khususnya di iOS, begitu tidak ada ‘swipe back’, kita langsung tahu itu WebView.
Saya menulis UI bisnis sekali lalu memakai LLM untuk mengonversinya antara React Native dan React.
Tapi Apple tetap mempertahankan aturan 4.2 tentang fungsionalitas minimum yang menyatakan “aplikasi yang sekadar membungkus situs web akan ditolak”.
Fitur dan pengujian harus disinkronkan di tiga platform, dan pengembang juga harus menguasai beberapa stack.
Sebagian besar pengguna hampir tidak merasakan perbedaan antara implementasi WebView yang bagus dan aplikasi native, tetapi biayanya terlalu besar.
Secara konsep Valdi tampak mirip dengan React Native.
Sekarang sudah ada tiga framework lintas platform berbasis React: React Native, Lynx.js(ByteDance/TikTok), dan Valdi.
Persaingan itu bagus, tetapi saya ragu apakah Valdi bisa cepat membangun ekosistem sebesar RN.
RN tahun ini sudah banyak berkembang dengan peningkatan engine Hermes, generator binding native, animasi multi-thread, dan dukungan Tailwind.
Lynx.js mungkin bahkan lebih diuntungkan karena mencoba mendukung framework selain React.
Radon IDE milik RN berbayar, sedangkan Valdi open source.
Menarik juga bahwa Valdi menggunakan engine Hermes milik RN.
Dari dokumentasi terkait, saya jadi penasaran bagaimana AOT/JIT diimplementasikan.
Dulu saya pernah ikut melakukan debugging pada versi awal proyek ini di Snap (Screenshop!).
Simon adalah engineer yang hebat, dan saya sangat senang proyek ini akhirnya dipublikasikan.
Selamat untuk tim Snap.
Itu lebih mengejutkan lagi karena ini aplikasi yang sangat bergantung pada integrasi native seperti kamera, AR, notifikasi, dan deteksi screenshot.
Senang melihat itu akhirnya jadi kenyataan.
Dia memang sangat pintar, dan selamat untuk seluruh tim.
Framework UI buatan Snapchat dengan komunitas Discord? Secara pribadi sama sekali tidak menarik bagi saya.
Memang tidak sempurna, tetapi bisa jadi kita justru menyingkirkan diri sendiri dari arus masa depan.
Di dokumentasi tertulis “jika objek C++, Objective-C, Kotlin diekspos ke TypeScript maka itu Native Reference, sebaliknya itu JS Value Reference”, tetapi
tidak adanya penyebutan Swift atau SwiftUI agak membuat khawatir.
Sejujurnya sulit bagi saya mempercayai framework buatan Snap.
Soalnya kualitas aplikasi Android mereka dulu sangat buruk.
Valdi diperkenalkan sebagai “framework UI yang ditulis sekali dalam TypeScript lalu berjalan dengan performa native di iOS, Android, dan macOS”.
Mereka menekankan bahwa tidak ada webview maupun JS bridge.
Menurut saya, cukup menulis UI dua kali dalam bahasa native masing-masing platform, lalu berbagi logika umum lewat FFI keluarga C.
Memangnya sesulit apa?
Sebagian besar tim kami pengguna Android, tetapi pelanggan kami lebih berpusat di iOS, jadi prioritasnya seperti itu.
Saya pernah membuat aplikasi RN, tetapi masih berharap ada solusi lintas platform yang benar-benar terasa seperti sihir.
Dengan begitu, beragam antarmuka seperti web, mobile, desktop, dan CLI hanya menjadi lapisan tipis yang memanggil core.
Mungkin sulit mendapatkan UX yang sepenuhnya konsisten, tetapi dalam jangka panjang ini bisa mengurangi ketergantungan pada framework pihak ketiga.
Jika penasaran dengan cara Valdi mengelola state, pendekatannya memakai gaya class component React apa adanya.
Dari contoh dokumentasi resmi, strukturnya adalah mewarisi
StatefulComponentlalu mengimplementasikanonCreate,onDestroy, danonRender.Cara sekarang yang memakai puluhan
useFunctionterasa lebih mudah salah dan lebih rumit.Sayangnya target Linux, Windows, dan HTML tidak didukung.
Di RN, untuk sebagian besar aplikasi, logika bisnis aplikasi biasanya bisa berjalan cukup cepat hanya dengan JS saja.
Saat masuk tahap polishing, menurut saya masalahnya jadi sangat sulit diselesaikan karena "sering ada perbedaan perilaku di tiap platform".