Minification, kaynak koddaki tüm gereksiz karakterlerin (boşluklar, sekmeler, satır sonları ve yorumlar) kaldırılması işlemidir. Minification, program yürütme mantığını değiştirmeden JavaScript, CSS ve HTML dosyalarının boyutunu azaltır. MDN Web Docs'a göre, minification dosya boyutunu %50–70 oranında azaltabilir ve bu da doğrudan uygulama yükleme hızını ve First Contentful Paint (FCP)'i etkiler.
Önemli Noktalar
Minification, program yürütmesini etkilemeyen tüm karakterleri kaldıran otomatik bir kaynak kod dönüşümüdür. Boşluklar, sekmeler, yeni satır karakterleri, yorumlar ve gereksiz parantezler kaldırılır veya kısaltılır. Minification, üretime dağıtımdan önce JavaScript, CSS, HTML ve daha seyrek olarak JSON yapılandırmalarına uygulanır.
Minificationın ana hedefi, ağ üzerinden iletilen dosyaların boyutunu azaltmaktır. 300 KB'lık bir JavaScript dosyası, küçültme işleminden sonra 120–150 KB yer kaplayabilir ve yavaş bir 3G bağlantısında yükleme süresini 200–400 ms azaltır. Google PageSpeed Insights ve Lighthouse doğrudan kodu küçültmeyi önerir: bu, performans değerlendirmesi ve Core Web Vitals kriterlerinden biridir.
Minification, derleme hattının (build pipeline) ayrılmaz bir parçasıdır. TypeScript veya Babel ile derleme sonrasında kod, Tree Shaking (kullanılmayan işlevlerin kaldırılması) ve ardından bir küçültücüden geçer ve ancak daha sonra nihai pakette birleştirilir. Modern paketleyicilerde (Webpack, Rollup, esbuild), küçültme, derlemenin son aşamasında eklentiler tarafından gerçekleştirilir.
| Öğe | Örnek (önce) | Örnek (sonra) | Tasarruf |
|---|---|---|---|
| Boşluklar ve sekmeler | let x = 5; | let x=5; | ~%10–20 |
| Satır sonları | \n satırlar arasında | hepsi tek satırda | ~%2–5 |
| Yorumlar | // comment | kaldırıldı | ~%5–30 |
| Gereksiz parantezler | if ((x > 0)) | if(x>0) | ~%1–3 |
Boşlukların ve satır sonlarının kaldırılması en basit ve en belirgin tekniktir. Küçültücü ayrıştırıcı, AST'yi (Soyut Sözdizimi Ağacı) dolaşır ve dize değişmezlerinin parçası olmayan tüm boşluk karakterlerini kaldırır. Çoğu küçültücü ayrıca işleçleri tek bir satırda birleştirir ve bu da GZip veya Brotli ile sıkıştırma sırasında ek tasarruf sağlar.
Değişken adlarının değiştirilmesi (mangling) daha agresif bir tekniktir. Yerel değişkenler ve işlev parametreleri tek harfli tanımlayıcılara (a, b, c) yeniden adlandırılır. Bu, boyutu ek olarak %15–30 oranında azaltır. Terser ve esbuild, belirli adları koruma seçeneğiyle (örneğin, mangle.props.reserved aracılığıyla genel API) mangling'i destekler.
Ölü kod temizleme (DCE), hiçbir zaman yürütülmeyen kod dallarını kaldırır. Küçültücü, her zaman yanlış olan koşulları (if (false)) analiz eder ve ilgili blokları kaldırır. Daha gelişmiş analiz, küçültmeden önce Tree Shaking aşamasında gerçekleştirilir, ancak küçültücü düzeyindeki DCE, modül düzeyinde tespit edilmeyen yerel ölü kod durumlarını yakalar.
Mangling, yerel değişkenleri ve işlev parametrelerini kısa tanımlayıcılara (bir veya iki harf) yeniden adlandırır. Terser, kapsama göre mangling gerçekleştirir: bir işlev içindeki değişkenler, dış kapsamlarla çakışmayan benzersiz kısa adlar alır. mangle.reserved seçeneği, belirli adların (örneğin, genel kitaplık API'leri) korunmasına izin verir.
Mangling, genel değişkenleri, nesne özelliklerini (mangle.props etkinleştirilmediği sürece) veya new ile kullanılan sınıf adlarını etkilemez. Bir kitaplığın genel API'sini mangling'den korumak için düzenli ifadelerle mangle.props.reserved kullanın: reserved: ["_prop", /^private_/]. Bu ayar olmadan, harici kod nesne özelliklerine ada göre erişirse mangling kitaplığı bozabilir.
// Kaynak kod
function calculateTotal(price, tax) {
var result = price + (price * tax);
// Toplam tutarı döndür
return result;
}
var total = calculateTotal(100, 0.2);
console.log(total);// Terser küçültme sonrası
function calculateTotal(a, b){return a + a * b}
var c = calculateTotal(100, .2);
console.log(c);İkinci örnekte, Terser yorumları, boşlukları ve satır sonlarını kaldırdı, price'ı a'ya, tax'i b'ye, result'ı c'ye yeniden adlandırdı. Boyut 197 karakterden 79'a düştü — %60 tasarruf. Aynı zamanda, kodun işlevselliği tamamen korunur: calculateTotal(100, 0.2) 120 döndürür.
Terser, Webpack ekosisteminde ve çoğu modern paketleyicide standart JavaScript küçültücüdür. Terser, ES6+ sözdizimini (ok işlevleri, async/await, spread), genel API korumalı mangling, kaynak haritaları ve CPU sayısıyla paralel yürütmeyi destekler. Sürüm 5.16'dan itibaren Terser, TypeScript optimizasyonlarını içerir — yalnızca tür içe aktarmalarını ve arabirimleri kaldırma.
esbuild, Go ile yazılmış ve aynı adlı paketleyiciye gömülü bir küçültücüdür. esbuild, yerel kod ve paralel işleme sayesinde Terser'dan 10–100 kat daha hızlı küçültme gerçekleştirir. Ancak esbuild daha az optimizasyonu destekler: özellik korumalı mangling yapmaz, yalnızca tür içe aktarmalarını kaldırmaz ve ifadeleri daha az agresif bir şekilde optimize eder.
// webpack.config.js — TerserPlugin yapılandırması
const TerserPlugin = require("terser-webpack-plugin");
module.exports = {
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true,
dead_code: true,
},
mangle: {
reserved: ["React", "Component"],
},
output: {
comments: false,
},
},
parallel: true,
}),
],
},
};TerserPlugin yapılandırması üç ana blok içerir. compress, ifade optimizasyonunu yönetir: drop_console console.log'u kaldırır, drop_debugger debugger'ı kaldırır, dead_code ulaşılamaz dalları kaldırır. mangle, genel adları korumak için reserved ile değişken yeniden adlandırmayı kontrol eder. parallel, CPU sayısıyla çoklu iş parçacığını etkinleştirir.
// esbuild: JS ve CSS küçültme için CLI komutu
// esbuild app.js --bundle --minify --outfile=dist/app.min.js
// esbuild app.css --bundle --minify --outfile=dist/app.min.css
const esbuild = require("esbuild");
esbuild.build({
entryPoints: ["src/app.js", "src/styles.css"],
bundle: true,
minify: true,
sourcemap: true,
target: ["es2015"],
outdir: "dist",
}).catch(() => process.exit(1));esbuild API tek satırlık yapılandırmayı kabul eder. minify: true, hem JS hem de CSS'nin küçültülmesini etkinleştirir. sourcemap: true, hata ayıklama için kod haritaları oluşturur. target, minimum ES seviyesini tanımlar — esbuild, seçilen sürüm için modern kodu otomatik olarak dönüştürür. esbuild, derleme süresinin kritik olduğu projeler için özellikle etkilidir: CI/CD hatları, Hot Module Replacement ve hızlı prototipler.
React Native, Terser tabanlı küçültme içeren kendi paketleyicisi Metro Bundler'ı kullanır. Üretim modunda Metro, uygulamanın JavaScript paketine otomatik olarak küçültme uygular. Metro'da küçültme yapılandırması, transformer.minifierConfig bölümündeki metro.config.js aracılığıyla ayarlanır. Ayrıca, iOS'ta paket boyutunu azaltmak için inline-require devre dışı bırakılabilir.
Mobil uygulamalardaki WebView de küçültmeden yararlanır. WebView'de yüklenen HTML, CSS ve JS, uygulamaya gömülmeden veya sunucudan yüklenmeden önce küçültülmelidir. Yerel kaynaklar (Assets) için küçültme özellikle önemlidir — APK/IPA boyutu, uygulama mağazalarındaki yükleme dönüşümünü doğrudan etkiler.
Hermes, Facebook tarafından geliştirilen React Native için bir JavaScript motorudur. Hermes, Ahead-of-Time (AOT) bayt kodu derlemesi gerçekleştirir ve uygulama başlatma süresini %30–50 oranında azaltır. Hermes için JavaScript paket küçültme, Terser kullanılarak bayt kodu derlemesinden önce gerçekleştirilir. Hermes kendi HBC (Hermes Bytecode) biçimini destekler, ancak JS küçültme aşaması hala gereklidir.
// metro.config.js — küçültme yapılandırması
const defaultConfig = require("metro-config/src/defaults");
module.exports = require("metro-config").mergeConfig(
defaultConfig,
{
transformer: {
minifierConfig: {
compress: {
drop_console: true,
},
mangle: {
safari10: true,
},
},
},
}
);Metro, minifierConfig.drop_console ile React Native üretim paketindeki tüm console.log'ları kaldırır. mangle.safari10 parametresi, Safari 10'u (iOS 10) bozan tanımlayıcıların yeniden adlandırılmasını önler. Bu, iOS 10/11 çalıştıran eski iPad ve iPhone 5s cihazlarını destekleyen uygulamalar için özellikle önemlidir.
Minification ve sıkıştırma (gzip, brotli) farklı optimizasyon aşamalarıdır. Minification, kaynak kod düzeyinde çalışır ve sunucuya göndermeden önce karakter sayısını azaltır. Sıkıştırma, taşıma protokolü düzeyinde çalışır ve dosyayı istemciye iletirken sunucu (nginx, Apache, CDN) tarafından uygulanır. Minification, sıkıştırmadan önce boyutu azaltır ve bu da çift etki sağlar: gzip zaten azaltılmış verileri sıkıştırır.
Minification sonrası 300 KB'lık bir JavaScript dosyası — 120 KB, gzip sonrası — 35–40 KB. Küçültülmemiş dosyaya yalnızca gzip uygulanırsa boyut 55–70 KB olacaktır. Minification + gzip, tek başına gzip'ten %30–40 daha iyi sonuç verir. Brotli (seviye 6), küçültme sonrası gzip'ten ek %15–20 daha verimli sıkıştırır.
| Yöntem | Seviye | Dosya Boyutu | Azaltma |
|---|---|---|---|
| Orijinal dosya | — | 300 KB | %0 |
| Minification sonrası | Kod | 120 KB | %60 |
| gzip sonrası (minification yok) | Taşıma | 65 KB | %78 |
| Minification + gzip | Kod + Taşıma | 38 KB | %87 |
| Minification + Brotli | Kod + Taşıma | 30 KB | %90 |
Sıkça Sorulan Sorular
UglifyJS, ES6+ sözdizimini desteklemeyen eski bir minification aracıdır. Terser, modern JavaScript desteğine sahip UglifyJS'nin bir çatalıdır (fork). Tüm modern paketleyiciler (Webpack 5, Rollup, esbuild) Terser veya kendi küçültücülerini kullanırken, UglifyJS yalnızca eski projelerde kullanılır.
Source maps, üretim paketine dahil edilmeyen ayrı .map dosyalarıdır. Sunucu, kaynak haritalarını yalnızca yetkili geliştiricilere (Authorization başlığı aracılığıyla) sağlamalıdır. Üretimde, kaynak haritaları kullanıcının tarayıcısı tarafından yüklenmez, bu nedenle paket boyutunu etkilemez.
Bozulma riski, nesne özellik adlarını dönüştüren agresif mangling ile mevcuttur. Kod, data-attributes aracılığıyla DOM öğelerine erişirse veya alan adlandırması için JSON dizeleri kullanırsa, mangling genel özellikleri yeniden adlandırabilir. Çözüm, mangle.reserved ile hariç tutmak veya belirli ad alanları için mangling'i devre dışı bırakmaktır.
CSS küçültme, JS küçültmeden daha az kazanç sağlar (%15–25), ancak Core Web Vitals uyumu için zorunludur. CSS küçültücüler boşlukları kaldırır, aynı seçicileri birleştirir, onaltılık renkleri kısaltır (#ff0000 → #f00) ve kullanılmayan @keyframes'leri kaldırır. CleanCSS ve esbuild, CSS küçültme için popüler araçlardır.
Source maps (.map dosyaları), küçültülmüş kodu orijinal kaynağa bağlar. Chrome DevTools ve Safari Web Inspector'da kaynak haritaları etkinleştirildiğinde orijinal dosyalar görüntülenir. Doğru çalışma için kaynak haritaları sunucuya yüklenmeli (üretimde bile) ve geliştirici araçları aracılığıyla etkinleştirilmelidir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun