JavaScript’in Yeni Esintisi Bun Runtime Nedir?

Büşra Aktaş
14 min readSep 24, 2023

--

Geliştirme serüvenimiz boyunca hemen her gün yeni teknolojilerle tanışıyor ve bu teknolojilere dair araştırmalar yapıyoruz. Bu kez listenin başında hızla sesini bizlere duyuran ve merak uyandıran Bun Runtime’ı görüyoruz. Birçok geliştirici gibi, yeni teknolojileri yakından takip ederek araştırmayı ben de seviyorum. Çalışma verimliliğimizi artıracak ve bizi daha dinamik kılacak araçlar ve teknolojiler hepimizi heyecanlandırıyor, değil mi? Eğer hazırsanız, bu yazımda birlikte JavaScript Motorları ve Runtime’larına genel bir göz attıktan sonra Bun Runtime’ın derinliklerine ineceğiz!

JavaScript, bir betik (script) dilidir ve tarihsel olarak yorumlanan bir dil olarak bilinir. Ancak bu basit tanım, günümüzün modern JavaScript motorlarının karmaşıklığını tam anlamıyla yansıtmamaktadır. Modern JavaScript motorları, “JIT (Just-In-Time)” derleme tekniğini kullanırlar. Bu, kodun yorumlanmasının ve derlenmesinin bir kombinasyonu anlamına gelmektedir.

Bir JavaScript kodu çalıştırıldığında, bu kod ilk başta yorumlayıcı tarafından satır satır işlenir. Ancak sıkça çalıştırılan kod parçaları, örneğin bir döngü içerisinde sürekli çağırılan bir fonksiyon, JIT derleyici tarafından doğrudan makine diline çevrilir. Bu, söz konusu kod parçalarının daha hızlı çalışmasına olanak tanır.

Popüler JavaScript Motorları Nelerdir?

JavaScript motorları sadece tarayıcıda çalışmak için tasarlanmamıştır. Evet, başlangıçta JavaScript’in temel kullanımı web tarayıcıları içindi ve dolayısıyla motorlarınında ilk kullanım alanı web tarayıcılarıydı. Ancak zamanla JavaScript’in popülerliği ve teknolojik ihtiyaçlar arttıkça JavaScript motorları da çok daha geniş bir yelpazede kullanılmaya başlandı.

Akılda daha kalıcı olması için bazı örneklere göz atalım mı? :)

Node.js: V8 JavaScript motorunu temel alan sunucu taraflı bir JavaScript runtime. Web sunucularında, arka yüz uygulamalarında, CLI araçlarında ve daha birçok alanda kullanılır.

Electron: Web teknolojilerini (HTML, CSS ve JavaScript) kullanarak masaüstü uygulamaları oluşturmak için bir framework. Electron, Chromium (V8 JavaScript motorunu içeren bir web tarayıcısı) ve Node.js’i içerir. Bu sayede, aynı kod tabanı ile Windows, macOS ve Linux için masaüstü uygulamaları geliştirilebilir.

MongoDB: Popüler NoSQL veritabanı olan MongoDB, sorguları işlemek için JavaScript motoru (V8) kullanır.

Firefox Tarayıcısı: SpiderMonkey, Mozilla tarafından geliştirilen ilk JavaScript motorudur ve Firefox web tarayıcısında kullanılır.

Various Game Engines: Bazı oyun motorları, scripting ve oyun içi otomasyon için SpiderMonkey’yi entegre eder.

Safari Tarayıcısı: JavaScriptCore, Apple tarafından geliştirilen ve Safari web tarayıcısında kullanılan bir JavaScript motorudur.

React Native: React Native, mobil uygulamalar oluşturmak için kullanılan bir framework’tür. React native kodlarını çalıştırmak için JavaScriptCore motoru kullanılır. Opsiyonel olarak Facebook tarafından yeni tanıtılan ve özellikle mobil cihazlar için optimize edilmiş olan Hermes JavaScript motoru da tercih edilebilir.

Peki Çalışma Zamanı Ortamı(Runtime Environment) Nedir?

Çalışma zamanı ortamı bir yazılımın kod bloklarının hayat bulup harekete geçtiği sahnedir. Çalışma zamanı ortamı, bir programın veya uygulamanın kodunu çalıştırdığı ve bu kodun işletim sistemi ve donanım kaynaklarına eriştiği ortamdır. Bu ortam, programın belleği yönetmesine, ağ isteklerini yapmasına, dosya sistemine erişmesine ve daha birçok işleve yardımcı olur.

Kod çalıştırıldığında, çalışma zamanı ortamı bu kodu alır ve uygun kaynaklara (CPU, bellek vb.) yerleştirir. Kodun gerektirdiği işlemler (örneğin, bir dosya okuma veya bir ağ isteği yapma) talep edildiğinde, çalışma zamanı ortamı bu işlemleri gerçekleştirmek için gerekli adımları başlatır. Ayrıca, potansiyel hatalar ve istisnalar için sürekli olarak izleme yapar. Eğer bir hata algılanırsa, genellikle uygun bir hata mesajı ile geri bildirimde bulunur.

Birbirlerinden farklılıkları nelerdir?

Her çalışma zamanı ortamı, belirli bir dilin veya teknolojinin ihtiyaçlarına göre özelleştirilmiştir. Özellikleri, performansı, güvenliği ve diğer birçok faktör bu ihtiyaçlara göre şekillenir. Farklı programlama dilleri ve teknolojiler için farklı çalışma zamanı ortamları vardır. Örneğin, Java için Java Virtual Machine (JVM) bir çalışma zamanıdır. Python için ise CPython yorumlayıcısı bu rolü üstlenir. Başlıktanda bildiğimiz üzere biz bugün JavaScript için çalışma ortamlarının gelişimini inceleyeceğiz.

Node.js Runtime Nedir ve Nasıl Çalışır?

Node.js, JavaScript dilini sunucu tarafında çalıştırmak için kullanılan bir çalışma zamanı ortamıdır. Chrome’un V8 JavaScript motorunu temel alır ve bu sayede JavaScript’i neredeyse tarayıcı dışında her yerde çalıştırabilirsiniz. Node.js, özellikle I/O işlemleri için oldukça hızlı ve etkilidir, bu nedenle veritabanı sorguları, dosya işlemleri ve ağ istekleri gibi operasyonlar için mükemmel bir seçimdir.

Öncelikle resmi web sitesi üzerinden uygun sürümü indirip kurmanız gerekiyor. Sonrasında node ve npm komutlarına terminalden erişebilirsiniz.

// Örnek bir HTTP sunucusu oluşturuyoruz:

const http = require('http');

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Merhaba Dünya\n');
});

server.listen(3000, '127.0.0.1', () => {
console.log('Sunucu http://127.0.0.1:3000/ adresinde çalışıyor');
});

Bu kodu server.js adında bir dosyaya kaydedersek node server.js komutunu çalıştırdığımızda http://127.0.0.1:3000/ adresinde çalışan basit bir sunucu oluşturur.

Node.js ile neler yapabiliriz?

  1. Web Sunucuları: Express, Koa, Hapi gibi popüler kütüphaneleri kullanarak dinamik web siteleri ve API’ler oluşturabilirsiniz.
  2. Veritabanı İşlemleri: MongoDB, PostgreSQL, MySQL ve daha birçok veritabanı için kütüphaneler mevcuttur.
  3. Araçlar ve CLI Uygulamaları: Özel komut satırı araçları oluşturabilirsiniz.
  4. Gerçek Zamanlı Uygulamalar: Socket.io gibi kütüphanelerle gerçek zamanlı chat uygulamaları, oyunlar ve diğer interaktif uygulamalar oluşturabilirsiniz.
  5. Masaüstü Uygulamaları: Electron ile cross-platform masaüstü uygulamaları geliştirebilirsiniz.
  6. Backend Hizmetleri: İş kuyrukları, e-posta servisleri, otomatik görevler ve daha fazlası için Node.js kullanabilirsiniz.

Deno Runtime Nedir?

