Tree Shaking
- Okunuşu
- tri şeyking
Kısaca
Tree shaking, hangi ES modül dışa aktarımlarının gerçekten import edildiğine bakarak hiç kullanılmayan kodu son paketten çıkaran bir derleme optimizasyonudur.
Tree shaking nedir?
Tree shaking, bundler'ların kullanılmayan kodu kullanıcılara gönderilen dosyaların dışında bırakmak için kullandığı bir tekniktir. Yüz fonksiyon dışa aktaran bir yardımcı kütüphaneden tek bir fonksiyon import ederseniz, tree shaking yalnızca o fonksiyonu ve bağımlı olduğu şeyleri tutar. Sonuç, daha küçük bir indirme ve tarayıcının ayrıştırıp çalıştırması gereken daha az JavaScript'tir.
ES modüllerinin statik yapısına dayanır: import ve export ifadeleri en üst düzeyde durur ve çalışma zamanında değişemez; bu yüzden bundler hangi dışa aktarımların kullanıldığını kodu çalıştırmadan çıkarabilir. Giriş noktasından erişilemeyen her şey atılır, ardından bir minifier fonksiyonların içinde kalan ölü kodu kaldırır. require() kullanan CommonJS modülleri dinamiktir ve sallanması (shake) çok daha zordur. İçe aktarıldığında global bir nesneyi değiştiren bir modül gibi yan etkisi olan kod güvenle kaldırılamaz; bu yüzden kütüphaneler, bundler'lara kullanılmayan dosyaların atlanabileceğini bildirmek için package.json içinde "sideEffects": false tanımlar.
İsim, kodunuzu bir ağaç olarak canlandırır: onu sallayın, hiçbir şeyin bağlı olmadığı ölü yapraklar düşer. Tree shaking, modern bundler'ların üretim derlemelerinde varsayılan olarak açıktır. Ondan en çok, bir kütüphane nesnesinin tamamı yerine import { debounce } from "./utils.js" gibi adlandırılmış fonksiyonları import ederek ve ES modülü olarak yayımlanmış kütüphaneleri tercih ederek yararlanırsınız.
Tree shaking çoğunlukla minification ve code splitting ile karıştırılır. Minification, boşlukları kaldırarak ve adları kısaltarak kalan kodu küçültür ama hangi modüllerin dahil edileceğine karar vermez. Code splitting hiçbir şeyi kaldırmaz; kullandığınız kodu isteğe bağlı yüklenen ayrı parçalara böler. Tree shaking ise kullanılmayan dışa aktarımların tamamını siler; üçü genellikle bir üretim derlemesinde birlikte çalışır.
Önemli noktalar
- Tree shaking, hiç import edilmeyen dışa aktarımları son paketten çıkarır.
- ES modüllerinin statik
importveexportsöz dizimine bağlıdır. - Yan etkiler kaldırmayı engelleyebilir;
package.json'daki"sideEffects": falsebundler'lara yardımcı olur. - En çok yararı görmek için yalnızca ihtiyacınız olan adlandırılmış fonksiyonları import edin.
- Tree shaking kullanılmayan kodu kaldırır, minification kalanı küçültür, code splitting ise parçalara böler.
Örnek
// utils.js exports three functions
export function formatDate(d) { return d.toISOString().slice(0, 10); }
export function formatPrice(n) { return "$" + n.toFixed(2); }
export function slugify(s) { return s.toLowerCase().replace(/\s+/g, "-"); }
// main.js imports only one of them
import { formatDate } from "./utils.js";
console.log(formatDate(new Date()));
// After a production build, formatPrice and slugify are gone:
// the bundle contains only formatDate and the code from main.js.Sık sorulan sorular
Tree shaking neden çalışmıyor?
Yaygın nedenler yalnızca CommonJS olarak yayımlanmış bir kütüphane, bir kütüphanenin tamamını tek bir nesne olarak import etmek, kodun paketlemeden önce CommonJS'e transpile edilmesi veya bundler'ın tutmak zorunda olduğu yan etkili modüllerdir. Bir bundle analyzer, çıktıda gerçekte neyin kaldığını gösterir.
Tree shaking CommonJS ile çalışır mı?
Yalnızca kısmen. require() her yerde ve hesaplanmış adlarla çağrılabildiği için bundler'lar yalnızca basit kalıpları analiz edebilir; bu yüzden ES modülleri çok daha güvenilir sonuç verir.
Tree shaking ile dead code elimination arasındaki fark nedir?
Dead code elimination, if (false) dalı gibi hiç çalışamayacak ya da sonucu hiç kullanılmayacak kodu kaldıran genel bir derleyici optimizasyonudur. Tree shaking aynı fikri modül düzeyinde uygular ve hiçbir şeyin import etmediği dışa aktarımların tamamını kaldırır.
İlgili sayfalar
- BundlerWeb Geliştirme, s. 4Bundler, JavaScript modüllerini ve bağımlılıklarını tarayıcıların hızlıca indirip çalıştırabileceği birkaç optimize dosyada birleştiren bir derleme aracıdır.
- MinificationWeb Geliştirme, s. 31Minification, davranışı değiştirmeden boşlukları, yorumları ve uzun adları silerek kod dosyalarını küçülten işlemdir; böylece web sayfaları daha hızlı iner.
- Code SplittingWeb Geliştirme, s. 6Code splitting, bir web uygulamasının JavaScript'ini istenince yüklenen küçük parçalara bölen tekniktir; böylece ilk sayfa yalnızca gereken kodu indirir.
- JavaScriptWeb Geliştirme, s. 25JavaScript, web tarayıcılarında sayfaları etkileşimli hale getiren ve Node.js gibi çalışma ortamlarıyla sunucularda da çalışan programlama dilidir.
- Core Web VitalsWeb Geliştirme, s. 8Core Web Vitals, bir sayfanın gerçek kullanıcı deneyimini ölçen üç metriktir: yükleme hızı (LCP), yanıt verme (INP) ve görsel kararlılık (CLS).
- ES ModülleriWeb Geliştirme, s. 16ES modülleri, JavaScript'in yerleşik modül sistemidir: her dosya kendi kapsamını korur ve kodu diğer dosyalarla import ve export aracılığıyla paylaşır.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin