TL;DR
Erweiterte Performance-Optimierung ist CDN, intelligentes Caching, Lazy Loading und Code Splitting. Diese Techniken können Ladezeit um 50-80% verbessern und Core Web Vitals verbessern. So implementiert man erweiterte Optimierung 2026.
Für wen ist das
- Entwickler, die Website-Performance optimieren
- Unternehmen, die Core Web Vitals verbessern möchten
- Website-Besitzer mit Performance-Problemen
Keyword (SEO)
performance optimization, cdn, caching, lazy loading, performance optimization
CDN (Content Delivery Network)
Was ist CDN?
CDN ist Netzwerk geografisch verteilter Server, die:
- Kopien statischer Ressourcen speichern
- Von nächstgelegenem Server bereitstellen
- Latenz reduzieren
- Last auf Hauptserver reduzieren
Haupt-CDN:
- Cloudflare (kostenloser Plan)
- Vercel Edge Network
- AWS CloudFront
- Fastly
Wann CDN verwenden?
Ideal für:
- Statische Dateien (CSS, JS, Bilder)
- Schriftarten
- Videos
- Globale Zielgruppe
Vorteile:
- 30-50% schnelleres Laden
- Bessere Core Web Vitals
- Niedrigere Serverkosten
Implementierung
Vercel (automatisch):
- Next.js verwendet automatisch Edge Network
- Alle statischen Dateien über CDN
- Zero Configuration
Cloudflare:
<!-- DNS-Setup -->
<!-- Cloudflare cached automatisch statische Dateien -->
Custom CDN:
// Cache-Control-Header setzen
res.setHeader('Cache-Control', 'public, max-age=31536000, immutable');
Caching-Strategien
1. Browser-Caching
Cache-Control-Header:
// Statische Dateien (Bilder, CSS, JS)
Cache-Control: public, max-age=31536000, immutable
// HTML (ändert sich häufig)
Cache-Control: public, max-age=3600, must-revalidate
// API-Antworten (dynamisch)
Cache-Control: private, max-age=300
Implementierung (Next.js):
// next.config.js
module.exports = {
async headers() {
return [
{
source: '/static/:path*',
headers: [
{
key: 'Cache-Control',
value: 'public, max-age=31536000, immutable',
},
],
},
];
},
};
2. Service Worker-Caching
Strategien:
Cache First:
// Für statische Ressourcen
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request).then((response) => {
return response || fetch(event.request);
})
);
});
Network First:
// Für dynamische Daten
self.addEventListener('fetch', (event) => {
event.respondWith(
fetch(event.request).catch(() => {
return caches.match(event.request);
})
);
});
Stale While Revalidate:
// Für häufig wechselnde Daten
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.open('v1').then((cache) => {
return cache.match(event.request).then((response) => {
const fetchPromise = fetch(event.request).then((networkResponse) => {
cache.put(event.request, networkResponse.clone());
return networkResponse;
});
return response || fetchPromise;
});
})
);
});
3. Server-Side-Caching
Redis:
// API-Antworten cachen
const cached = await redis.get(`api:${key}`);
if (cached) return JSON.parse(cached);
const data = await fetchData();
await redis.setex(`api:${key}`, 3600, JSON.stringify(data));
return data;
In-Memory-Cache:
// Node.js Memory-Cache
const cache = new Map();
function getCached(key) {
const cached = cache.get(key);
if (cached && cached.expires > Date.now()) {
return cached.data;
}
return null;
}
Lazy Loading
1. Bilder
Native Lazy Loading:
<img src="image.jpg" loading="lazy" alt="Beschreibung">
Intersection Observer:
const images = document.querySelectorAll('img[data-src]');
const imageObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
imageObserver.unobserve(img);
}
});
});
images.forEach(img => imageObserver.observe(img));
Next.js Image:
import Image from 'next/image';
<Image
src="/image.jpg"
alt="Beschreibung"
width={800}
height={600}
loading="lazy"
placeholder="blur"
/>
2. JavaScript
Dynamic Imports:
// Komponente lazy laden
const HeavyComponent = lazy(() => import('./HeavyComponent'));
<Suspense fallback={<Loading />}>
<HeavyComponent />
</Suspense>
Code Splitting:
// Webpack automatisches Code Splitting
import('./module').then(module => {
module.doSomething();
});
3. CSS
Critical CSS:
<!-- Inline Critical CSS -->
<style>
/* Above-the-fold Styles */
</style>
<!-- Rest lazy laden -->
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
Code Splitting
1. Route-basiertes Splitting
Next.js (automatisch):
// Jede Seite automatisch gesplittet
// pages/about.js → about.js Bundle
// pages/contact.js → contact.js Bundle
React Router:
const About = lazy(() => import('./pages/About'));
const Contact = lazy(() => import('./pages/Contact'));
2. Komponenten-basiertes Splitting
React:
const Chart = lazy(() => import('./components/Chart'));
function Dashboard() {
return (
<Suspense fallback={<div>Chart wird geladen...</div>}>
<Chart />
</Suspense>
);
}
3. Vendor-Splitting
Webpack:
// Vendor-Bibliotheken splitten
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
},
},
},
}
Performance-Monitoring
1. Core Web Vitals
Metriken:
- LCP (Largest Contentful Paint) < 2.5s
- FID (First Input Delay) < 100ms
- CLS (Cumulative Layout Shift) < 0.1
Tools:
- Google PageSpeed Insights
- Chrome DevTools Lighthouse
- Web Vitals Chrome Extension
2. Real User Monitoring (RUM)
Tools:
- Google Analytics (Core Web Vitals)
- Vercel Analytics
- New Relic Browser
- Datadog RUM
3. Synthetic Monitoring
Tools:
- Pingdom
- UptimeRobot
- StatusCake
Best Practices
1. Bundle-Größe minimieren
Wege:
- Tree Shaking
- Ungenutzten Code entfernen
- Minification
- Kompression (gzip, brotli)
2. Bilder optimieren
Formate:
- WebP (beste)
- AVIF (neueste)
- Fallback zu JPEG/PNG
Größen:
- Responsive Bilder (srcset)
- Angemessene Dimensionen
- Kompression
3. Kritische Ressourcen preloaden
<link rel="preload" href="/font.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/hero-image.jpg" as="image">
4. Nicht-kritisches JavaScript verzögern
<script src="analytics.js" defer></script>
<script src="chat-widget.js" defer></script>
FAQ
Was sind wichtigste Performance-Metriken?
Core Web Vitals: LCP, FID, CLS. Zusätzlich: TTI (Time to Interactive), FCP (First Contentful Paint), TBT (Total Blocking Time).
Ist CDN immer erforderlich?
Für globale Zielgruppe ja. Für lokale (ein Land) möglicherweise nicht erforderlich, hilft aber trotzdem.
Wie oft Cache aktualisieren?
Hängt vom Ressourcentyp ab: statische Dateien (1 Jahr), HTML (1 Stunde), API (5 Minuten). Angemessene Cache-Control-Header verwenden.