Deno, Ryan Dahl tarafından 2018 yılında geliştirilen ve JavaScript/TypeScript için yeni bir çalışma zamanı ortamıdır. Ryan Dahl, aynı zamanda Node.js’in de geliştiricisidir. Deno, Dahl’ın Node.js’teki tasarım hatalarını ve eksikliklerini düzeltmek amacıyla geliştirildi.

Deno’nun özellikleri ve Node.js’ten farklılıkları neler?

  1. Güvenlik: Deno, varsayılan olarak güvenli bir ortamda çalışır. Bir Deno uygulaması, ağ, dosya sistemi ve çevre değişkenleri gibi sistem kaynaklarına erişmek için açıkça izin verilmelidir.
  2. TypeScript Desteği: Deno, TypeScript’i doğal olarak destekler. Bu, ek bir derleme veya yapılandırma adımı olmadan TypeScript kodunu doğrudan çalıştırabileceğiniz anlamına gelir.
  3. Her şey dahil: Deno, tek bir ikili dosya (binary) olarak gelir, bu da onu kolayca dağıtabilir ve kurulumu basit hale getirir.
  4. Dahili Paket Yöneticisi Yok: Node.js’in aksine, Deno’da dahili bir paket yöneticisi (npm gibi) yoktur. Modüller URL'ler üzerinden doğrudan içe aktarılır ve yerel olarak önbelleğe alınır.
  5. ES Modülleri: Deno, ES modüllerini kullanarak modüllerin içe aktarılmasını ve dışa aktarılmasını destekler. Bu, Node.js’in require() syntax'ından farklıdır.
  6. Yerleşik Araçlar: Deno, bağımlılık denetleyicisi, kod formatlayıcı gibi birçok yerleşik araçla birlikte gelir, böylece bu işlevler için üçüncü taraf araçlara gerek kalmaz.

Deno hakkında daha fazla bilgi edinmek için Ryan Dahl’ın şu videosuna göz atabilirsiniz.

https://www.youtube.com/watch?v=M3BM9TB-8yA

Deno’yu nasıl kullanabiliriz?

Deno’nun resmi web sitesinde kurulum talimatlarını bulabilirsiniz. Kurulumları tamamladıktan sonra deno komutunu terminalde çalıştırabilirsiniz.

type ServerConfig = {
port: number;
};

import { serve } from "https://deno.land/std/http/server.ts";

const config: ServerConfig = { port: 8000 };
const s = serve(config);
console.log("http://localhost:8000/ adresinde çalışıyor");

for await (const req of s) {
req.respond({ body: "Merhaba Deno!\n" });
}

Örnekteki kodu server.ts adında bir dosyaya kaydeder ve deno run --allow-net server.ts komutunu çalıştırırsanız http://localhost:8000/ adresinde çalışan basit bir sunucu oluşturur.

Deno, modern JavaScript ve TypeScript özelliklerini, daha güvenli ve özlü bir ortamda çalıştırmak için tasarlanmış bir platformdur.

Performans artışıyla gözleri anında üzerine çeviren Bun Runtime Nedir ve Nasıl Çalışır?

Bun, popüler Node.js ve Deno’nun üzerinde birkaç önemli avantaja sahip yeni bir JavaScript çalışma zamanıdır. Popüler isimlere meydan okuyarak performansta sınırları zorlama iddiasında bulunuyor. Bun aslında bir çalışma ortamı olarak tanıtılsa da, çalıştırma ortamı olmanın çok ötesinde yeni bir platform. JavaScript ve TypeScript projelerinizi geliştirmeniz, test etmeniz, çalıştırmanız ve paketlemeniz için tam bir araç kitine sahiptir. Bun, projenizi başlangıçtan bitişe kadar kapsayan entegre bir çözüm sunar.

Çalışma ortamları JavaScript motorları, olay döngüsü(event loop), bellek yığını(memory stack) ve çağrı yığını(call stack) gibi temel bileşenlerden oluşur. Node.js ve Deno çalışma ortamlarının kalbi olarak bilinen JavaScript motorlarından V8 Engine üzerinde çalışırlarken Bun, Apple tarafından geliştirilen JavaScriptCore motorunu kullanır. JavaScriptCore, biraz daha yavaş bir yürütme süresiyle daha hızlı başlama süreleri ve azaltılmış bellek kullanımına öncelik verir. V8 ise daha fazla çalışma zamanı optimizasyonu ile hızlı bir yürütme süresine öncelik verir.

Bu, Bun’u Node.js’den 4 kata kadar daha hızlı başlatır.

  1. Süper Hızlı Çalışma Zamanı
  • JavaScriptCore’u temel alarak, Bun yüksek performans sunar. Web uygulamalarınızı daha hızlı çalıştırmak için en uygun çalışma zamanıdır.
  • Özellikle edge computing’de, hız kritik bir faktördür ve Bun tam da bu ihtiyaca cevap verir.

Grafikte de göreceğimiz üzere Node.js saniyede 14 bin civarı HTTP isteğini yanıtlarken, Deno 33 bin isteği Bun ise 66 bin isteği yanıtlar.

2. Geniş Dosya Desteği

  • .js, .ts, .mjs, .jsx, .cjs ve .tsx dahil birçok dosya türüyle doğrudan çalışabilme yeteneği, geliştiricilere esneklik ve özgürlük sunar.
  • Ek araçlara ya da dönüştürücülere ihtiyaç duymadan bu dosya türlerini çalıştırabilirsiniz, bu da demek oluyor ki projenize ekstra olarak babel, tsc, ts-node, tsx’in kurulmasına gerek yok.
bun index.ts

Runtime’a entegre bir JavaScript dönüştürücüsü ile gelir. Dolayısıyla bu dosyalarınızdaki TypeScript kodlarını dönüştürmek için ekstra bir adıma gerek kalmadan çalıştırabilirsiniz. Bun dahili dönüştürücüsü saf JavaScript koduna dönüştürür.

Node.js’in çalıştırılmadan önce bir dönüştürme adımı gerektirmesi nedeniyle TypeScript dosyasını çalıştırırken hız farkı büyüktür.

3.ESM ve CommonJS Uyumluluğu

Bir modül sistemi, geliştiricilere kodu yeniden kullanılabilir segmentlere organize etmelerine izin verir. JavaScript’te iki ana modül sistemi CommonJS ve ES modülleri (ESM)dir. CommonJS, bir zamanlar Node.js’in bel kemiğiydi, ancak modern geliştirme eğilimleri ve ihtiyaçları ile ES modülleri (ESM) ortaya çıktı.

CommonJS, Node.js’den kaynaklanan sunucu tarafı işlemler için ideal olan eşzamanlı modül işlemek için require ve module.export kullanır.

// CommonJS stilinde (app.js)
const utils = require("utils");
console.log(utils.colorize('Merhaba, dünya!', 'red'));

ESM, ES6'da tanıtılan tarayıcılar ve modern derleme araçları için optimize edilmiş daha statik ve eşzamansız bir yaklaşım sunan import ve export ifadelerini kullanır.

Node.js’de ESM kullanmak istiyorsanız, şu yolları izleyebilirsiniz:

  1. package.json dosyanıza "type": "module" ekleyerek,
  2. Ya da dosya adını .mjs uzantısı ile kaydederek.
// ESM tarzında Node.js'de (app.mjs)
import tools from 'tools';
console.log(tools.highlight('Merhaba, dünya!', 'blue'));

Ancak unutulmamalı ki CommonJS ekosistemde yaygın olarak kalmaya devam ediyor.

Bun, özel bir konfigürasyon olmadan her ikisini de destekleyerek modül sistemini basitleştirir. Bun’un öne çıkan özelliği, Node.js’de doğal olarak mümkün olmayan aynı dosya içerisinde hem import hem de require()’i destekleme yeteneğidir.

// Bun aracıyla karışık modüller (app.js)
import toolkit from "toolkit";
const lib = require("library");
console.log(toolkit.paint('Toolkit ile selam!', 'yellow'));
console.log(lib.shade('Library ile merhaba!', 'green'));

Bu, geliştiricilere daha fazla esneklik ve geriye dönük uyumluluk sağlar. Böylece geçmişte yazılmış kodun üzerine modern yaklaşımlarla ekleme yapabilirler.

4. Hot Reloading

Hot Reload, uygulamadaki kod değişikliklerini anında yansıtmak için kullanılır. Node.js ekosisteminde hot reloading elde etmek için birkaç seçeneğiniz bulunmaktadır. En popüler araçlardan biri nodemon’dur. Bu araç tüm süreci baştan başlatır:

nodemon index.js

Alternatif olarak, Node.js v18'de deneysel olarak tanıtılan bir — watch bayrağı mevcuttur:

node --watch index.js

Her iki yöntem de, kod değişikliklerine yanıt olarak uygulamanın gerçek zamanlı olarak güncellenmesini sağlar ama her iki yöntemin de kendine özgü sınırlamaları bulunmaktadır. Örneğin, nodemon bazen HTTP veya WebSocket bağlantılarını kesebilir. Öte yandan, --watch bayrağı deneysel olduğu için bazen beklenenin dışında davranabilir. GitHub’da bildirilmiş bazı sorunları bulunmaktadır.

Bun, hot reloading konusunda daha ileri bir adım atmaktadır. Bun’u --hot bayrağıyla çalıştırdığınızda:

bun --hot index.ts

Bun, sadece değişen kodu günceller ve eski süreci sonlandırmadan kodunuzu yerinde yeniden yükler. Bu, HTTP ve WebSocket bağlantılarınızın kesintiye uğramamasını sağlar ve uygulamanın durumunu korur. Böylece geliştirme deneyiminizi daha sorunsuz hale getirir.

5. Web API(Application Programming Interface: Uygulama Programlama Arabirimleri)

Tarayıcı tabanlı uygulamalarda kilit bir role sahip olan Web API’leri, fetch ve WebSocket gibi araçlar sunarak web etkileşimlerini mümkün kılar. Bu araçlar tarayıcılar için bir standarda dönüşmüş olmasına rağmen, Node.js gibi sunucu tarafı ortamlarında yerleşik olarak desteklenmemiştir.

Node.js’in önceki sürümlerinde tarayıcılarda yaygın olarak bulunan Web standardı API’leri doğal olarak desteklenmiyordu. Geliştiriciler, bu işlevselliği kullanabilmek için node-fetch gibi üçüncü taraf paketlere başvurmalıydı. Ancak Node.js v18'den itibaren fetch API için deneysel destek bulunmaktadır ve bu özellik üçüncü taraf paketlere olan ihtiyacı ortadan kaldırabilir.

Bun, bu Web standardı API’leri için yerleşik destek sunarak bu sorunu çözümlediğini söylüyor. Geliştiriciler, ek paketlere ihtiyaç duymadan doğrudan stabil Fetch, Request, Response, WebSocket ve diğer tarayıcı benzeri API’leri kullanabilirler. Ayrıca, Bun ile Web API’lerinin yerleşik uygulanması, üçüncü taraf alternatiflere göre daha hızlı ve güvenilir olduklarından emin olmalarını sağlar.

Aşağıda hem Node.js (v18 ve üstü) hem de Bun ile uyumlu bir örnek bulunmaktadır.

Node.js’te deneysel olan bu özellik, Bun’da stabil olarak kullanılmaktadır.

async function fetchUserData() {
const response = await fetch("https://jsonplaceholder.typicode.com/users/1");
const user = await response.json();
console.log(user.name);
}
fetchUserData(); // Leanne Graham

6. Node.js Uyumluluğu

Yeni bir runtime ya da platforma geçiş yaparken geliştiricilerin en büyük kaygısı genellikle uyumluluktur. Bun, kendini doğrudan Node.js’in alternatifi olarak konumlandırarak bu sorunu çözmekte. Bu sayede, mevcut Node.js uygulamaları ve npm paketleri, herhangi bir değişiklik yapmaya gerek kalmadan Bun ile kusursuzca bütünleşebilir. Bun’un Node.js ile uyumluluğunu garanti eden anahtar özellikler arasında şunlar bulunmaktadır:

  • __dirname ve process gibi global değişkenleri tanıma kabiliyeti,
  • fs, path ve net gibi Node.js’in yerleşik modüllerine destek,
  • aşina olunan node_modules yapısıyla birlikte Node.js modül çözümleme algoritmasına sadakat.

