Modern web uygulamalarında kullanıcı deneyimini belirleyen en kritik faktörlerden biri sayfa açılış hızıdır. Kullanıcıların büyük çoğunluğu, yüklenmesi 3 saniyeden uzun süren web sitelerini derhal terk etmektedir. Bu durum yalnızca kullanıcı tutundurma oranlarını düşürmekle kalmaz, aynı zamanda Google'ın arama sıralaması kriterlerinde üst sıralarda yer alan Core Web Vitals Nedir? Site Hızı Nasıl Optimize Edilir? metriklerini de doğrudan olumsuz etkiler. Yüksek performanslı ve ölçeklenebilir bir web mimarisi kurmanın temel yolu ise doğru uygulanmış bir Asset ve Bundle Optimizasyonu sürecinden geçer.
İstemci tarafında çalışan modern JavaScript çatıları (React, Vue, Svelte, Angular vb.) büyüdükçe, sunucudan tarayıcıya taşınan JavaScript ve CSS kodlarının boyutu devasa boyutlara ulaşabilir. Doğru yapılandırılmamış bir paketleyici (bundler), uygulamanızın ilk yükleme süresini dramatik şekilde uzatır. Bu kapsamlı rehberde; Vite ve Webpack gibi güncel derleme araçlarını kullanarak JavaScript paketlerinizi nasıl küçülteceğinizi, statik varlıkları (asset) nasıl verimli yöneteceğinizi ve manifest.json aracılığıyla bellek önbellekleme (caching) mekanizmalarını nasıl mükemmelleştireceğinizi kod örnekleriyle adım adım inceleyeceğiz.
Asset ve Bundle Optimizasyonu Nedir ve Neden Hayatidir?
Web geliştirmede "bundle" (paket), projenizdeki onlarca hatta yüzlerce JavaScript, CSS ve modül dosyasının bir araya getirilerek tarayıcının tek seferde veya modüler olarak çekebileceği optimize edilmiş yayın dosyalarına dönüştürülmesidir. "Asset" ise projenizde yer alan görseller, yazı tipleri (fonts), ikonlar, ses dosyaları ve manifest yapılandırmaları gibi statik kaynakların tümünü ifade eder.
Asset ve Bundle Optimizasyonu, bu varlıkların dosya boyutlarını minimuma indirmek, gereksiz kodları tespit edip kaldırmak (dead code elimination), HTTP istek sayısını azaltmak ve tarayıcı önbelleğinden (browser cache) maksimum düzeyde faydalanmak amacıyla yapılan teknik iyileştirmelerin tamamıdır.
Doğru uygulanan bir optimizasyon stratejisinin projeye kazandırdıkları:
- Daha Düşük FCP (First Contentful Paint) ve LCP (Largest Contentful Paint): Sayfadaki ilk anlamlı içeriğin ve en büyük görsel/blok elementinin ekrana gelme süresi ciddi oranda kısalır.
- Bant Genişliği Tasarrufu: Özellikle mobil cihaz kullanan ziyaretçilerin hücresel veri tüketimi azalır.
- Daha Yüksek Arama Motoru Sıralaması: Sayfa hızı doğrudan bir SEO kriteri olduğu için arama motorlarında organik görünürlük artar.
- Sunucu Maliyetlerinde Düşüş: CDN ve origin sunucu üzerindeki veri transfer yükü hafifler.
Vite ve Webpack ile Bundle Boyutunu Küçültme Stratejileri
Modern front-end ekosisteminde derleme süreçlerini yöneten iki büyük güç vardır: Esnekliği ve devasa eklenti ekosistemiyle bilinen Webpack ile esbuild ve Rollup mimarisi üzerine kurulu ışık hızındaki Vite. İki araç da temel olarak benzer hedeflere hizmet etse de bundler yapılandırmaları farklılık gösterir. Detaylı teknik karşılaştırma için Modern Web Geliştirmede Vite vs Webpack Karşılaştırması (2026) başlıklı içeriğimize göz atabilirsiniz.
1. Code Splitting (Kod Bölme) ve Dynamic Imports
Uygulamanızın tamamını tek bir devasa main.js dosyası olarak paketlemek yapılan en büyük mimari hatalardan biridir. Kullanıcı henüz profil sayfasına gitmemişken profil sayfasına ait JavaScript kodlarını indirmek zorundaymış gibi davranmamalıdır.
Code splitting, kod tabanınızı mantıksal parçalara (chunks) bölerek yalnızca o anda ihtiyaç duyulan kodun tarayıcıya indirilmesini sağlar.
Vite ile Dinamik İçe Aktarım Örneği:
React veya Vue projelerinde dinamik import() ifadesi kullandığınızda Vite (ark planda Rollup) otomatik olarak ayrı bir chunk oluşturur:
// Vite - Dynamic Import / Code Splitting
import React, { lazy, Suspense } from 'react';
// Analytics modülü sadece ihtiyaç duyulduğunda yüklenecek
const HeavyChartComponent = lazy(() => import('./components/HeavyChart'));
function Dashboard() {
return (
<div>
<h1>Yönetim Paneli</h1>
<Suspense fallback={<div>Grafik Yükleniyor...</div>}>
<HeavyChartComponent />
</Suspense>
</div>
);
}
Webpack Yapılandırmasında SplitChunksPlugin:
Webpack tarafında gelişmiş kod bölme kuralları tanımlamak için optimization.splitChunks yapılandırmasını kullanırız. Örneğin, node_modules altındaki 3. parti kütüphaneleri vendor.js olarak ayırmak önbellek verimliliğini artırır:
// webpack.config.js
module.exports = {
// ...
optimization: {
runtimeChunk: 'single',
splitChunks: {
chunks: 'all',
maxInitialRequests: Infinity,
minSize: 20000,
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name(module) {
const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)(?:[\\/]|$)/)[1];
return `npm.${packageName.replace('@', '')}`;
},
},
},
},
},
};
2. Tree Shaking (Ölü Kod Eleme)
Tree shaking, projenizde import edilen ancak hiçbir zaman kullanılmayan kod parçalarının nihai paket dosyasından otomatik olarak silinmesidir. Tree shaking'in doğru çalışabilmesi için projenizde ES Modules (ESM) yani import/export yapısı kullanılmalıdır. CommonJS (require/module.exports) yapıları statik analiz edilemediği için tree shaking mekanizmasını zorlaştırır.
package.json dosyanıza ekleyeceğiniz "sideEffects": false bildirimi, paketleyicilere yan etkisi olmayan modülleri güvenle ayıklayabileceklerini belirtir:
{
"name": "my-awesome-app",
"version": "1.0.0",
"sideEffects": [
"*.css",
"*.scss"
]
}
İpucu: Lodash gibi kütüphaneleri dahil ederken import _ from 'lodash' yerine import debounce from 'lodash/debounce' veya lodash-es paketini tercih etmek bundle boyutunu 70 KB'ın üzerinde küçültebilir.
Asset Yönetimi: Görsel, Font ve CSS Optimizasyonu
Yalnızca JavaScript kodlarını paketlemek yeterli değildir. Bir web sayfasının toplam ağırlığının ortalama %60'tan fazlasını görseller ve web fontları oluşturur.
Görsel Formatları ve Derleme Anında Sıkıştırma
Modern web projelerinde PNG ve JPEG yerine WebP ve AVIF formatları standart haline gelmiştir. Vite ve Webpack projelerinde görselleri derleme aşamasında otomatik olarak sıkıştırabilir ve uygun formatlara dönüştürebilirsiniz.
Vite ile Görsel Optimizasyonu:
vite-plugin-image-optimizer gibi güncel eklentiler sayesinde build sırasında görseller kayıpsız sıkıştırılabilir:
// vite.config.js
import { defineConfig } from 'vite';
import { ViteImageOptimizer } from 'vite-plugin-image-optimizer';
export default defineConfig({
plugins: [
ViteImageOptimizer({
png: { quality: 80 },
jpeg: { quality: 75 },
webp: { lossless: true },
avif: { quality: 65 },
}),
],
});
Tipografi ve Web Font Optimizasyonu
Fontların geç yüklenmesi ekranda metinlerin kaymasına (CLS - Cumulative Layout Shift) ve yanıp sönmesine (FOUT/FOIT) neden olur.
<link rel="preload" href="/fonts/inter-v12-latin-regular.woff2" as="font" type="font/woff2" crossorigin>
Manifest Yönetimi (manifest.json) ve Statik Dosya Sürümleme
Gelişmiş paketleme stratejilerinin en önemli bileşenlerinden biri de üretilen dosyaların sürümlenmesi ve takibidir. Üretilen tarayıcı paketlerinin adlarına benzersiz bir karma kod (hash) eklenir (örneğin: main.a8f9c2d1.js). Bu yönteme Cache Busting denir.
Dosya adı her derlemede değiştiğinde, HTML belgesinin veya sunucu uygulamasının hangi güncel JavaScript ve CSS dosyasını çağıracağını bilmesi gerekir. İşte bu noktada Asset Manifest devreye girer.
Ayrıca Progressive Web App (PWA) süreçlerini yürütmek için yapılandırılan Web App Manifest ile Asset Manifest karıştırılmamalıdır. Web App Manifest hakkında detaylı rehberimize Web App Manifest (manifest.json) Nedir? Yapılandırma ve PWA Entegrasyon Rehberi bağlantısından ulaşabilirsiniz.
Vite ile Manifest Yönetimi
Vite, üretim (production) derlemesi aldığında kaynak ve çıktı dosyaları arasındaki eşleşmeyi bir manifest.json dosyasında saklama yeteneğine sahiptir.
vite.config.js içinde build.manifest: true seçeneğini aktif etmek yeterlidir:
// vite.config.js
import { defineConfig } from 'vite';
export default defineConfig({
build: {
manifest: true, // .vite/manifest.json dosyasını üretir
rollupOptions: {
input: '/src/main.js',
},
},
});
Üretilen .vite/manifest.json dosyasının çıktısı şu şekilde görünecektir:
{
"src/main.js": {
"file": "assets/main-B9z8xK1L.js",
"name": "main",
"src": "src/main.js",
"isEntry": true,
"css": [
"assets/main-C2mN4pQ9.css"
],
"imports": [
"_vendor-D3jK5mN1.js"
]
}
}
Backend mimariniz (Laravel, Node.js/Express, Django veya .NET CORE), bu manifest dosyasını okuyarak HTML şablonuna doğru ve güncel script etiketi yolunu dinamik olarak basar. Böylece tarayıcılar değişmeyen dosyaları 1 yıl boyunca önbelleğinde (Cache-Control: max-age=31536000, immutable) saklarken, güncellenen modülleri anında indirir.
Webpack ile Manifest Yönetimi
Webpack projelerinde benzer bir manifest çıktısı almak için webpack-manifest-plugin kullanılır:
// webpack.config.js
const { WebpackManifestPlugin } = require('webpack-manifest-plugin');
module.exports = {
output: {
filename: '[name].[contenthash:8].js',
path: path.resolve(__dirname, 'dist'),
clean: true,
},
plugins: [
new WebpackManifestPlugin({
fileName: 'asset-manifest.json',
publicPath: '',
}),
],
};
Asset ve Bundle Optimizasyonunda Sık Yapılan Hatalar
Projelerde sıklıkla karşılaştığımız ve performansı düşüren hatalar şunlardır:
date-fns veya dayjs tercih edilmelidir.width ve height öznitelikleri belirtilmeyen görseller düzen kaymalarına (Layout Shift) yol açar.Sonuç ve Sonraki Adımlar
Başarılı bir Asset ve Bundle Optimizasyonu, yalnızca kod yazım aşamasında değil, mimari kurulumun en başından itibaren planlanması gereken sürekli bir süreçtir. Vite ve Webpack gibi güçlü paketleyicilerin sunduğu kod bölme, tree shaking ve manifest yönetimi özelliklerini doğru yapılandırarak kullanıcılarınıza milisaniyeler seviyesinde açılan web deneyimleri sunabilirsiniz.
Sonraki Adımlar:
rollup-plugin-visualizer veya webpack-bundle-analyzer) çalıştırın.manifest.json entegrasyonunu ekleyerek sunucu tarafında uzun süreli HTTP önbellekleme stratejisine geçin.
Yorumlar (0)
Henüz yorum yapılmamış. İlk yorumu siz yapın!
Yorum Yazın