deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak dev.to (home feed)

Node 24 TypeScript'ı Doğal Olarak Çalıştırıyor, Ama Yaptığı Tek Şey Tipleri Silmek

Node 24 .ts dosyalarını tip açıklamalarını yerinde boşluklarla değiştirerek doğrudan çalıştırıyor — ama tsconfig'i hiç okumuyor, tip kontrolü yapmıyor ve kod üretemiyor.

Node 24 TypeScript'ı Doğal Olarak Çalıştırıyor, Ama Yaptığı Tek Şey Tipleri Silmek

Node 24 bir TypeScript dosyasını doğrudan komut satırından çalıştırıyor. node server.ts komutunu çalıştırmak sorunsuz işliyor — loader hook yok, tsx yok, derlenmiş çıktı klasörü yok. dev.to'daki bir yazıya göre --experimental-strip-types bayrağı Node 23.6'dan beri gereksiz ve Node 24'te bu bayrağı geçirseniz de geçirmeseneniz de aynı çıktıyı alıyorsunuz. Yazar, tamamen kas hafızasıyla bir hafta boyunca yazmaya devam ettiğini itiraf ediyor.

Yazının açıkladığına göre mekanizma derleme değil, karakter düzeyinde silme. Node, swc'nin TypeScript stripperının WebAssembly'ye derlenmiş halinin üzerinde ince bir katman olan Amaro'yu içeriyor. Bir .ts, .mts veya .cts dosyası yüklendiğinde kaynağı ayrıştırıyor, yalnızca tip denetleyicisi için var olan her sözdizimi parçasını boşluklarla değiştiriyor ve sonucu V8'e iletiyor.

Silmek değil, boşluk bırakmak

Bunu kullanılabilir kılan detay, açıklamaların silinmek yerine yerinde aynı sayıda boşlukla üzerine yazılması. Yazarın demo dosyasında dokuz karakterlik bir açıklama dokuz boşluğa dönüşüyor; otuz dört karakterlik Readonly<Record<string, string>> açıklaması otuz dört karakterlik bir boşluğa dönüşüyor ve çalıştırılan satır, yazılan satırla tam olarak aynı uzunlukta kalıyor. Satır ve sütun konumları bu nedenle özgün dosyayla eşleşiyor, böylece bir runtime stack trace herhangi bir source map olmadan doğru karakteri gösteriyor.

Aynı demo diğer yüzünü de gösteriyor. Örnek kod bir fonksiyonu boş bir options nesnesiyle çağırıyor ve runtime'da TypeError ile başarısız oluyor — süreç daha önceden bu uyuşmazlığa itiraz etmemişti, çünkü hiçbir şey hiç kontrol edilmedi.

Çalışan bir sürece hangi modda olduğunu process.features.typescript üzerinden sorabilirsiniz: strip Node 24 varsayılanı, transform ise --experimental-transform-types geçirildiğinde görünüyor ve false değeri --no-strip-types altında ortaya çıkıyor. Yazar, son bayrağın .ts'yi yeniden bilinmeyen bir uzantıya çevirdiğini, bunun da bir dağıtımın tipleri anında soymak yerine önceden derlenmiş çıktıyı çalıştırdığını kanıtlamanın kullanışlı bir yolu olduğunu belirtiyor.

Soymanın yapamayacağı şeyler

Yazıya göre silme yaklaşımından doğrudan üç katı sınır ortaya çıkıyor. Node hiçbir zaman tsconfig. dosyasını okumuyor — paths değil, experimentalDecorators değil, target değil; dosyayı hiç aramıyor bile. Tip kontrolü yapmıyor; yani hiçbir şey doğrulanmıyor, hatta çözümlenmiyor bile. Ve kod üretemiyor, dolayısıyla derleyicinin JavaScript üretmesine bağlı olan her TypeScript özelliği yapı gereği kapsam dışında.

Yazar toplam beş belirgin reddediş sayıyor ve bunlardan birinin, kimse sizi önceden uyarmazsa bir öğleden sonranıza mal olabilecek bir şekilde başarısız olduğunu söylüyor. Örnek kodda görülen pratik bir kısıt şudur: import belirticileri gerçek diskteki .ts uzantısını taşımalıdır; yazar bu detayın yazının ilerleyen kısmında bir hata mesajı olarak yeniden ortaya çıktığını söylüyor.

Derlemesiz proje yapısı

Yazar bu düzenlemeyi dört modüllü bir serviste ve bloglarını yayınladığı iki betikte, hiçbir derleme aracı olmadan ve runtime'da hiçbir şey kurulmadan çalıştırdığını bildiriyor. package. ESM bildiriyor ve #src/* import takma adını kaynak dizine bağlıyor, böylece importlar uzun göreli yollardan kaçınıyor. Betikler şunlar: geliştirme için node --watch server.ts, testler için node --test ve tip kontrolü için tsc --noEmit — kontrol adımı hâlâ var, sadece çalıştırma yolunun dışına taşındı.

Örnek servisin kendisi çerçeve olmadan node:http üzerine kurulu ve yazarın demoların atlamaya meyilli olduğunu söylediği iki şeyi içeriyor: tek bir istemcinin süreci sınırsız büyütmesini engelleyen istek gövdesi boyutu için kesin bir üst sınır ve devam eden isteklerin bitmesine izin veren bir kapanma yolu.

Neden önemli

Küçük servisler ve yardımcı betikler için bu, araç zincirini daraltıyor: paketlenecek bir şey yok, runtime'da dönüştürülecek bir şey yok ve stack trace'ler hâlâ yazdığınız kaynakla hizalı. Ama yazı değerli, çünkü TypeScript çalıştırmak ile onu derlemek arasındaki çizgiyi çiziyor. Bunu benimseyen ekipler gerçek tip güvenliği için hâlâ tsc --noEmit'e — ya da editör entegrasyonuna — ihtiyaç duyuyor, tsconfig. ayarlarının runtime'da dikkate alınacağına güvenemiyor ve kod üretimi gerektiren sözdiziminden uzak durmak zorunda.

Dürüst çerçeveleme şu: Node 24, TypeScript çalıştırmayı sürtünmesiz hale getirirken kontrol etme ve kod üretme adımlarını ayrı ve bilinçli adımlar olarak bıraktı. --no-strip-types bayrağı, operatörlere belirli bir dağıtımın gerçekte hangi dünyada yaşadığını doğrulamanın somut bir yolunu veriyor.

  • #node-js
  • #typescript
  • #javascript
  • #runtimes
  • #developer-experience