Bun, sürekli evrim geçirmekte olan bir platformdur. Geliştirme süreçlerini iyileştirmeye yöneliktir ve özellikle kaynakların sınırlı olduğu sunucusuz (serverless) fonksiyonlar gibi ortamlarda idealdir. Bun’un arkasındaki takım, geniş kapsamlı Node.js uyumluluğu ve mevcut framework’lerle daha iyi bütünleşme için sürekli çalışmaktadır.

Fakat Bun sadece Node.js ile uyumlu olmakla kalmayıp, geliştiricilerin en çok ihtiyaç duyduğu yüksek optimize standart kütüphane API’lerini de beraberinde getirir. Bun, geliştirme süreçlerini hızlandırarak ve deneyimleri zenginleştirerek, geliştiricilere sektör standartlarına uygun daha etkili çözümler sunar. Bu da, geliştiricilerin iş akışlarını optimize etmelerini sağlar.

7. Bun API’leri

Bun.serve()

Web-standard API’leri kullanarak HTTP ya da WebSocket sunucusu kurabilirsiniz. Node.js’den saniyede 4 kat daha fazla istek alabilir ve Node.js’deki ws paketinden 5 kat daha fazla WebSocket mesajını işleyebilir. Bu arka uç yetenekleri, geliştiricilerin Node.js’te Express kullandığı şekilde çalışır ama Bun’un performans optimizasyonlarının eklenmiş avantajlarıyla birlikte gelir.

// Bun kullanımı (index.ts)
Bun.serve({
port: 3000,
fetch(request) {
return new Response("Merhaba Bun’dan!");
},
});

// Node.js kullanımı (index.mjs)
import http from "http";
const server = http.createServer((req, res) => {
res.writeHead(200, { "Content-Type": "text/plain" });
res.end("Merhaba Node.js’den!");
});
server.listen(3000);

Bun.file()

Bun.file(), dosyaları gerektiğinde yükleme ve içeriklerine çeşitli formatlarda ulaşma imkanı sunar. Bu metod, Node.js muadiline göre 10 kat daha hızlıdır.

// Bun kullanımı (index.ts)
const document = Bun.file("package.json");
await document.text();

// Node.js kullanımı (index.mjs)
const fs = require("fs/promises");
const content = await fs.readFile("package.json", "utf-8");

Bun.write()

Bu, diske veri yazma konusunda oldukça çok yönlü bir API’dir; string’lerden Blob’lara kadar birçok şeyi yazabilir. Node.js’den 3 kat daha hızlı yazabildiği iddia ediliyor.

// Bun kullanımı (index.ts)
await Bun.write("index.html", "<html/>");

// Node.js kullanımı (index.mjs)
const fs = require("fs/promises");
await fs.writeFile("index.html", "<html/>");

Bun, ayrıca sqlite ve password için de dahili destek sunar.

Bun:sqlite

import { Database } from "bun:sqlite";

// Initialize an in-memory database.
const db = new Database(":memory:");

// Create a users table.
db.query(`CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);`).run();

// Insert users.
const insertUser = db.query(`INSERT INTO users (name) VALUES ($name);`);
insertUser.run({ $name: "John" });
insertUser.run({ $name: "Jane" });
insertUser.run({ $name: "Mike" });

// Query and list all users.
const queryUsers = db.query(`SELECT * FROM users;`);
const userList = queryUsers.all();

console.log('User List:', userList);

8. Bun ile Paket Yönetimi

Bun’ın sadece bir çalışma zamanı değil, aynı zamanda güçlü bir paket yöneticisine sahip ileri düzey bir araç seti olduğundan bahsetmiştik. Eğer daha önce bağımlılık kurulumları sırasında uzun süre beklediyseniz, merak etmeyin Bun size muazzam bir hız avantajı sunacağını iddia ediyor. Bun’ı çalışma zamanı olarak kullanmasanız bile, içerdiği paket yöneticisi ile geliştirme sürecinizi ivmelendirebilir.

Bun’ın komutları ilk bakışta bilindik gibi görünse de, deneyim beklediğinizin aksine sıra dışıdır. Global bir modül önbelleği kullanarak npm’den kat kat daha hızlı kurulum hızları vaat eder. Ayrıca Bun, optimal performansı garantilemek için her işletim sistemine özgü en hızlı sistem çağrılarını kullanır.

Başlangıç düzeyinde bir Remix projesinin bağımlılıklarının önbellekten kurulumu için Bun ve npm arasında şaşırtıcı bir hız farkı bulunmaktadır:

Bun sadece 0.36s zaman alırken; pnpm 6.44s, npm 10.58s ve yarn ise 12.08s zaman almaktadır. Bun CLI npm, yarn ve pnpm için dramatik olarak daha hızlı bir değişim olanağı sunan Node.js uyumlu bir paket yöneticisini barındırır.

Dahası, bir bun run <command> komutu sadece 7ms alırken, npm run <command> 176ms süre alır. Bun, JavaScript paket yönetimi konusunda uzun yıllardır standart olan Node.js'in npm’ine kıyasla hız konusunda gerçekten bir güç abidesi gibi gözüküyor.

9. Bun Bundler ile Paketleme

Paketleme, birden çok JavaScript dosyasını almak ve bunları bir veya daha fazla optimize edilmiş paket halinde birleştirme işlemidir. Bu işlem, TypeScript’i JavaScript’e çevirmek veya kodun boyutunu küçültmek amacıyla kodu minimize etmek gibi dönüşümleri de içerebilir.

Node.js ekosisteminde, paketleme genellikle üçüncü taraf araçlar ile gerçekleştirilir. Node.js dünyasında en popüler paketleme araçları arasında code splitting, tree shaking ve hot module replacement gibi özellikler sunan Webpack, Rollup ve Parcel bulunmaktadır.

Bun aynı zamanda kendi başına bir paketleyici olarak tasarlanmıştır. JavaScript ve TypeScript kodunu, tarayıcıdaki (React veya Next.js uygulamaları) ve Node.js’deki çeşitli platformlar için paketlemek üzere tasarlanmıştır.

Bun ile paketleme yapmak için şu basit komutu kullanabilirsiniz:

bun build ./index.ts --outdir ./build

Bu komut, index.ts dosyasını paketler ve sonucu ./build dizininde çıkarır. Paketleme işlemi inanılmaz hızlıdır, Bun, esbuild’dan 1.75 kat daha hızlıdır ve Parcel ve Webpack gibi diğer paketleyicileri de büyük ölçüde geride bırakır.

Bun takes 0.17s, esbuild 0.3s, rspack 4.45s, Parcel 2 26.32s, Rollup 32s and Webpack 5 38.02s

Bun, paketleme sürecinde JavaScript makrolarını kullanarak önemli bir özellik sunar. Bu, paketleme sürecinde JavaScript fonksiyonlarının çalıştırılmasına olanak tanır ve sonuçları doğrudan final paketine yerleştirir. Bu mekanizma, paketleme konusunda taze bir perspektif sunar.

Aşağıda, Bun’ın JavaScript makrolarının, paketleme işlemi sırasında bir kullanıcı adı almak üzere kullanıldığı bir örnek bulunmaktadır. Makro, çalışma zamanında bir API çağrısı yapmak yerine, veriyi paketleme zamanında çeker ve sonucu doğrudan final çıktısına yerleştirir:

// users.ts
export async function getUsername() {
const response = await fetch("https://jsonplaceholder.typicode.com/users/1");
const user = await response.json();
return user.name;
}

// index.ts
import { getUsername } from "./users.ts" with { type: "macro" };
const username = await getUsername();

