Implementierung - SEO - 01.08.2025

This commit is contained in:
2025-08-01 14:26:05 +02:00
parent 7aa0543001
commit f176743885
35 changed files with 3427 additions and 98 deletions
+72
View File
@@ -0,0 +1,72 @@
import { onCLS, onINP, onLCP, onFCP, onTTFB } from 'web-vitals';
interface Metric {
name: string;
value: number;
rating: 'good' | 'needs-improvement' | 'poor';
delta: number;
id: string;
}
function sendToAnalytics(metric: Metric) {
const body = JSON.stringify({
name: metric.name,
value: metric.value,
rating: metric.rating,
delta: metric.delta,
id: metric.id
});
// Send to Google Analytics
if (window.gtag) {
window.gtag('event', metric.name, {
event_category: 'Web Vitals',
event_label: metric.id,
value: Math.round(metric.name === 'CLS' ? metric.value * 1000 : metric.value),
non_interaction: true,
metric_rating: metric.rating,
metric_delta: metric.delta
});
}
// Dispatch custom event for Performance Monitor
window.dispatchEvent(new CustomEvent('web-vitals', {
detail: {
name: metric.name,
value: metric.value,
rating: metric.rating,
timestamp: Date.now()
}
}));
// Also send to your analytics endpoint if needed
if (navigator.sendBeacon) {
navigator.sendBeacon('/api/analytics', body);
}
}
export function reportWebVitals() {
onCLS(sendToAnalytics);
onINP(sendToAnalytics);
onLCP(sendToAnalytics);
onFCP(sendToAnalytics);
onTTFB(sendToAnalytics);
}
// Helper function to get Web Vitals score
export function getWebVitalsScore(metric: Metric): string {
const thresholds = {
LCP: { good: 2500, poor: 4000 },
INP: { good: 200, poor: 500 },
CLS: { good: 0.1, poor: 0.25 },
FCP: { good: 1800, poor: 3000 },
TTFB: { good: 800, poor: 1800 }
};
const threshold = thresholds[metric.name as keyof typeof thresholds];
if (!threshold) return 'unknown';
if (metric.value <= threshold.good) return 'good';
if (metric.value <= threshold.poor) return 'needs-improvement';
return 'poor';
}