Webpack İpuçları #3: Terser Plugin ile Canlı Ortama Çıkarken Konsol Loglarını Temizlemek

Tuğsan Ünlü
3 min readAug 13, 2021

--

Webpack serisindeki bir önceki yazı: Webpack İpuçları #2: Speed Measure ile Build Sürelerini Ölçmek

Motivasyon

İster tarayıcı üzerinde ister Node.js üzerinde çalışırken olsun, JavaScript geliştiriciler olarak console objesinin bize sağladığıconsole.log() ve benzeri metotları sıklıkla kullanıyoruz. Ekseriyetle debug amaçlı olan bu kullanımlarımız, gündelik hayatta işimizi epey kolaylaştırıyor. Fakat bir dezavantajı var, unutmak. Ameliyat esnasında hastanın karnında unutulan makas örneğinde olduğu gibi proje içerisinde unuttuğumuz logları canlı ortama çıktıktan sonra fark etmek pek iyi hissettirmiyor.

İçeriğine dikkat etmeden hızlıca yazdığımız loglar bizi kimi zaman gülünç duruma düşürürken kimi zaman da projeye dair hassas veya iş bilgisi içeren verileri faş etmemize neden oluyor. Elbette bunun birincil ve daha iyi bir pratik olan çözümü, kod incelemeleri esnasında istenmeyen logların tespit edilip canlıya çıkacak dala kabul edilmemesi olacaktır. Fakat bu yöntem de yine günün sonunda insana bağımlı olduğundan gözden kaçma ihtimali hâlâ sürüyor.

Terser Webpack Plugin

Bilindiği üzere Webpack bir module bundler (paketleyici). Proje içerisindeki yapılandırması doğru yapıldığında kullanılan tüm modüller Webpack’in elinden geçmiş oluyor. Bu sayede eklentiler aracılığıyla kodumuz üzerinde türlü manipülasyonları (ES5 dönüşümleri vb.) ve elemeleri (kullanılmayan kodları temizlemek vb.) kolayca yapabiliyor.

Webpack’in Terser isimli eklentisi yukarıda bahsettiğim derdi çözmede bize yardımcı oluyor. Tek marifeti bu değil elbette. Genel hatlarıyla, bundle dosyaları oluşturulurken optimizasyon ve performans odaklı, kullanılmayan kodları temizlemek, sınıf ve metot isimlerini kısaltmak, yorumları temizlemek gibi seçenekler sunuyor.

Kullanım

Projede Webpack’in kurulu ve yapılandırılmış olduğunu varsayıyorum. Bu durumda terser-webpack-plugin isimli NPM paketini kurmamız yeterli olacaktır.

webpack terser eklentisinin geliştirme ortamı bağımlılığı olarak kurulması

Paketi kurduktan sonra Webpack yapılandırma dosyamızdaki optimization objesinde Terser eklentisini tanımlıyoruz. compress objesinde ise bundle dosyalarımız sıkıştırılırken yapabileceğimiz manipülasyonları belirtiyoruz.

drop_console

Kullanabileceğimiz ilk yöntem drop_console. Varsayılan değeri false. Değerini true olarak tanımladığımız takdirde proje içerisindeki tüm console metotları (console.warn(), console.error() vs. dâhil) canlı ortam için oluşturulan bundle dosyalarında yer almayacaktır.

drop_console ile tüm console metotlarını temizlemek

pure_funcs

Üstteki yöntemin dezavantajı, console.log() haricindeki diğer console metotlarına gerçekten canlı ortamda ihtiyacımız olabilir. Belli senaryolarda tarayıcı konsoluna uyarı veya hata mesajları yazdırıyor ve sonrasında bunlara başvuruyor olabiliriz. O durumda da pure_funcs dizisini kullanarak yalnızca göz ardı etmek istediğiniz metotların isimlerini belirtebiliriz. Aşağıdaki kullanımda console.warn() gibi diğer metotlar çalışmaya devam edecektir.

pure_funcs ile yalnızca belli console metotlarını temizlemek

Üstteki yapılandırmalarla kullanılan Terser eklentisi Webpack’in yalnızca production modunda çalışır. development moddaki bundle dosyalarına herhangi bir müdahalede bulunmaz.

Sonuç

Bunun gibi elle yapılan gündelik ve dikkat gerektiren işleri araçlara devretmek bir dilemmaya neden oluyor aslında. Evet, günün sonunda hataya olan toleransı sıfıra indirmiş oluyoruz ama kod inceleme gibi süreçler, araçlara güvenilerek terk edildiğinde canlı ortam istediğimiz gibi oluyor olmasına belki ama geliştirme ortamı zamanla içler acısı bir hâl alabiliyor. O nedenle bu gibi yöntemleri birincil çözüm olarak değil son adımdaki bir önlem olarak düşünmekte fayda var.

Kaynaklar

Webpack serisindeki bir sonraki yazı: Webpack İpuçları #4: Content Hash ile Bundle Dosyalarının Tarayıcı Önbelleğinde Kalmasını Önlemek

--

--

Tuğsan Ünlü
Tuğsan Ünlü

Written by Tuğsan Ünlü

Application Architect, Technical Product Owner @Akbank — tugsanunlu.com

No responses yet