// build/index.js
var user = await "Leanne Graham";
console.log(user);
| Bun Komutu            | npm Komutu               | Amaç                            |
|-----------------------|--------------------------|---------------------------------|
| `bun build. | `webpack. | Paketleme ve çıktı |
| ./index.ts | ./index.js. | oluşturma |
| --outdir ./build` | --output-path ./build` | |

10. Bun ile Test

Yazılım geliştirme sürecinde test etmek, kodun beklendiği gibi davranmasını sağlamak ve potansiyel sorunları ürün canlıya geçmeden önce yakalamak için hayati bir öneme sahiptir. Bun, aynı zamanda bir test koşucusudur.

Node.js geliştiricileri genellikle test ihtiyaçları için Jest’e başvursalar da, Bun hız, uyumluluk ve modern geliştirme süreçlerine uygun bir dizi özellik sunan yerleşik bir test koşucusunu tanıtmaktadır.

Bun’ın test koşucusu bun:test, "expect" tarzı API'leri ile bilinen bir test çerçevesi olan Jest ile tamamen uyumlu olacak şekilde tasarlanmıştır. Bu uyumluluk, Jest ile tanıdık olan geliştiricilerin Bun'a keskin bir öğrenme eğrisi olmadan kolayca geçiş yapabilmelerini sağlar.

import { test, expect } from "bun:test";

test("5 - 3", () => {
expect(5 - 3).toBe(2);
});

Testleri çalıştırmak, bun test komutu ile basittir.

Jest veya Vitest’ten Geçiş

Bun’ın uyumluluk konusundaki taahhüdü, Jest’in global importlarını desteklemesi ile göze çarpar. Örneğin, @jest/globals veya vitest’ten içe aktarmak, içeriden bun:teste yeniden eşlenir. Bu, mevcut test setlerinin kod modifikasyonu olmadan Bun üzerinde çalışabilmesi anlamına gelir.

// index.test.ts
import { test } from "@jest/globals";

describe("test suite", () => {
test("addition", () => {
expect(5 + 4).toBe(9);
});
});

Performans Karşılaştırmaları

Bun’ın test koşucusu sadece uyumluluk ile övünmez; burada önemli olan bir diğer başlık yine hızdır. Zod için test setine karşı yapılan bir benchmarkta, Bun, Jest’ten 13 kat, Vitest’ten 8 kat daha hızlı olduğunu kanıtlamıştır. Bu hız avantajı, Bun’ın hızlı yerel kodda uygulanmış eşleştiricileri ile daha da vurgulanmıştır. Örneğin, Bun’da expect().toEqual(), Jest'ten tam 100 kat, Vitest'ten ise 10 kat daha hızlıdır.

Mevcut testleri taşımak veya yeni bir projeye başlamak isterseniz, Bun modern geliştirme ihtiyaçlarına uygun güçlü bir test ortamı sunar.

Node.js, JavaScript camiasında uzun süreli bir temel taşı olmuş, standartları oluşturmuş ve geliştiricilere yol göstermiştir. Fakat Bun, sınırları zorlayarak, sahnede anlamlı bir yarışmacı olarak kendini göstermektedir.

Bun’un yankı uyandıran gelişimi henüz başlangıç aşamasındadır. Şu an için MacOS ve Linux sistemler için optimize edilmiş durumda ve Windows desteği geliştirilme aşamasındayken, bazı özellikler daha gelecek vaat ediyor. Bun, sunduğu tüm imkanlarla, keşfetmeniz ve denemeniz için kesinlikle değerli bir araç setidir.

Nasıl buldunuz? İtiraf etmek gerekirse ben bir hız sever olarak etkilendim. Sizlerde yeni projelerinizde Bun araç setini deneyimleyerek deneyimlerinizi benimle Linkedin ve Twitter üzerinden paylaşabilirsiniz! Bun merakınızı gideren ve yolculuğunuzda destekleyici bir makale olması dileğiyle! ☘️

Eğer yazılarımdan keyif alıyorsanız bir kahve alarak beni destekleyebilirsiniz, teşekkürleeerr! https://www.buymeacoffee.com/devbusraakr

--

--