İnsanların “TypeScript derleme” dediği üç şey
Geliştiriciler TypeScript'in nasıl ikili dosyaya derleneceğini araştırdığında, genellikle aynı kelimeyi paylaşan üç çok farklı teknikle karşılaşır:
- Transpile etme.
tsc, SWC ve esbuild TypeScript'i JavaScript'e dönüştürür. Çıktının çalışması için hâlâ Node.js, Bun veya bir tarayıcı gerekir. Ortada bir ikili dosya yoktur. - Runtime gömme.
bun build --compile,deno compileve Node.js'in Tek Çalıştırılabilir Uygulamalar (SEA) özelliği, paketlenmiş JavaScript kodunuzu runtime'ın tam bir kopyasıyla birleştirir. Tek bir dosya elde edersiniz, ama motor bu dosyanın içinde taşınır ve kodunuz süreç her başladığında yine ayrıştırılır ve JIT ile derlenir. - Ahead-of-time yerel derleme. Perry'nin yaptığı budur. TypeScript SWC ile ayrıştırılır, türler çözümlenir, generic'ler monomorphize edilir ve LLVM makine kodu üretir. Linker, bir Rust, Go veya C++ araç zincirinin ürettiğiyle aynı sınıftan normal bir çalıştırılabilir dosya üretir. İkili dosyanın içinde hiçbir JavaScript motoru yoktur.
Başlatılacak bir motor ve başlangıçta ayrıştırılacak hiçbir şey olmadığı için bir Perry ikili dosyası yaklaşık bir milisaniyede başlar. Pipeline'ın kendisi TypeScript yerel derleyici sayfasında ve derleyici iç yapısı içinde daha ayrıntılı olarak ele alınmıştır.
İkili dosya ne kadar büyük?
Boyut, projenize dahil ettiğiniz şeye bağlıdır, çünkü yalnızca gerçekten kullandığınız kod derlenir ve linklenir:
- Bir hello world yaklaşık 330 KB boyutundadır.
- Tipik CLI araçları 2–5 MB civarındadır.
- Büyük framework'ler (Fastify, mysql2 ve benzerleri) bağlayan tam uygulamalar yaklaşık 48 MB civarındadır.
Karşılaştırma olarak: bir Node SEA çalıştırılabilir dosyası node ikili dosyasının kendisinin bir kopyasıdır, bu yüzden kodunuz eklenmeden önce platforma bağlı olarak kabaca 88–118 MB'tan başlar; Bun ile derlenmiş bir hello world ise tüm Bun runtime'ı gömülü olduğu için macOS arm64'te yaklaşık 60 MB, Linux x64'te ise yaklaşık 100 MB ölçülür.
Perry vs bun build --compile vs Node SEA
Üçü de size birine verebileceğiniz tek bir dosya sağlar. Bunun dışında birbirinden çok farklı araçlardır ve her biri farklı bir durumda doğru cevaptır:
| Perry | bun build --compile | Node SEA | |
|---|---|---|---|
| Ürettiği şey | AOT derlenmiş makine kodu (LLVM) | Paketlenmiş JS + gömülü Bun runtime'ı | Paketlenmiş betiğinizin enjekte edildiği node ikili dosyasının kopyası |
| Çalıştırma modeli | Yerel kod, JS motoru yok | Çalışma zamanında JIT (JavaScriptCore) | Çalışma zamanında JIT (V8) |
| Hello-world boyutu | ~330 KB | ~60 MB (macOS arm64) ile ~100+ MB (Linux/Windows) arası | ~88–118 MB (node ikili dosyasının boyutu) |
| Başlatma | ~1 ms | ~10 ms | ~30 ms |
| Çapraz derleme | Linux'tan Windows/macOS/iOS dahil olmak üzere 10 hedef | Evet — --target ile Linux, Windows, macOS | Hayır — bunun yerine platforma özgü bir node ikili dosyası kopyalanır |
| JS/npm uyumluluğu | Artıyor: axios, zod v4, express, fastify, hono yerel olarak derlenir; geri kalanı için isteğe bağlı V8 fallback'i | Tam — zaten Bun runtime'ının kendisi | Tam Node semantiği; ön-paketleme gerektirir, Node 24 LTS'te yalnızca CommonJS |
| Durum | 1.0 öncesi | Kararlı | Node 24 LTS'te “Active development” kararlılık düzeyi |
Dürüst çerçeveleme: uygulamanız npm ekosisteminin tamamına dayanıyorsa ve sıfır uyumluluk riski istiyorsanız, Bun ve Node SEA zaten üzerine geliştirme yaptığınız motor semantiğini birebir çalıştırır — güçlü yanları budur ve boyut maliyeti dağıtımınız için önemli olmayabilir. Perry farklı bir takas sunar. Gerçek bir ahead-of-time derleme, küçük ikili dosyalar ve milisaniye seviyesinde başlatma elde edersiniz; karşılığında JavaScript uyumluluğu V8'den miras alınmak yerine ölçülüp yayımlanan (test262: String 79%, Array 72%, v0.5.1146 itibarıyla) 1.0 öncesi bir derleyiciyi benimsersiniz.
Ayrıntılı karşılaştırmalar: Perry vs Bun ve Perry vs Deno. npm paketlerinin nasıl derlendiğini görmek için Real npm packages and a conformance sweep yazısına bakın.