);
}
// Preload des ressources critiques dans _document.js
import { Html, Head, Main, NextScript } from 'next/document';
export default function Document() {
return (
{/* Preload du font principal */}
{/* Preload de l'image hero */}
{/* DNS prefetch pour les domaines externes */}
);
}15:["$","pre",null,{"className":"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto","children":["$","code",null,{"children":"$40"}]}]
16:["$","h3",null,{"children":"Réduction du FID (First Input Delay)"}]
41:T614,// Code splitting et lazy loading pour réduire FID
import { lazy, Suspense } from 'react';
// Composants chargés uniquement quand nécessaires
const HeavyChart = lazy(() => import('./HeavyChart'));
const Modal = lazy(() => import('./Modal'));
export default function Dashboard() {
const [showChart, setShowChart] = useState(false);
// Utilisation de useCallback pour éviter les re-renders
const handleClick = useCallback(() => {
setShowChart(true);
}, []);
return (
{showChart && (
Chargement...
}>
)}
);
}
// Service Worker pour mise en cache intelligente
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open('v1').then((cache) => {
return cache.addAll([
'/',
'/styles.css',
'/app.js',
'/critical-resources.js'
]);
})
);
});
// Stratégie de cache : Network First pour l'API, Cache First pour les assets
self.addEventListener('fetch', (event) => {
if (event.request.url.includes('/api/')) {
// Network First pour les APIs
event.respondWith(
fetch(event.request).catch(() => {
return caches.match(event.request);
})
);
} else {
// Cache First pour les assets statiques
event.respondWith(
caches.match(event.request).then((response) => {
return response || fetch(event.request);
})
);
}
});17:["$","pre",null,{"className":"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto","children":["$","code",null,{"children":"$41"}]}]
18:["$","h3",null,{"children":"Prévention du CLS (Cumulative Layout Shift)"}]
42:T4ec,// CSS pour prévenir le layout shift
.image-container {
/* Réserver l'espace pour les images */
aspect-ratio: 16 / 9;
width: 100%;
overflow: hidden;
}
.skeleton-loader {
/* Placeholder avec dimensions exactes */
width: 100%;
height: 200px;
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: loading 1.5s infinite;
}
@keyframes loading {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
/* Éviter le shift des fonts */
@font-face {
font-family: 'Inter';
src: url('/fonts/inter-var.woff2') format('woff2');
font-display: swap; /* Améliore FCP mais peut causer CLS */
/* Utiliser font-display: optional; si CLS critique */
}
// React - Composant avec dimensions fixes
function AdBanner() {
const [adLoaded, setAdLoaded] = useState(false);
return (
{adLoaded ? (
setAdLoaded(true)} />
) : (
Publicité
)}
);
}19:["$","pre",null,{"className":"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto","children":["$","code",null,{"children":"$42"}]}]
1a:["$","h2",null,{"children":"SEO pour les applications JavaScript"}]
1b:["$","h3",null,{"children":"Server-Side Rendering (SSR) et Static Generation"}]
1c:["$","p",null,{"children":"Google peut maintenant indexer JavaScript, mais le SSR reste recommandé pour optimiser les performances et assurer la compatibilité avec tous les crawlers."}]
43:T4cc,// Next.js - Stratégies de rendu pour le SEO
export default function ProductPage({ product }) {
return (
{product.name}
{/* Contenu SSR pour SEO optimal */}
);
}
// Static Generation pour pages qui changent peu
export async function getStaticProps({ params }) {
const product = await fetchProduct(params.id);
return {
props: { product },
revalidate: 3600, // ISR : revalidation chaque heure
};
}
// Server-Side Rendering pour contenu dynamique
export async function getServerSideProps(context) {
const { user } = context.req;
const personalizedData = await fetchUserData(user.id);
return {
props: { personalizedData }
};
}
// Configuration next.config.js pour SEO
module.exports = {
// Génération de sitemap automatique
async rewrites() {
return [
{
source: '/sitemap.xml',
destination: '/api/sitemap'
}
];
},
// Headers SEO
async headers() {
return [
{
source: '/(.*)',
headers: [
{
key: 'X-Robots-Tag',
value: 'index, follow'
}
]
}
];
}
};1d:["$","pre",null,{"className":"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto","children":["$","code",null,{"children":"$43"}]}]
1e:["$","h3",null,{"children":"Optimisation pour Single Page Applications (SPA)"}]
44:T519,// Prerendering pour SPA avec React Helmet
import { Helmet } from 'react-helmet';
function ProductPage({ productId }) {
const [product, setProduct] = useState(null);
useEffect(() => {
fetchProduct(productId).then(setProduct);
}, [productId]);
if (!product) return ;
return (
<>
{product.name} | Mon Shop
{product.name}
{product.description}
>
);
}
// Configuration Webpack pour prerendering
const path = require('path');
const PrerenderSPAPlugin = require('prerender-spa-plugin');
module.exports = {
plugins: [
new PrerenderSPAPlugin({
staticDir: path.join(__dirname, 'dist'),
routes: [
'/',
'/about',
'/products/1',
'/products/2',
// Routes statiques importantes
],
rendererOptions: {
renderAfterTime: 5000, // Attendre le chargement async
headless: true
}
})
]
};1f:["$","pre",null,{"className":"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto","children":["$","code",null,{"children":"$44"}]}]
20:["$","h2",null,{"children":"Optimisation mobile et Mobile-First"}]
21:["$","h3",null,{"children":"Design responsive et performances mobiles"}]
45:T674,// CSS mobile-first approach
/* Base styles pour mobile */
.container {
padding: 1rem;
font-size: 16px; /* Évite le zoom mobile */
}
.hero-image {
width: 100%;
height: auto;
/* Optimisé mobile d'abord */
}
/* Progressive enhancement pour desktop */
@media (min-width: 768px) {
.container {
padding: 2rem;
max-width: 1200px;
margin: 0 auto;
}
}
/* Images responsive avec art direction */
.responsive-image {
width: 100%;
height: auto;
}
@media (max-width: 767px) {
.responsive-image {
object-fit: cover;
height: 200px; /* Hauteur fixe mobile */
}
}
// JavaScript - Détection des capacités mobiles
class MobileOptimizer {
constructor() {
this.isMobile = window.innerWidth < 768;
this.hasTouch = 'ontouchstart' in window;
this.connection = navigator.connection;
}
// Chargement conditionnel basé sur la connection
loadContent() {
if (this.connection && this.connection.effectiveType === '4g') {
// Charger contenu haute qualité
this.loadHighQualityImages();
} else {
// Charger version optimisée
this.loadOptimizedImages();
}
}
// Lazy loading intelligent
setupIntersectionObserver() {
const options = {
rootMargin: this.isMobile ? '50px' : '100px', // Marge mobile réduite
threshold: 0.1
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
this.loadImage(entry.target);
}
});
}, options);
document.querySelectorAll('[data-src]').forEach(img => {
observer.observe(img);
});
}
}22:["$","pre",null,{"className":"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto","children":["$","code",null,{"children":"$45"}]}]
23:["$","h3",null,{"children":"AMP (Accelerated Mobile Pages)"}]
46:T833,
Mon Article AMP
Mon Article SEO Optimisé
Contenu optimisé pour la vitesse et le SEO mobile...
24:["$","pre",null,{"className":"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto","children":["$","code",null,{"children":"$46"}]}]
25:["$","h2",null,{"children":"Structured Data et Rich Snippets"}]
26:["$","h3",null,{"children":"Implémentation JSON-LD"}]
47:T811,// React - Composant pour structured data
function StructuredData({ data }) {
return (
);
}
// Données structurées pour différents types de contenu
const articleStructuredData = {
"@context": "https://schema.org",
"@type": "Article",
"headline": "SEO Technique en 2024",
"description": "Guide complet du SEO technique...",
"image": "https://monsite.com/article-image.jpg",
"datePublished": "2024-09-12T10:00:00Z",
"dateModified": "2024-09-12T15:30:00Z",
"author": {
"@type": "Person",
"name": "Expert SEO",
"url": "https://monsite.com/about"
},
"publisher": {
"@type": "Organization",
"name": "Tuxyo",
"logo": {
"@type": "ImageObject",
"url": "https://tuxyo.com/logo.png"
}
}
};
const productStructuredData = {
"@context": "https://schema.org",
"@type": "Product",
"name": "Mon Produit",
"description": "Description détaillée du produit",
"image": ["https://example.com/image1.jpg"],
"brand": {
"@type": "Brand",
"name": "Ma Marque"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/product",
"priceCurrency": "EUR",
"price": "99.99",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "Organization",
"name": "Mon Shop"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "127"
}
};
// FAQ Schema pour rich snippets
const faqStructuredData = {
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "Qu'est-ce que le SEO technique ?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Le SEO technique englobe tous les aspects techniques..."
}
}, {
"@type": "Question",
"name": "Comment optimiser les Core Web Vitals ?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Pour optimiser les Core Web Vitals..."
}
}]
};27:["$","pre",null,{"className":"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto","children":["$","code",null,{"children":"$47"}]}]
28:["$","h3",null,{"children":"Breadcrumbs et navigation structurée"}]
48:T440,// Composant Breadcrumb avec structured data
function Breadcrumb({ items }) {
const structuredData = {
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": items.map((item, index) => ({
"@type": "ListItem",
"position": index + 1,
"name": item.name,
"item": item.url
}))
};
return (
<>
>
);
}
// Utilisation
const breadcrumbItems = [
{ name: "Accueil", url: "https://monsite.com/" },
{ name: "Blog", url: "https://monsite.com/blog" },
{ name: "SEO Technique 2024", url: "https://monsite.com/blog/seo-technique-2024" }
];29:["$","pre",null,{"className":"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto","children":["$","code",null,{"children":"$48"}]}]
2a:["$","h2",null,{"children":"Outils de monitoring et d'audit SEO technique"}]
2b:["$","h3",null,{"children":"Configuration Google Search Console"}]
49:T761,// API Google Search Console pour monitoring automatisé
const { google } = require('googleapis');
class SearchConsoleMonitor {
constructor(serviceAccountKey) {
this.auth = new google.auth.GoogleAuth({
keyFile: serviceAccountKey,
scopes: ['https://www.googleapis.com/auth/webmasters.readonly']
});
this.searchconsole = google.searchconsole({ version: 'v1', auth: this.auth });
}
// Récupération des erreurs d'exploration
async getCrawlErrors(siteUrl) {
try {
const response = await this.searchconsole.urlcrawlerrorssamples.list({
siteUrl: siteUrl,
category: 'serverError',
platform: 'web'
});
return response.data.urlCrawlErrorSample || [];
} catch (error) {
console.error('Erreur Search Console:', error);
return [];
}
}
// Analyse des performances de recherche
async getSearchAnalytics(siteUrl, startDate, endDate) {
const request = {
siteUrl: siteUrl,
requestBody: {
startDate: startDate,
endDate: endDate,
dimensions: ['query', 'page'],
rowLimit: 1000
}
};
const response = await this.searchconsole.searchanalytics.query(request);
return response.data.rows || [];
}
// Monitoring Core Web Vitals
async getCoreWebVitals(siteUrl) {
// Integration avec PageSpeed Insights API
const pagespeedUrl = `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=${encodeURIComponent(siteUrl)}&category=PERFORMANCE`;
const response = await fetch(pagespeedUrl);
const data = await response.json();
return {
lcp: data.lighthouseResult.audits['largest-contentful-paint'].displayValue,
fid: data.lighthouseResult.audits['max-potential-fid'].displayValue,
cls: data.lighthouseResult.audits['cumulative-layout-shift'].displayValue
};
}
}2c:["$","pre",null,{"className":"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto","children":["$","code",null,{"children":"$49"}]}]
2d:["$","h3",null,{"children":"Script d'audit SEO automatisé"}]
4a:Te5d,// Script Node.js d'audit SEO complet
const puppeteer = require('puppeteer');
const lighthouse = require('lighthouse');
class SEOAuditor {
constructor() {
this.issues = [];
}
async auditPage(url) {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle0' });
// Audit des méta tags
await this.checkMetaTags(page);
// Audit des images
await this.checkImages(page);
// Audit de la structure HTML
await this.checkHTMLStructure(page);
// Audit des liens
await this.checkLinks(page);
await browser.close();
return this.issues;
}
async checkMetaTags(page) {
const title = await page.$eval('title', el => el.textContent).catch(() => null);
const description = await page.$eval('meta[name="description"]', el => el.getAttribute('content')).catch(() => null);
if (!title || title.length === 0) {
this.issues.push({ type: 'error', message: 'Titre manquant' });
} else if (title.length > 60) {
this.issues.push({ type: 'warning', message: 'Titre trop long (>60 caractères)' });
}
if (!description) {
this.issues.push({ type: 'error', message: 'Meta description manquante' });
} else if (description.length > 160) {
this.issues.push({ type: 'warning', message: 'Meta description trop longue' });
}
}
async checkImages(page) {
const images = await page.$$eval('img', imgs =>
imgs.map(img => ({
src: img.src,
alt: img.alt,
width: img.width,
height: img.height
}))
);
images.forEach((img, index) => {
if (!img.alt || img.alt.trim() === '') {
this.issues.push({
type: 'error',
message: `Image sans alt text: ${img.src}`
});
}
if (img.width === 0 || img.height === 0) {
this.issues.push({
type: 'warning',
message: `Image sans dimensions: ${img.src}`
});
}
});
}
async checkHTMLStructure(page) {
const headings = await page.$$eval('h1, h2, h3, h4, h5, h6', headers =>
headers.map(h => ({ tag: h.tagName, text: h.textContent.trim() }))
);
const h1Count = headings.filter(h => h.tag === 'H1').length;
if (h1Count === 0) {
this.issues.push({ type: 'error', message: 'Aucun H1 trouvé' });
} else if (h1Count > 1) {
this.issues.push({ type: 'warning', message: 'Multiple H1 détectés' });
}
// Vérifier la hiérarchie des titres
for (let i = 1; i < headings.length; i++) {
const current = parseInt(headings[i].tag.charAt(1));
const previous = parseInt(headings[i-1].tag.charAt(1));
if (current > previous + 1) {
this.issues.push({
type: 'warning',
message: `Saut de niveau de titre détecté: ${headings[i-1].tag} vers ${headings[i].tag}`
});
}
}
}
// Génération de rapport
generateReport() {
const errors = this.issues.filter(issue => issue.type === 'error');
const warnings = this.issues.filter(issue => issue.type === 'warning');
return {
score: Math.max(0, 100 - (errors.length * 10) - (warnings.length * 2)),
errors: errors.length,
warnings: warnings.length,
issues: this.issues
};
}
}
// Utilisation
const auditor = new SEOAuditor();
auditor.auditPage('https://monsite.com').then(issues => {
const report = auditor.generateReport();
console.log('Score SEO:', report.score);
console.log('Problèmes détectés:', report.issues);
});2e:["$","pre",null,{"className":"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto","children":["$","code",null,{"children":"$4a"}]}]
2f:["$","h2",null,{"children":"SEO technique avancé : IA et recherche vocale"}]
30:["$","h3",null,{"children":"Optimisation pour la recherche vocale"}]
31:["$","div",null,{"className":"bg-gray-50 p-6 rounded-lg my-6","children":[["$","h4",null,{"className":"font-semibold mb-3","children":"Stratégies de contenu pour la recherche vocale"}],["$","ul",null,{"className":"text-sm space-y-2","children":[["$","li",null,{"children":["• ",["$","strong",null,{"children":"Questions naturelles"}]," : Optimiser pour \"Comment faire...\" ou \"Qu'est-ce que...\""]}],["$","li",null,{"children":["• ",["$","strong",null,{"children":"Réponses concises"}]," : Paragraphes de 40-60 mots pour les featured snippets"]}],["$","li",null,{"children":["• ",["$","strong",null,{"children":"Langage conversationnel"}]," : Utiliser un ton naturel et accessible"]}],["$","li",null,{"children":["• ",["$","strong",null,{"children":"FAQ structurées"}]," : Implémenter le schema FAQ pour les réponses directes"]}],["$","li",null,{"children":["• ",["$","strong",null,{"children":"Local SEO"}]," : Optimiser pour \"près de moi\" et requêtes locales"]}]]}]]}]
32:["$","h3",null,{"children":"Préparation à l'IA générativeSearch (SGE)"}]
4b:T531,// Optimisation pour l'IA générative de Google
const aiOptimizedContent = {
// Contenu factuel et sourcé
factChecking: {
sources: ["liens vers sources officielles"],
dataPoints: "statistiques avec dates récentes",
expertise: "démonstration d'autorité dans le domaine"
},
// Structure claire pour l'IA
contentStructure: {
introduction: "résumé clair du sujet en 1-2 phrases",
mainPoints: [
"point 1 avec contexte et exemple",
"point 2 avec données chiffrées",
"point 3 avec cas d'usage pratique"
],
conclusion: "résumé actionnable"
},
// Méta-informations pour l'IA
metadata: {
lastUpdated: "2024-09-12",
reviewedBy: "expert qualifié",
accuracy: "informations vérifiées",
completeness: "sujet traité exhaustivement"
}
};
// Schema markup pour l'IA
const aiEnhancedSchema = {
"@context": "https://schema.org",
"@type": "Article",
"speakable": {
"@type": "SpeakableSpecification",
"cssSelector": [".intro", ".key-points", ".conclusion"]
},
"about": {
"@type": "Thing",
"name": "SEO Technique",
"description": "Optimisation technique pour moteurs de recherche"
},
"mentions": [
{
"@type": "Thing",
"name": "Core Web Vitals",
"sameAs": "https://web.dev/vitals/"
}
]
};33:["$","pre",null,{"className":"bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto","children":["$","code",null,{"children":"$4b"}]}]
34:["$","h2",null,{"children":"Checklist SEO technique 2024"}]
35:["$","div",null,{"className":"bg-green-50 p-6 rounded-lg my-6","children":[["$","h3",null,{"className":"text-green-800 font-semibold mb-4","children":"✅ Audit technique complet"}],["$","div",null,{"className":"grid md:grid-cols-2 gap-6","children":[["$","div",null,{"children":[["$","h4",null,{"className":"font-semibold mb-3 text-green-700","children":"Performance"}],["$","ul",null,{"className":"text-sm space-y-1 text-green-600","children":[["$","li",null,{"children":"□ Core Web Vitals optimisés (LCP, FID, CLS)"}],["$","li",null,{"children":"□ Images optimisées (WebP, lazy loading)"}],["$","li",null,{"children":"□ CSS et JS minifiés"}],["$","li",null,{"children":"□ CDN configuré"}],["$","li",null,{"children":"□ Mise en cache optimisée"}],["$","li",null,{"children":"□ Service Worker implémenté"}]]}]]}],["$","div",null,{"children":[["$","h4",null,{"className":"font-semibold mb-3 text-green-700","children":"Structure"}],["$","ul",null,{"className":"text-sm space-y-1 text-green-600","children":[["$","li",null,{"children":"□ Sitemap XML à jour"}],["$","li",null,{"children":"□ Robots.txt configuré"}],["$","li",null,{"children":"□ Canonical tags implémentés"}],["$","li",null,{"children":"□ Breadcrumbs avec schema markup"}],["$","li",null,{"children":"□ URL structure propre"}],["$","li",null,{"children":"□ Redirections 301 appropriées"}]]}]]}],["$","div",null,{"children":[["$","h4",null,{"className":"font-semibold mb-3 text-green-700","children":"Mobile"}],["$","ul",null,{"className":"text-sm space-y-1 text-green-600","children":[["$","li",null,{"children":"□ Design responsive"}],["$","li",null,{"children":"□ Mobile-first indexing ready"}],["$","li",null,{"children":"□ Viewport meta tag configuré"}],["$","li",null,{"children":"□ Touch targets appropriés"}],["$","li",null,{"children":"□ AMP implémenté (si applicable)"}]]}]]}],["$","div",null,{"children":[["$","h4",null,{"className":"font-semibold mb-3 text-green-700","children":"Contenu"}],["$","ul",null,{"className":"text-sm space-y-1 text-green-600","children":[["$","li",null,{"children":"□ Title tags optimisés (<60 caractères)"}],["$","li",null,{"children":"□ Meta descriptions (<160 caractères)"}],["$","li",null,{"children":"□ Headers H1-H6 bien structurés"}],["$","li",null,{"children":"□ Images avec alt text"}],["$","li",null,{"children":"□ Structured data implémentées"}],["$","li",null,{"children":"□ FAQ schema pour recherche vocale"}]]}]]}]]}]]}]
36:["$","h2",null,{"children":"Conclusion"}]
37:["$","p",null,{"children":"Le SEO technique en 2024 nécessite une approche holistique combinant performance, expérience utilisateur et compréhension des nouvelles technologies. Les Core Web Vitals et l'optimisation mobile ne sont plus optionnels, tandis que l'IA transforme la façon dont nous devons structurer et présenter notre contenu."}]
38:["$","p",null,{"children":"Investir dans le SEO technique dès aujourd'hui vous positionnera avantageusement pour les évolutions futures du web. Commencez par auditer votre site actuel, corrigez les problèmes critiques, puis implémentez progressivement les optimisations avancées présentées dans cet article."}]
39:["$","footer",null,{"className":"mt-16 pt-8 border-t border-gray-200","children":["$","div",null,{"className":"flex items-center justify-between","children":[["$","div",null,{"children":[["$","p",null,{"className":"text-sm text-gray-600 mb-2","children":"Publié le 12 Septembre 2024"}],["$","div",null,{"className":"flex items-center space-x-4","children":[["$","span",null,{"className":"text-sm text-gray-500","children":"Partager:"}],["$","a",null,{"href":"#","className":"text-tuxyoBlue hover:text-blue-700","children":"Twitter"}],["$","a",null,{"href":"#","className":"text-tuxyoBlue hover:text-blue-700","children":"LinkedIn"}]]}]]}],["$","$Lf",null,{"href":"/blog","className":"bg-tuxyoBlue text-white px-6 py-2 rounded-lg font-medium hover:bg-blue-700 transition","children":"← Retour au blog"}]]}]}]
3a:["$","$L4c",null,{"children":["$","$3e",null,{"name":"Next.MetadataOutlet","children":"$@4d"}]}]
3c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
3f:[["$","title","0",{"children":"Tuxyo - Solutions logicielles expertes"}],["$","meta","1",{"name":"description","content":"Expertise en développement logiciel avec +25 ans d'expérience. Spécialisé en Java, NodeJS, Spring Boot, ReactJS, et solutions Cloud. Architecture et développement de solutions robustes."}]]
4d:null