Tüm Yazılar
KategoriFull-Stack
Okuma Süresi
13 dk
Yayın Tarihi
2026-10-02
Kelime Sayısı
2.783kelime

Kahveni hazırla - bu içerikli bir makale!

Bun 1.4: Zig'den Rust'a — Pratikte Ne Değişti?

Özet

Bun 1.4 yenilikleri Rust'a geçişle geldi: Node.js uyumluluk rakamları, Bun.WebView, Bun.cron() ve gerçek kaynaklarla — ne zaman Bun'ı, ne zaman Node'u seçmelisin?

  • Bun 1.4, çekirdek kod tabanını Zig'den Rust'a taşıyan ilk sürüm; Node.js v26.3.0 test paketinden +1.517 yeni testi geçiyor.
  • Bun.Image, Bun.WebView, Bun.markdown, Bun.cron() ve Bun.Terminal ile 15 npm bağımlılığı yerleşik hale geldi.
  • İdle CPU 5 kat azaldı; bellek genel özette %35'e kadar, HTTP sunucularında %13-%48 arasında düştü — hepsi Bun'ın kendi ölçümü.
  • Bun kendisi 'henüz %100 Node.js uyumlu değil' diyor; node:tls gibi güvenlik-kritik modüllerde geçme oranı daha düşük (%85).
Bun 1.4: Zig'den Rust'a — Pratikte Ne Değişti?

Bun 1.4, çekirdek kod tabanının Zig'den Rust'a taşınmasıyla gelen ilk sürüm — ve bu, son yıllardaki en büyük JavaScript runtime yeniden yazımlarından biri. Ekip duyuruda bunu doğrudan "And it rewrites Bun from Zig to Rust." cümlesiyle özetliyor. Bu yazıda Bun 1.4 yenilikleri Rust geçişinin kapsamını, Node.js uyumluluk rakamlarını, yeni Bun.WebView ve Bun.cron() gibi API'leri, ölçülen performans kazanımlarını ve hangi işte Bun'ı tercih etmen gerektiğini kaynaklı biçimde inceliyoruz.

💡 Pro Tip: Production'a geçmeden önce bun --version ile pinlenmiş bir sürümü kilitle; 1.4.x hattı hâlâ sık patch alıyor, canary derlemesini asla prod'a alma.

İçindekiler

Bun'ın kendi cümlesi: "Zig'den Rust'a" — kapsam ve sınır

Bun'ın resmi duyurusu (bun.com/blog/bun-v1.4) geçişi tek cümlede tanımlıyor; taşımanın teknik arka planı ise ayrı bir yazıda, bun.com/blog/bun-in-rust'ta anlatılıyor. Claude Code v2.1.181 (17 Haziran 2026) ve sonrası bu Rust portunu kullanıyor. Aynı yazıya göre taşıma, yorum satırları hariç 535.496 satır Zig kodunu kapsıyor — bu kesin rakam Bun'ın kendi ölçümü.

Burada dikkatli olunması gereken bir nokta var: "tüm runtime artık Rust" gibi bir genelleme, kaynağın kendi cümlesini aşıyor.

Bun'ın kendi ifadesi "Zig'den Rust'a taşıma" — yani belirli bir kapsam. FFI sınırlarında ve bazı düşük seviye katmanlarda hâlâ unsafe Rust bloklarına ve C++ bağlantılarına ihtiyaç var; Bun'ın kendi ölçümüne göre Rust kodunun yaklaşık %4'ü bir unsafe bloğunun içinde (~780.000 satırlık kod tabanında ~27.000 satır) ve bu blokların %78'i tek satırlık — C++'tan gelen bir pointer ya da bir C kütüphanesine tek çağrı. Varsayılan binary konusunda ise belirsizlik yok: Bun v1.4.0, Rust ile yazılan ilk Bun sürümü. Pratik sonuç: geçişi tamamlanmış ama hâlâ olgunlaşan bir taşıma olarak oku ve npm dist-tags.latest üzerinden sürüm sürüm takip et.

