İçeriğe geç
academia.sh

Ders 23 / 23

Derleme ve Çalıştırma Akışı

Tip denetimi ile yayın çıktısının ayrılması, hata durumunda yayın davranışı, dosya başına çeviriyi olanaklı kılan seçenekler, tip-yalnızca içe aktarma ve tip soyan çalışma zamanları.

İçindekiler

Kurs boyunca derleyici hem tip denetimi yaptı hem çıktı üretti. Bu iki işin ayrılması, projelerin derleme süresini ve dağıtım düzenini belirleyen bir karardır.

Ayrımın gerekçesi ilk derste kurulmuştu: tipler derleme anında silinir. Silme işlemi mekanik ve hızlıdır; tip denetimi ise programın tümünü çözümlemeyi gerektirir ve yavaştır. İki işi ayırmak, geliştirme döngüsünü kısaltır.

Hata Durumunda Yayın

İlk derste görülen davranışı bir proje bağlamında yeniden inceleyelim. src/ana.ts:

const deger: number = "21.4";
console.log(deger);

Yapılandırma outDir ile çıktı üretecek biçimde ayarlanmışsa, derleme şu tanıyı verir:

src/ana.ts(1,7): error TS2322: Type 'string' is not assignable to type 'number'.

ve buna rağmen dist/ana.js dosyasını yazar:

const deger = "21.4";
console.log(deger);
export {};

noEmitOnError seçeneği bu davranışı değiştirir; aynı derleme tanıyı verir ve dist dizini hiç oluşmaz.

Hangisinin isteneceği bağlama bağlıdır. Geliştirme sırasında, tip hatası olan bir kodu yine de çalıştırabilmek yararlıdır — hata bir modülde, denenen davranış başka bir modüldedir. Yayın hattında ise tersi geçerlidir: denetimden geçmeyen kod paketlenmemelidir. Bu nedenle iki ayrı yapılandırma kullanmak yaygındır.

Sondaki export {}; satırı ayrı bir ayrıntıdır: derleyici, dosyayı modül olarak işaretlemek için ekler. Modül Çözümleme dersindeki moduleDetection ayarı bu davranışı belirler.

İki Adıma Ayırma

Ayrım, iki komutla kurulur:

  • Tip denetimi: tsc --noEmit. Çıktı üretmez, yalnızca tanıları verir.
  • Çıktı üretimi: Dosya başına çalışan bir çevirici. Tipleri siler, sözdizimini hedefe uyarlar, tip denetimi yapmaz.

İkinci adımın hızlı olmasının nedeni, dosya başına çalışabilmesidir: bir dosyayı çevirmek için başka dosyalara bakmaya gerek yoktur. Ancak bu, TypeScript’in bazı yazımlarında olanaksızdır — çevirinin doğru olması için tip bilgisi gerekir.

isolatedModules seçeneği, bu yazımları yakalar. Aşağıdaki src/olcum.ts:

export interface Olcum {
  kimlik: string;
  deger: number;
}

export function ortalama(kayitlar: readonly Olcum[]): number {
  return kayitlar.length === 0
    ? 0
    : kayitlar.reduce((t, k) => t + k.deger, 0) / kayitlar.length;
}

ve src/ana.ts:

import { Olcum, ortalama } from "./olcum.js";

export { Olcum };

const kayitlar: Olcum[] = [{ kimlik: "s-01", deger: 21.4 }];
console.log(ortalama(kayitlar));

isolatedModules açıkken:

src/ana.ts(3,10): error TS1205: Re-exporting a type when 'isolatedModules' is enabled requires using 'export type'.

Sorun şudur: dosya başına çalışan bir çevirici, Olcum adının bir tip mi yoksa bir değer mi olduğunu bilemez. Tipse dışa aktarma satırı tümüyle silinmeli, değerse korunmalıdır. Karar için olcum.ts dosyasına bakmak gerekir ve bu, dosya başına çeviriyi bozar.

verbatimModuleSyntax seçeneği aynı kuralı içe aktarmalara da uygular:

src/ana.ts(1,10): error TS1484: 'Olcum' is a type and must be imported using a type-only import when 'verbatimModuleSyntax' is enabled.
src/ana.ts(3,10): error TS1205: Re-exporting a type when 'verbatimModuleSyntax' is enabled requires using 'export type'.

Düzeltme, tip-yalnızca yazımları kullanmaktır:

import type { Olcum } from "./olcum.js";
import { ortalama } from "./olcum.js";

export type { Olcum };

const kayitlar: Olcum[] = [{ kimlik: "s-01", deger: 21.4 }];
console.log(ortalama(kayitlar));

Bu dosya hatasız derlenir. Üretilen dist/ana.js:

import { ortalama } from "./olcum.js";
const kayitlar = [{ kimlik: "s-01", deger: 21.4 }];
console.log(ortalama(kayitlar));

node dist/ana.js çıktısı 21.4tür.

import type yazımı, satırın tümüyle silineceğini bildirimde söyler. Kazanç yalnızca hız değildir: içe aktarmanın yan etkisi olan bir modülden yalnızca tip almak, çıktıda o modülün yüklenmesine yol açmaz. Modüller, Araçlar ve Ekosistem kursundaki ağaç sarsma konusuyla aynı ilkedir — silinebilecek bağımlılığın silinebilir olduğunun bilinmesi.

Artımlı Derleme

incremental seçeneği, derleyicinin önceki çalışmasından kalan bilgiyi bir dosyaya yazmasını sağlar. Sonraki derlemede yalnızca değişen dosyalar ve onlara bağlı olanlar yeniden çözümlenir.

Seçenek açıkken proje kökünde tsconfig.tsbuildinfo adlı bir dosya oluşur. Bu dosya üretilen bir yapıdır; sürüm kontrolüne alınmaz ve temizlik adımlarında silinir. Yeri tsBuildInfoFile ile değiştirilebilir.

İzleme kipi (tsc --watch) aynı düşünceyi sürekli çalışan bir sürece taşır: dosya değişiklikleri izlenir ve yalnızca etkilenen bölüm yeniden denetlenir. Geliştirme sırasında bu kip, tek seferlik derlemeye yeğlenir.

Tip Soyan Çalışma Zamanları

Bazı çalışma zamanları TypeScript dosyalarını doğrudan çalıştırabilir: tip açıklamalarını söker ve kalan JavaScript’i yürütür. Bu, ilk dersteki tip silme ilkesinin çalışma zamanına taşınmış hâlidir.

Ayrımı görmek gerekir. Aşağıdaki dosya bir tip hatası içerir:

const deger: number = "21.4";
console.log(deger);

Böyle bir çalışma zamanında dosya çalışır ve 21.4 yazar. Hiçbir tip denetimi yapılmaz. Soyma işlemi mekaniktir; derleyicinin verdiği güvenceyle ilgisi yoktur.

İkinci sınır, kod üreten TypeScript yazımlarında görülür:

enum Birim {
  Celsius = "C",
}
console.log(Birim.Celsius);

Bu dosya çalışmaz:

SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]: TypeScript enum is not supported in strip-only mode

Temel Tipler dersinde numaralandırmanın tip silme ilkesinin istisnası olduğu gösterilmişti; sonucu burada somutlaşır. Yalnızca silme yapan bir çalışma zamanı, silinemeyen sözdizimi çalıştıramaz. Aynı kısıt parametre özelliklerini de kapsar.

Bu nedenle erasableSyntaxOnly seçeneği, tip soyan bir çalışma zamanı hedefleyen projelerde açık tutulur: silinemeyen yazımlar derleme anında bildirilir, çalışma zamanında sürprize dönüşmez.

Üç yolun karşılaştırması:

Yol Tip denetimi Hız Kısıt
Derleyiciyle derleme Var Düşük
Ayrı denetim + dosya başına çeviri Ayrı adımda Yüksek isolatedModules gerekir
Tip soyan çalışma zamanı Yok Yüksek Silinemeyen yazım çalışmaz

Üçünün ortak yanı, tip denetiminin kaybolmaması gerektiğidir. İkinci ve üçüncü yolda denetim bir yerde — yayın hattında, düzenleyicide, işleme öncesi bir kancada — yapılmalıdır. Yapılmadığında geriye kalan, tip açıklaması yazılmış JavaScript’tir.

Özet

  • Tip hatası kendiliğinden yayını durdurmaz; noEmitOnError bunu değiştirir ve geliştirme ile yayın için ayrı yapılandırmalar yaygındır.
  • Tip denetimi (tsc --noEmit) ile çıktı üretimi ayrı adımlara bölünebilir; ikinci adımın hızı dosya başına çalışabilmesinden gelir.
  • isolatedModules ve verbatimModuleSyntax, dosya başına çeviriyi bozan yazımları bildirir; düzeltme import type ve export type yazımlarıdır.
  • incremental seçeneği derleme bilgisini bir dosyaya yazar; bu dosya üretilmiş bir yapıdır ve sürüm kontrolüne alınmaz.
  • Tip soyan çalışma zamanları hiçbir tip denetimi yapmaz ve silinemeyen yazımları çalıştıramaz; erasableSyntaxOnly bu yazımları derleme anında yakalar.

Kurs Kapanışı

Kurs, tek bir soruyla başladı: bir program çalıştırılmadan hakkında ne söylenebilir? TypeScript’in yanıtı, kaynak kod üzerine kurulan ve çeviri bittiğinde geride kalmayan bir kanıt katmanıydı.

Bu katmanın sınırları baştan çizildi ve her konuda yeniden sınandı. Tipler derleme anında silinir; çalışma zamanı davranışını değiştirmez; dış dünyanın biçimini kanıtlamaz. Bu kısıtlar bir eksiklik değil, katmanın ne olduğunun tanımıdır — ve paths ayarının çalışmayan çıktısı ile tip soyan çalışma zamanının denetimsizliği, aynı kısıtın iki farklı görünümüdür.

Kurs boyunca tek bir model taşındı. Ölçüm kaydı, hiçbir güvence taşımayan bir JavaScript nesnesinden başladı; alanları tiplendi, birimi kapalı bir kümeye bağlandı, geçerli ve hatalı durumları ayırt edici bir birleşimle ayrıldı, kaynağı bir arayüzle soyutlandı, defteri bir tip parametresiyle genelleştirildi, türevleri eşlenmiş ve koşullu tiplerle hesaplandı, sınırı bir tip yüklemiyle korundu ve son olarak bir paket bildirimiyle dışa verildi. Her adımda kazanılan şey aynıydı: çalışma zamanında ortaya çıkacak bir sorunun derleme anına taşınması.

Kurstan çıkarılacak üç ilke:

Kanıt sınırda üretilir. Sistem sınırından gelen veri unknown olarak alınır, çalışma zamanında sınanır ve sonuç tip yüklemiyle kaydedilir. as yazımı bir kanıt değil bir borçtur.

Model tek yerde durur. Türev tipler elle yazılmaz, asıl tipten hesaplanır; sabit listeler hem değer hem tip olarak tek kaynaktan gelir. Modelin büyümesi, onu kullanan kodun gözden geçirilmesini derleyici aracılığıyla zorunlu kılar.

Katılık bir tercih değil, bir kapsam kararıdır. Her bayrak bir hata sınıfına karşılık gelir; kapalı bırakılan bayrak, o sınıfın çalışma zamanına bırakılması demektir.

Sırada, bu kodun çalışacağı yer var. Node.js Çalışma Zamanı kursu sunucu tarafındaki çalışma zamanını ele alacak: olay döngüsünün aşamaları, dosya sistemi ve ağ arayüzleri, akışlar ve geri basınç, süreç yönetimi ve üretim koşullarında günlükleme ile izleme. Bu kursta kurulan tip katmanı orada da geçerlidir — çalışma zamanının sunduğu arayüzler bildirim dosyalarıyla tiplenmiştir ve modül çözümleme kuralları o çalışma zamanının kurallarıdır.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat