Kısaca Bun

Hatice Ergün
Kodcular
Published in
4 min readMar 3, 2024

Bun; runtime, bundler, paket yöneticisi ve test çalıştırıcısı gibi temel özellikleri kendi içinde barındıran bir araç setidir. bun.sh

Jarred Sumner tarafından geliştirilmiştir ve Zig adında bir sistem programlama diliyle yazılmıştır. Node.js ve Deno; V8 motorunu kullanırken, Bun ise JavaScriptCore motorunu kullanır.

Bun ile amaç nedir?

İlk amaç en az maliyetle en yüksek performansa ulaşmaktır.

Bun, Node.js’ in yerini alabilen ve daha fazlasını sunan bir araç olarak geliştirilmiştir. Bun sadece bir runtime değildir, hiçbir araca gerek kalmadan testler çalıştırabilir, kodları ekstra paket gerekmeden bundle edebilir ve npm kullanmadan daha performanslı bir paket yönetimi sağlar.

Bun yapısı ve öne çıkan özellikleri

Bun; ortam değişkenleri, HTTP , WebSocket, dosya sistemi gibi birçok modülü kendi içinde barındırır ve bu ihtiyaçlar için Node.js gibi harici paketlere gereksinim duymaz. Bu sayede konfigürasyon ihtiyacı en düşük seviyede tutulmuştur. Dolayısıyla Node.js e göre daha az konfigürasyon maliyeti vardır.

Örneğin; Bun, .env dosyasından gelen ortam değişkenlerini yerleşik olarak yönetmemize imkan sağlar. Dotenv gibi paketlere ihtiyaç duymaz.

Paket yönetimi : Bun, node modules klasörü olmadan da paketleri çalıştırabiliyor ve npm e göre çok daha hızlı yükleyebiliyor. Global cache ile paketleri yönettiği için paket indirme işlemlerini çok daha hızlı yapabiliyor.

Bundle özelliği : Node.js üzerinde geliştirme yaparken projelerin build ihtiyaçlarında harici kütüphaneler kullanmak gerekiyor. Bun ise kendi içinde bulundurduğu bundle modülü sayesinde ek paketlere ihtiyaç duymadan çok daha performanslı bir şekilde bundle işlemlerini yapabiliyor.

Dahili dil desteği : Bun; js, jsx ve ts için dahili olarak destek sunar. Yani ek yapılandırmaya gerek kalmaz. Doğrudan bu dosyaları derleyip çalıştırabilir. json ve txt dosyalarını da doğrudan import etmeye olanak sağlar. Node.js de olduğu gibi file yönetimi için ek modül ihtiyacı yoktur.

Sunucuyu başlatma özelliği : Bun, Node.js den farklı olarak dosyaları çalıştırırken nodemon gibi modüller kullanmaya ihtiyaç duymaz. Doğrudan projeyi çalıştırabilir.

Modül sistemleri desteği : CommonJS ve ES module yapıları için de hiçbir ayarlama gerektirmeksizin çalışır. Aynı anda ikisini de aynı dosyada kullanmayı destekler.

Test : Projedeki Jest uyumlu testleri bun test komutuyla Jest’e kıyasla çok daha hızlı çalıştırabilir.

Node.js üzerinde geliştirilmiş bir proje Bun ile de çalıştırabilinir, çoğunlukla uyum sağlanmış durumda ve tek komutla Bun geçişi yapılabiliyor. Bun hala geliştirilmekte olduğu için desteği bulunmayan Node.js modülleri de mevcut. Buradan inceleyebilirsiniz.

Bun, en önemlisi performansıyla öne çıkıyor…

  • Node.js ve Deno ile yapılan performans karşılaştırmalarında;
    React ile geliştirilmiş bir projenin sunucu tarafında render edilmiş halleri kıyaslandığında: Node.js saniyede 14bin isteği karşılıyorken, Bun ise 66bin isteği karşılayabiliyor.
  • Websoket ile geliştirilmiş bir chat servis için test edildiğinde;
    Node.js ile saniyede 180bin e yakın mesaj iletilebiliyorken, Bun ile 1 milyon mesaj iletimine ulaşılabiliyor.
  • Veritabanı tarafında sqlite (Bun içeriğinde sqlite için özelleştirilmiş bir modül bulunduruyor) için test edildiğinde;
    Node.js için saniyede 20 sorgu işlenebiliyorken, Bun ile 81 sorgu işlenebiliyor.

Nasıl bu kadar hızlı?

Sistem çağrılarında iyileştirmeler yapılarak performans arttırımı sağlanmış durumda. Birkaçından bahsedersek,

— File oluşturma işlemlerinde create işlemi yerine clone işlemi yapılması, böylece yazma maliyeti yerine var olan dosyaya referans göstererek kullanım sağlanıyor.
— Yeni cpu lar ile multi tasking lerin arttırılması.
package-lock.json dosyasının string tutulması yerine binary olarak tutulması.

Bun komutlarından bazıları

Bun kendi içinde komut satırı arayüzü (CLI) aracına sahiptir ve herhangi bir konfigürasyon yapmadan doğrudan komutlarını kullanmaya olanak sağlar:

  • bun run : JavaScript veya TypeScript ͏ dosyası çalıştırır.
  • bun install : Projenin bağımlılıklarını yükler.
  • bun test : Bun’un kendi içindeki test birimiyle birim testleri çalıştırır.
  • bun fmt : Bun’un kendi içindeki kod format modülü ile kodu formatlar.
  • bun build : Kodu Bundle eder.
  • bun add package_name : Projeye paket yüklemeyi sağlar.

Küçük bir örnek

Öncelikle makinenize Bun’ı yüklemeniz gerekmektedir (Bun şu an windows üzerinde doğrudan çalışamıyor bu sebeple WSL gerekiyor eğer windows için çalıştırmak istiyorsanız buradaki yönergeyi takip edebilirsiniz).
Terminalde,
curl -fsSL https://bun.sh/install | bash komutuyla makinenize Bun’ı yükleyin. Ardından,
exec /bin/zsh komutunu çalıştırın.
Bun içerisindeki tüm komutları listelemek için,
bun --help komutunu çalıştırabilirsiniz.

Bun ile yeni bir proje oluşturalım,
Projenizi oluşturmak istediğiniz dizine gidin ve terminalinizde;
mkdir proje_ismi komutuyla proje klasörünü oluşturun.
cd proje_ismi komutuyla proje dizinine girin.

bun init komutunu çalıştırın. Terminalde package name ve entry point isimlerini soruyor olacak, isimleri değiştirmek istemiyorsanız bu adımları geçebilirsiniz. Ardından proje oluşturulur. Projeyi bir kod editöründe açtığınızda default olarak typescript kullanıldığını ve node modules klasörünün oluştuğunu göreceksiniz.

Projeyi çalıştırmak için,
bun run index.ts komutunu çalıştırabilirsiniz.

Bu adımda bir web server oluşturmak istediğimizi düşünelim. Projenin index.ts dosyasına aşağıdaki komutu kopyalayıp yapıştırın ve dosyanızı kaydedin.

Bun.serve({
port: 3000,
fetch(req) {
const url = new URL(req.url);
if (url.pathname === "/") return new Response("Home page!");
if (url.pathname === "/blog") return new Response("Blog!");
return new Response("404!");
},
});

Ardından terminalde,
bun run index.ts komutunu çalıştırdığınızda tarayıcınızın http://localhost:3000 sayfasında Home page! yazısını göreceksiniz.

Şimdi projemizin scriptlerini düzenleyelim. Projenizde package.json dosyasını açın ve script alanını dosyaya ekleyin. Dosyanız şu şekilde görünmeli;

{
"name": "bun-project",
"module": "index.ts",
"type": "module",
"scripts": {
"start": "bun run index.ts",
"dev": "bun --watch index.ts"
},
"devDependencies": {
"@types/bun": "latest"
},
"peerDependencies": {
"typescript": "^5.0.0"
}
}

burada start komutu sayesinde artık terminalde,
bun run start komutunu çalıştırmamız projeyi ayağa kaldırmak için yeterli olacak.
bun run dev komutu ile -- watch flag’i sayesinde yaptığımız her değişiklik projede anında uygulanıyor olacak.

Daha fazla örnek için Bun dökümanlarını inceleyebilirsiniz. Burada express ile kullanım örneği de mevcut.

Eğer Bun ile geliştirdiğiniz bir projeyi deploy etmek isterseniz Docker kullanmanız gerekiyor. Buradaki örneği inceleyebilirsiniz.

Şimdi mevcut bir Node.js projesini Bun’a geçirelim,
Bun kurulumu yapıldığını varsayarsak; projenin ana dizinine ulaşıp terminalde,

bun run projenin_main_dosya_ismi komutunu çalıştırın, bu kadar!

Bun, projenin package.json ve package-lock.json dosyalarını tarar ardından paketleri indirir. Sonrasında projeyi ayağa kaldırır. Projeyi Bun ile yönetmeye bu şekilde başlamış olursunuz.

Buraya kadar incelediğiniz için teşekkür ederim. Eksik veya yanlış ifade ettiğim kısımlar var ise lütfen bana bildirin.

İyi çalışmalar.

Kaynaklar:

https://www.sitepoint.com/bun-javascript-runtime-introduction/
https://bun.sh/docs/quickstart
https://www.youtube.com/watch?v=eTB0UCDnMQo&ab_channel=freeCodeCamp.org
https://blog.verilink.com.tr/bun-nedir/
https://medium.com/@myzorrrr/bun-nedir-8d15c09cc5ad

--

--