Süreç tarafındaki rakamlar Bun'ın kendi yazısında birinci ağızdan duruyor: taşıma 11 gün sürdü, derleyici hatalarının düzeltildiği aşamada iş 64 Claude arasında bölüştürüldü ve merge öncesi maliyet API fiyatlandırmasıyla yaklaşık 165.000 dolar oldu. Aynı yazı rewrite'ın 19 bilinen regresyon doğurduğunu ve bunların her birinin düzeltildiğini söylüyor.

Sürüm zaman çizelgesi

Rewrite'ın "ne zaman, hangi sürümle geldiği" sorusunun cevabı GitHub Releases API ve npm registry üzerinden birebir doğrulanabilir:

Sürüm
Tarih
Not
v1.3.14
13 Mayıs 2026
Rewrite öncesi son büyük Zig tabanlı sürüm
v1.4.0
20 Ağustos 2026 (GitHub: 2026-08-20T14:07:21Z)
İlk Rust tabanlı resmi sürüm
v1.4.2
05 Eylül 2026 (GitHub: 2026-09-05T05:55:48Z)
Güncel stabil (23 Eylül 2026 itibarıyla)

v1.3.14 ile v1.4.0 arasındaki 99 günlük boşluk — iki sürümün GitHub Releases tarihinden doğrudan hesaplanıyor — rewrite'ın kapsamının küçük bir iş olmadığının dolaylı bir kanıtı. Kendi ortamında hangi sürümün şu anda "stabil" sayıldığını doğrulamak için npm registry'yi doğrudan sorgulayabilirsin:

bash
1# npm dist-tags — latest ve canary etiketlerini ayır
2curl -s https://registry.npmjs.org/-/package/bun/dist-tags

Node.js uyumluluğu rakamlarla

Bun 1.4, Node.js v26.3.0'ın kendi test paketine karşı çalıştırılıyor ve +1.517 yeni testi geçmeye başladı — bu, Bun 1.0'dan bu yana tek sürümde görülen en büyük sıçrama. Sürüm döngüsü boyunca (1.3 → 1.4) toplam 2.900'den fazla issue kapatıldı. Bunu Rust rewrite'ının kendisinin düzelttiği 128 bug ile karıştırma: 2.900+ rakamı sürüm duyurusunun genel issue kapatma sayısı, 128 ise "bun-in-rust" yazısının verdiği, v1.3.14'te birebir yeniden üretilebilen bug sayısı.

Modül bazında geçme oranları şöyle:

Node.js modülü
Geçen / Toplam test
node:quic
235 / 237
node:http (yeniden yazılan)
403 / 415
node:fs
349 / 358
node:tls
191 / 224
node:sqlite
18 / 18 (%100)

Bazı modüllerde Node'un kendi test setinin %97-100'ü geçiyor. Ama Bun kendisi de netleştiriyor: "Bun henüz %100 Node.js uyumlu değil." Bu sınır, yazının sonundaki "hangi işte Bun, hangi işte Node" tavsiyesinin temelini oluşturuyor — özellikle native addon'a bağımlı veya nadir kullanılan API yüzeylerine ihtiyaç duyan kod tabanları için hâlâ risk var.

Tablodaki node:tls satırı özellikle dikkat çekici: 191/224 ile en düşük geçme oranına sahip modül, yaklaşık %85. TLS/sertifika doğrulama gibi güvenlik-kritik bir katmanda bu oranın Node ile birebir eşleşmediği anlamına geliyor — yani mTLS veya özel sertifika zinciri kullanan bir servisi Bun'a taşımadan önce bu modülü özellikle test etmen gerekiyor. node:quic ve node:fs gibi modüller %97'nin üzerinde olduğu için günlük web servisi senaryolarında (dosya sistemi işlemleri, HTTP/3) risk daha düşük.

Bun.WebView: Playwright'ın yerini alır mı

v1.3.12'de tanıtılıp v1.4.0'da genişletilen Bun.WebView, resmi duyuruda "headless browser automation built into Bun, without Puppeteer or Playwright" ifadesiyle tanımlanıyor. Gerçek kullanıcı girdisiyle (tıklama, scroll) çalışıyor; macOS'ta sistem WebKit'i kullanıyor, üç platformda kurulu Chrome/Chromium/Edge'i CDP (Chrome DevTools Protocol) üzerinden sürebiliyor. İleri düzey senaryolar için bir .cdp() escape hatch'i de mevcut.

Peki bu, test altyapında Playwright'ın yerini alır mı? Kaynak burada net: aynı blog yazısı, Playwright'ın da ayrıca Bun üzerinde çalıştığını ayrı bir bölümde belirtiyor. Yani Bun.WebView, Playwright'ı "emekliye ayıran" bir zorunluluk değil — yerleşik, bağımlılıksız bir alternatif. Basit smoke-test veya scraping senaryolarında puppeteer/playwright bağımlılığını tamamen kaldırabilirsin; çoklu tarayıcı motoru (Firefox/WebKit) gerektiren kapsamlı E2E test matrislerinde Playwright hâlâ daha olgun seçenek. Tam API yüzeyi (metod imzaları, seçenek nesneleri) için resmi Bun dokümantasyonuna bakmanı öneririm.

Bun.Image / Bun.markdown / Bun.Terminal

1.4 döngüsünde art arda eklenen üç yerleşik API, bağımlılık listeni doğrudan küçültüyor:

API
Tanıtıldığı sürüm
Ne yapar
Not
Bun.Image
v1.3.14
Native addon gerektirmeyen, sharp benzeri görüntü işleme
1080p PNG→400×400 JPEG'de sharp'a kıyasla 1,38×, JPEG→WebP'de 1,19× hızlı
Bun.markdown
v1.3.8
GFM (GitHub Flavored Markdown) destekli render
HTML çıktısı otomatik sanitize edilmiyor
Bun.Terminal
v1.3.5
node-pty'siz native PTY (pseudo-terminal)
macOS, Linux, Windows'ta çalışıyor

Bun.markdown'daki sanitizasyon notu önemli: kullanıcıdan gelen Markdown'ı doğrudan Bun.markdown çıktısı olarak sayfaya basıyorsan, XSS'e karşı ayrı bir sanitizasyon katmanı (örneğin DOMPurify benzeri bir araç) eklemen gerekiyor — bu, aracın kendisinin sağlamadığı bir güvenlik katmanı.

Bu üç API'nin ortak paydası, CI pipeline'larındaki bir sınıf sorunu doğrudan ortadan kaldırması: sharp gibi native addon içeren paketler, farklı işletim sistemi/mimari kombinasyonlarında (özellikle Alpine tabanlı Docker imajlarında) derleme sorunlarıyla ünlüdür — glibc/musl uyumsuzluğu, prebuild eksikliği gibi klasik CI arızaları. Bun.Image bu paketi native addon derlemesi gerektirmeden sunduğu için, bu sınıf CI arızasının kaynağı ortadan kalkıyor. Aynı mantık node-pty (Bun.Terminal) ve node-cron (Bun.cron, aşağıda) için de geçerli: üçü de geleneksel olarak platform-spesifik derleme adımı gerektiren paketlerdi.

Bun.cron() ile zamanlanmış iş katmanı

Bun.cron(), zamanlanmış işleri işletim sistemi seviyesinde kaydediyor — yani arka planda Linux'ta crontab, macOS'ta launchd, Windows'ta Task Scheduler ile entegre çalışıyor. İmza tasarımı bilinçli bir tercih: Cloudflare Workers Cron Triggers'daki scheduled(controller) imzasıyla aynı şekilde çalışıyor, böylece Workers'tan gelen bir ekip için öğrenme eğrisi neredeyse yok. Kaynağa göre bu iki kullanım ayrı: aşağıdaki örnekteki gibi bir dosya verildiğinde iş işletim sistemine kaydediliyor; dosya yerine bir fonksiyon geçtiğinde ise iş, sistem cron'u devreye girmeden olay döngüsünde çalışıyor. Yine kaynağa göre işler asla çakışmıyor — bu hüküm her iki kullanım için de geçerli: bir önceki çalışma bitmeden aynı işin ikinci kopyası tetiklenmiyor.

ts
1// Bun.cron() — Cloudflare Workers Cron Triggers ile aynı scheduled(controller) imzası
2export default {
3 async scheduled(controller: { cron: string }) {
4 if (controller.cron === "0 3 * * *") {
5 await runNightlyBackup();
6 }
7 },
8};

