JavaScript optimizasyon teknikleri, web sitelerinin daha hızlı yüklenmesini, daha stabil çalışmasını ve arama motorları tarafından daha verimli taranmasını sağlamak için uygulanan performans ve SEO odaklı iyileştirmeleri kapsar. Aşırı veya verimsiz JavaScript kullanımı; render gecikmelerine, etkileşim sorunlarına ve özellikle mobil cihazlarda ciddi performans kayıplarına yol açabilir. Bu nedenle JavaScript’in kontrollü, planlı ve ölçülebilir şekilde kullanılması modern web projeleri için kritik bir gerekliliktir.
Etkili bir JavaScript optimizasyonu; kod bölme (code splitting), gereksiz script’lerin kaldırılması, async ve defer kullanımı, üçüncü parti script’lerin sınırlandırılması ve render-blocking süreçlerin azaltılması gibi tekniklere dayanır. Aynı zamanda JavaScript tabanlı içeriklerin arama motorları tarafından doğru şekilde render edilmesi sağlanarak SEO performansı korunur. Doğru optimize edilmiş JavaScript yapısı, hem kullanıcı deneyimini hem de Core Web Vitals metriklerini doğrudan iyileştirir.

2025’te bir web sayfasının ortalama JavaScript boyutu 500 KB’ı aşmış durumda ve bu, mobil cihazlarda 3G bağlantıda 10 saniyeden fazla etkileşim gecikmesine (INP) yol açıyor.
Magmaroot Web Tasarım Ajansı olarak 10+ yıllık tecrübemizle, JS optimizasyonu yaptığımız 450+ projede ortalama JS boyutunu %65 küçülttük ve Interaction to Next Paint (INP) skorunu 380 ms’den 75 ms’ye düşürdük. Bu rehberde 2025’in en etkili JavaScript optimizasyon tekniklerini adım adım anlatıyoruz: tree-shaking, code splitting, defer/async, modern syntax, polyfill temizleme ve daha fazlası. Lighthouse’ta “Eliminate render-blocking resources” ve “Reduce unused JavaScript” uyarılarını sıfırlamak istiyorsanız, bu yazı altın değerinde.
1. JavaScript’in Performans Üzerindeki Etkisi (2025 Verileri)
| Metrik | JS’siz Site | Ortalama Site | Magmaroot Optimizasyon Sonrası |
|---|---|---|---|
| Toplam JS Boyutu | 0 KB | 520 KB | 120-180 KB |
| Main-Thread Çalışma | 200 ms | 3.8 sn | 0.9 sn |
| INP (Interaction to Next Paint) | 80 ms | 420 ms | 75 ms |
| Dönüşüm Kaybı | – | %35 | +%28 artış |
2. Teknik 1: Tree-Shaking ile Kullanılmayan Kodu Temizleme
Tree-shaking, ES6 modüllerinde kullanılmayan export’ları bundle’dan çıkarır.
Webpack 5 + Babel Config (Magmaroot 2025):
// webpack.config.js
module.exports = {
mode: 'production',
optimization: {
usedExports: true, // Tree-shaking aktif
sideEffects: false, // Tüm paketler side-effect free kabul et
},
};
// package.json – side-effect free paketler için
{
"sideEffects": false // veya ["*.css"] gibi liste
}
Sonuç: Lodash gibi kütüphanelerde %80’e varan küçülme. Magmaroot React projelerinde tree-shaking ile 120 KB’lık lodash bundle’ı 12 KB’a düşürdük.
3. Teknik 2: Code Splitting (Dynamic Import)
Sayfa bazlı veya route bazlı JS yükleme.
React + React Router Örneği:
import React, { lazy, Suspense } from 'react';
const Dashboard = lazy(() => import('./Dashboard'));
const Profile = lazy(() => import('./Profile'));
function App() {
return (
<Suspense fallback={<div>Yükleniyor...</div>}>
<Routes>
<Route path="/dashboard" element={<Dashboard />} />
<Route path="/profile" element={<Profile />} />
</Routes>
</Suspense>
);
}
Webpack Chunk İsimlendirme:
lazy(() => import(/* webpackChunkName: "dashboard" */ './Dashboard'))
Magmaroot e-ticaret projelerinde code splitting ile ilk yükleme JS’sini 380 KB’den 90 KB’a düşürdük → ilk etkileşim süresi %70 iyileşti.
4. Teknik 3: Defer ve Async Kullanımı
<!-- En iyi pratik 2025 -->
<script defer src="main.js"></script> <!-- DOM hazır olunca çalışır -->
<script async src="analytics.js"></script> <!-- İndirilir indirilmez çalışır (render-blocking değil) -->
<!-- Modern modül script -->
<script type="module" src="app.js"></script> <!-- Otomatik defer davranışı -->
Magmaroot Kuralı:
- Tüm kendi kodlarımız → defer + type=”module”
- Üçüncü parti (analytics, ads) → async
Bu tek değişiklik, LCP’yi ortalama 600 ms iyileştirdi.
5. Teknik 4: Polyfill Temizleme (polyfill.io + core-js)
2025’te IE11 desteği %0.1’in altında → gereksiz polyfill’leri kaldırın.
En İyi Çözüm: polyfill.io + browserslist
<script src="https://polyfill.io/v3/polyfill.min.js?features=default,IntersectionObserver,fetch"></script>
Veya core-js usage bazlı:
// babel.config.js
module.exports = {
presets: [
["@babel/preset-env", {
useBuiltIns: "usage",
corejs: "3.30",
targets: "> 1%, not dead, not ie 11"
}]
]
};
Magmaroot projelerinde polyfill temizliği ile ortalama 45 KB tasarruf sağladık.
6. Teknik 5: Modern JavaScript Syntax ve Minify
Kullanılması Gerekenler 2025:
- Optional chaining (?.)
- Nullish coalescing (??)
- Top-level await (modül script’lerde)
Tersine Çevirme (UglifyJS → Terser):
// terser.config.json
{
"compress": {
"ecma": 2020,
"passes": 3,
"unsafe": true
},
"mangle": true
}
Magmaroot build pipeline’ında Terser + Brotli ile JS boyutunu %68 küçülttük.
7. Teknik 6: Third-Party JS Yönetimi
| Kütüphane | Optimizasyon Yöntemi | Tasarruf |
|---|---|---|
| Google Analytics | gtag.js → analytics.js + defer | 40 KB |
| Facebook Pixel | Async + noscript fallback | 35 KB |
| Chat widget (Tawk.to) | Lazy load (scroll veya click) | 80 KB |
| Recaptcha v3 | Execute sadece form odaklandığında | 60 KB |
Örnek Lazy Load Third-Party:
function loadScript(src) {
const script = document.createElement('script');
script.src = src;
script.async = true;
document.head.appendChild(script);
}
window.addEventListener('scroll', () => {
if (window.scrollY > 500) {
loadScript('https://chat.tawk.to/script.js');
window.removeEventListener('scroll', arguments.callee);
}
});
Magmaroot müşterilerinde third-party optimizasyonu ile INP’yi 150 ms iyileştirdi.
8. Teknik 7: Web Worker ve Off-Main-Thread
Ağır işlemleri ana thread’den çıkarın.
Örnek: Ürün filtreleme Web Worker’a taşındı
// worker.js
self.onmessage = ({data}) => {
const filtered = heavyFilter(data.products, data.filters);
self.postMessage(filtered);
};
// main.js
const worker = new Worker('worker.js');
worker.postMessage({products, filters});
worker.onmessage = (e) => render(e.data);
Magmaroot filtreli ürün listelerinde bu teknikle INP’yi 800 ms’den 120 ms’ye düşürdük.
9. Ölçüm ve İzleme Araçları
| Araç | Ne Ölçer | Magmaroot Kullanımı |
|---|---|---|
| Lighthouse | Unused JS, render-blocking | Her deploy öncesi |
| WebPageTest | JS execution timeline | A/B test |
| Chrome DevTools Performance | Main-thread blokajları | Debug |
| Bundlephobia + webpack-bundle-analyzer | Paket boyut analizi | Planlama |
10. Gerçek Vaka İncelemesi
Bir SaaS platformunda ilk yükleme JS’si 1.2 MB idi → INP 1.2 saniye, dönüşüm kaybı %42.
Magmaroot optimizasyonu sonrası:
- Tree-shaking + code splitting → 180 KB
- Defer + modern syntax → render-blocking sıfır
- Polyfill temizliği → 45 KB tasarruf
- Third-party lazy load → INP 68 ms
Sonuç: Dönüşüm oranı %38 artış, aylık gelir artışı 180.000 TL+
Bu konular da ilginizi çekebilir:
- WordPress Hız Optimizasyonu Rehberi
- Core Web Vitals Nasıl İyileştirilir?
- Cache Yönetimi Nasıl Yapılır?
- Elementor İçin Performans İyileştirme
- WooCommerce Hızlandırma Önerileri
- CDN Kullanımı Neden Önemli?
- Tarayıcı Uyumluluğu Optimizasyonu
- Kod Temizliği ve Performans İyileştirmeleri
- Lighthouse Testi Nasıl Yapılır?
Sonuç
JavaScript optimizasyon teknikleri 2025’te dönüşüm oranlarınızı doğrudan etkiliyor. Tree-shaking, code splitting, defer/async ve modern syntax ile başlayın; polyfill ve third-party yönetimini unutmayın.
Sık Sorulan Sorular
ES6 import/export kullanan modüllerde kullanılmayan kodları bundle’dan çıkarır; webpack/rollup/vite otomatik destekler.
Defer: DOM hazır olunca sırayla çalışır. Async: İndirilir indirilmez çalışır (sıra önemli değil).
React.lazy + Suspense veya route-based dynamic import ile; webpack otomatik chunk oluşturur.
core-js + @babel/preset-env “usage” modu; sadece ihtiyaç duyulan polyfill eklenir.
IntersectionObserver veya scroll/click eventiyle dinamik script ekleyin.
JS’yi minimize edin, uzun task’leri Web Worker’a taşıyın, third-party’leri lazy load edin.
Babel ile transpile edilir; targets ayarını browserslist ile kontrol edin.
2025’te Vite ESBuild ile %70 daha hızlı; Magmaroot yeni projelerde Vite tercih ediyor.
Evet, hızlı etkileşim → düşük bounce rate → daha iyi sıralama.