Bu, node-cron gibi ayrı bir npm bağımlılığını ortadan kaldırıyor — bağımlılık grafiğinde bir paket daha az demek, tedarik zinciri yüzeyinde bir risk daha az demek.

İşletim sistemi seviyesinde kayıt yapması, geleneksel node-cron yaklaşımından önemli bir farkı işaret ediyor: node-cron işlemin kendi process'i içinde çalışan bir zamanlayıcıdır — process çökerse veya yeniden başlatılırsa, o an tetiklenmesi gereken iş de kaybolabilir. Bun.cron() ise dosya verilen kullanımda kaydı process'in dışına, işletim sisteminin kendi zamanlayıcısına bırakıyor; fonksiyon geçilen kullanımda iş, yukarıda belirtildiği gibi process içinde olay döngüsünde kalır.

Idle CPU, RAM ve başlangıç süresi kazanımları

Rust rewrite'ının en somut vaadi performans. Aşağıdaki tablo Bun'ın resmi duyurusunda geçen rakamları topluyor — hepsi Bun'ın kendi ölçümü, yani birinci taraf kanıt; kendi iş yükünde aynı sonucu göreceğinin garantisi değil, bu yüzden planlamayı bu tabloya göre değil kendi ölçümüne göre yap.

Metrik
Öncesi → Sonrası
Kaynak notu
Idle CPU ("hello world" mikro-örnek)
5× azaldı
Bun'ın kendi ölçümü
Claude Code prod CPU (p99)
%24 → %10
Bun'ın kendi ölçümü, gerçek üretim örneği
Claude Code prod CPU (p50)
%5,8 → %2,5 (2×)
Bun'ın kendi ölçümü
HTTP sunucu bellek kullanımı
%13-%48 arası azaldı (framework'e göre değişiyor)
Bun'ın kendi ölçümü
Başlangıç süresi (Windows)
2,5× hızlandı
Bun'ın kendi ölçümü
Başlangıç süresi (Linux)
2× hızlandı, bellek yarıdan az
Bun'ın kendi ölçümü
Binary boyutu
%17'ye kadar küçüldü
Bun'ın kendi ölçümü

Claude Code örneği önemli çünkü gerçek bir prodüksiyon iş yükü — ama yine de tek kaynaklı (Bun'ın kendisi). Kendi iş yükünde bu rakamları doğrulamak istiyorsan, hem eski hem yeni sürümle aynı senaryoyu kendi ortamında ölçmen gerekiyor; bu yazı sana hazır bir benchmark sonucu vermiyor, ölçüm için hangi komutu çalıştıracağını gösteriyor: aynı projede önce eski sürümle, sonra 1.4 ile time bun run start çalıştırıp iki başlangıç süresini kendi makinende kıyaslayabilirsin.

İki farklı rakamı birbirine karıştırmamak önemli: "5× idle CPU azalması" bir mikro-örnek ("hello world" seviyesinde minimal bir sunucu) için verilmiş, Claude Code'daki %24→%10 ve %5,8→%2,5 rakamları ise gerçek, karmaşık bir prodüksiyon uygulaması için. İkisi de aynı paragrafta geçse de farklı ölçüm koşullarını temsil ediyor — kendi servisin muhtemelen ikisinin arasında bir yerde davranacak, bu yüzden "5 kat hızlanacaksın" gibi bir beklentiyle production planlaması yapma; kendi trafiğinle staging'de ölçüm al.

Hangi işte Bun, hangi işte Node

Tooling tarafında 1.4 döngüsü boyunca 15 npm bağımlılığı Bun'a gömüldü: sharp, puppeteer, marked, node-cron, node-pty, concurrently, npm-run-all, serve-static, json5, fast-xml-parser, tar, string-width, slice-ansi, cli-truncate, wrap-ansi. Pratikte bu şu anlama geliyor: bun run --parallel komutu artık npm-run-all/concurrently'nin yerini tutuyor.

bash
1# concurrently veya npm-run-all yerine
2bun run --parallel build:web build:api build:worker

bun:ffi, TinyCC yerine artık JSC-native çalışıyor ve resmi ölçümlere göre 3× daha hızlı. Native stream implementasyonları WPT (Web Platform Tests) setinin %100'ünü geçiyor; indirme senaryolarında Bun'ın kendi ölçümüne göre Node'a kıyasla ~7,5× throughput — bu son rakam da Bun'ın birinci taraf ölçümü, kendi trafiğinle doğrulamadan mutlak gerçek gibi aktarma.

Bu tooling kazanımlarının pratik anlamı, package.json'daki devDependencies listesinin küçülmesi ve node_modules kurulum süresinin kısalması — özellikle CI'da her build'de sıfırdan bağımlılık kurulumu yapan pipeline'lar için bu doğrudan build süresine yansır. Ama bu kazanımı elde etmek, mevcut kodun bu paketlere doğrudan API çağrısı yapan yerlerini Bun'ın yerleşik eşdeğerine taşımayı gerektiriyor — otomatik bir "drop-in replacement" değil, import satırlarında bilinçli bir değişiklik.

Bu tabloyu Node.js uyumluluk sınırıyla (yukarıdaki bölüm) birlikte oku:

Senaryo
Öneri
Yeni/orta ölçekli proje, yerleşik tooling istiyorsun
Bun
CPU/RAM'in kritik olduğu prod ortamı, framework'ün Bun'ı destekliyor
Bun (ama kendi ölçümünle doğrula)
Native addon'a bağımlı, büyük/eski kod tabanı
Node
%100 Node API yüzeyine ihtiyaç duyan kritik altyapı
Node
Playwright ile çok tarayıcılı (Firefox/WebKit) E2E test matrisi
Node + Playwright, Bun.WebView tamamlayıcı olabilir

ALTIN İPUCU

Bu yazının en değerli bilgisi

Bu ipucu, yazının en önemli çıkarımını içeriyor.

Easter Egg

Gizli bir bilgi buldun!

Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?

Okuyucu Ödülü

Bu makaleyi sonuna kadar okuyanlar için Bun 1.4 geçişini güvenli şekilde planlamana yardımcı olacak kısa bir kontrol listesi hazırladık. Gizli Özellik bölümündeki anahtar kelimeyi doğru bulduysan, aşağıdaki listeyi bir geçiş kontrol listesi olarak doğrudan kullanabilirsin.

SSS

Bun 1.4'te neler değişti?

Bun 1.4, Zig kod tabanının Rust'a taşınmasıyla geldi; Node.js v26.3.0 test paketinden +1.517 yeni testi geçmeye başladı ve sürüm döngüsü boyunca 2.900'den fazla issue kapatıldı. Bun.Image, Bun.WebView, Bun.markdown, Bun.cron() ve Bun.Terminal gibi yeni yerleşik API'ler eklendi. İdle CPU 5 kat azaldı; bellek kullanımı duyurunun genel özetinde %35'e kadar, HTTP sunucusu çalıştıran uygulamalarda %13-%48 aralığında düştü — bu rakamlar Bun'ın kendi ölçümü.

Bun gerçekten Rust ile mi yazıldı?

Evet — kaynağın kendi ifadesiyle: "And it rewrites Bun from Zig to Rust." 11 gün süren taşımayla 535.496 satır Zig kodu Rust'a çevrildi. Ortaya çıkan Rust kod tabanının yaklaşık %4'ü hâlâ unsafe blokların içinde (~780.000 satırda ~27.000 satır) ve FFI sınırlarında C++ bağlantıları duruyor; yani "her satırı güvenli Rust" genellemesi kaynağın kendi cümlesini aşan bir iddia olur.

Bun 1.4 Node.js 26 ile uyumlu mu?

Bun 1.4, Node.js v26.3.0'ın test paketine göre doğrulanıyor; node:sqlite gibi bazı modüllerde %100, node:http/node:fs gibi modüllerde %95 üzeri geçme oranı var. Ama Node.js 26, 23 Eylül 2026 itibarıyla hâlâ "Current" statüsünde; LTS'e geçişi ayrı bir takvime bağlı. Bu yüzden "LTS uyumlu" demek erken — "Node 26'nın Current test paketiyle uyumlu" ifadesi daha doğru.

Bun'ın cron ve markdown API'leri production'a hazır mı?

Bu API'ler 1.4 döngüsüyle yeni tanıtıldı, yani üretimde uzun bir kullanım geçmişleri henüz yok. Temkinli yol şu: önce staging'de, pinlenmiş bir sürümle test et, sonra prod'a al.

Bun.WebView, Puppeteer ve Playwright'ın tamamen yerini alıyor mu?

Hayır. Bun.WebView, bağımlılıksız ve yerleşik bir headless browser automation seçeneği sunuyor ama aynı kaynak Playwright'ın Bun üzerinde ayrıca çalışmaya devam ettiğini belirtiyor. Basit smoke-test senaryolarında bağımlılığı azaltmak için kullanılabilir; çok tarayıcılı kapsamlı E2E matrisleri için Playwright hâlâ daha olgun.

Mevcut bir Node.js projesini Bun 1.4'e nasıl taşımalıyım?

Sırayla ilerle: önce node:tls gibi düşük geçme oranına sahip modülleri kod tabanında kullanıp kullanmadığını tara, sonra sharp/puppeteer/node-cron/node-pty/concurrently gibi artık Bun'a gömülü paketleri bağımlılık listenden çıkarmayı değerlendir. Ardından CI'da hem mevcut Node hedefini hem yeni Bun hedefini paralel çalıştır, node:tls ve native addon kullanan kod yollarına özellikle dikkat et. Staging'de bir hafta pinlenmiş stabil sürümle bekle, sorun çıkmazsa aşamalı olarak prod trafiğini kaydır. Bu adımların hiçbiri tek seferde "hepsini değiştir" gerektirmiyor — Bun ve Node aynı package.json üzerinde bir süre yan yana test edilebilir.

Sonuç

Bun 1.4, "Zig'den Rust'a" geçişiyle birlikte Node.js uyumluluğunu somut rakamlarla ilerletiyor ve Bun.Image/Bun.WebView/Bun.markdown/Bun.cron()/Bun.Terminal gibi yerleşik API'lerle npm bağımlılık grafiğini küçültüyor. Ama iş bitmiş değil: Bun ekibi kendi ifadesiyle unsafe kullanımını azaltıp kodu idiomatik Rust'a yaklaştırmayı sürdürüyor, CPU/RAM rakamları birinci taraf ölçümü, bazı API'ler yeni ve olgunluğu kanıtlanmamış. Pratik yol: staging'de pinlenmiş sürümle test et, CI'da Bun+Node matrisini paralel tut, üretime aşamalı geç.

Node.js runtime tarafında benzer bir geçiş deneyimini zaten yaşadıysan, Next.js 16.3'te runtime='edge' bitti: Node'a dönüş yazısı runtime kararlarının nasıl geri alınabileceğini gösteriyor. Rust motoruna geçişin ORM tarafındaki karşılığı için Prisma 6'dan 7'ye geçiş: Rust motoru gitti, ne değişti? yazısını oku — aynı "hızlı ama kırılma riski var" örüntüsünü farklı bir katmanda görürsün. Derleyici tarafında paralel bir hikaye için TypeScript 7 çıktı: 10x hızlı ama ESLint kırılıyor faydalı. Build tooling'ini de gözden geçiriyorsan Webpack'ten Vite'a geçiş rehberi adım adım migrasyon planı veriyor; Next.js ekosisteminde güncel kalmak istiyorsan Next.js 16.3 Instant Navigations ve Cache Components rehberi de bu sürümün diğer büyük değişikliklerini kapsıyor.

Kaynaklar

Etiketler

#Bun 1.4#Rust#Node.js#JavaScript Runtime#Bun.cron#Bun.WebView#Performance
Muhittin Çamdalı

Muhittin Çamdalı

Lead Mobile Engineer

12+ yıllık deneyime sahip Lead Mobile Engineer. Swift, SwiftUI, Kotlin ve Flutter ile iOS, Android ve cross-platform mimarilerde uzman. Performanslı ve kullanıcı dostu mobil uygulamalar geliştiriyorum.

iOS Geliştirme Haberleri

Haftalık Swift tips, SwiftUI tricks ve iOS best practices. Spam yok, sadece değerli içerik.

Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.

Paylaş

İlgili İçerik