Retour au blog

Edge Computing avec Node.js : Le Futur de la Performance Web Déjà Arrivé en 2025

Salut HaWkers, l'edge computing est passé de concept à réalité mainstream en 2025. Node.js en edge locations livre une latence <10ms globalement, exécutant du code proche des utilisateurs dans 300+ locations. Cela redéfinit ce que signifie "web rapide".

Qu'est-ce que l'Edge Computing ?

L'edge computing exécute du code sur des serveurs distribués globalement, proches des utilisateurs finaux. Au lieu d'un serveur central dans us-east-1, votre code tourne à São Paulo, Tokyo, Londres simultanément.

// Traditionnel : Serveur central
const traditionalSetup = {
  server: 'us-east-1 (Virginia)',
  userInFrance: {
    latency: '100-150ms',
    hops: 'France → London → Virginia → London → France'
  },
  userInJapan: {
    latency: '200-300ms',
    hops: 'Japan → California → Virginia → ...'
  }
};

// Edge : Distribué globalement
const edgeSetup = {
  locations: '300+ worldwide',
  userInFrance: {
    latency: '<10ms',
    server: 'Paris edge location'
  },
  userInJapan: {
    latency: '<10ms',
    server: 'Tokyo edge location'
  }
};

// Résultat : 20-30x réduction de latence !

Plateformes Edge en 2025

1. Cloudflare Workers

// Worker tournant sur 300+ locations
export default {
  async fetch(request) {
    const url = new URL(request.url);

    // Géolocalisation automatique
    const country = request.cf.country;
    const city = request.cf.city;

    // KV storage sur l'edge
    const cache = await EDGE_KV.get(`page:${url.pathname}`);

    if (cache) {
      return new Response(cache, {
        headers: {
          'content-type': 'text/html',
          'x-edge-location': city,
          'x-cache': 'HIT'
        }
      });
    }

    // Fetch depuis l'origin seulement si nécessaire
    const response = await fetch(url);
    const html = await response.text();

    // Cache sur l'edge
    await EDGE_KV.put(`page:${url.pathname}`, html, {
      expirationTtl: 3600
    });

    return new Response(html, {
      headers: {
        'x-edge-location': city,
        'x-cache': 'MISS'
      }
    });
  }
};

// Deploy : wrangler publish
// Résultat : <10ms latence globale

2. Vercel Edge Functions

// Edge function avec géolocalisation
export const config = {
  runtime: 'edge'
};

export default async function handler(req) {
  const { geo } = req;

  // Personnalise le contenu par région
  const content = await getRegionalContent(geo.country);

  // A/B testing sur l'edge
  const variant = Math.random() < 0.5 ? 'A' : 'B';

  return new Response(
    JSON.stringify({
      content,
      variant,
      location: geo.city,
      latency: '<10ms'
    }),
    {
      headers: {
        'content-type': 'application/json',
        'x-edge-region': geo.country
      }
    }
  );
}

// Deploy : vercel --prod
// Tourne sur Vercel Edge Network

3. Deno Deploy

// Deno Deploy - TypeScript natif sur l'edge
import { serve } from 'https://deno.land/std@0.177.0/http/server.ts';

serve(async (req) => {
  const start = Date.now();

  // Deno KV sur l'edge
  const kv = await Deno.openKv();
  const cached = await kv.get(['cache', req.url]);

  if (cached.value) {
    return new Response(cached.value as string, {
      headers: {
        'x-cache': 'HIT',
        'x-latency': `${Date.now() - start}ms`
      }
    });
  }

  const response = await processRequest(req);
  await kv.set(['cache', req.url], response, {
    expireIn: 3600000 // 1 heure
  });

  return new Response(response, {
    headers: {
      'x-cache': 'MISS',
      'x-latency': `${Date.now() - start}ms`
    }
  });
});

// Deploy : deployctl deploy
// Global edge deployment

Cas d'Usage Parfaits pour l'Edge

1. Personnalisation par Géolocalisation

// Détecte la localisation et personnalise
export default async function handler(req) {
  const { country, city } = req.geo;

  // Devise locale
  const currency = getCurrencyForCountry(country);

  // Langue préférée
  const language = getLanguageForCountry(country);

  // Produits disponibles dans la région
  const products = await getRegionalProducts(country);

  return Response.json({
    currency,
    language,
    products,
    message: `Personnalisé pour ${city}, ${country}`
  });
}

2. A/B Testing sans Latence

// Décisions A/B test sur l'edge = zéro latence
export default function handler(req) {
  const userId = req.headers.get('x-user-id');

  // Variant consistant par utilisateur
  const variant = hashUserId(userId) % 2 === 0 ? 'A' : 'B';

  // Log pour analytics (async, ne bloque pas)
  logVariantAssignment(userId, variant);

  return Response.json({
    variant,
    features: getFeatureFlags(variant)
  });
}

3. Authentification sur l'Edge

// Validation JWT sur l'edge
import { verify } from 'jose';

export default async function handler(req) {
  const token = req.headers.get('authorization')?.split(' ')[1];

  if (!token) {
    return new Response('Unauthorized', { status: 401 });
  }

  try {
    // Valide JWT sur l'edge
    const { payload } = await verify(token, SECRET);

    // Ajoute user info au request
    const modifiedReq = new Request(req.url, {
      headers: {
        ...req.headers,
        'x-user-id': payload.sub,
        'x-user-role': payload.role
      }
    });

    // Forward vers origin
    return fetch(ORIGIN_URL, modifiedReq);
  } catch {
    return new Response('Invalid token', { status: 401 });
  }
}

4. Optimisation d'Images sur l'Edge

// Resize/optimize images à la volée
export default async function handler(req) {
  const url = new URL(req.url);
  const width = url.searchParams.get('w') || '800';
  const quality = url.searchParams.get('q') || '80';

  // Fetch image originale
  const imageReq = await fetch(url.pathname);
  const image = await imageReq.arrayBuffer();

  // Resize sur l'edge (avec WebAssembly !)
  const resized = await resizeImage(image, {
    width: parseInt(width),
    quality: parseInt(quality)
  });

  return new Response(resized, {
    headers: {
      'content-type': 'image/jpeg',
      'cache-control': 'public, max-age=31536000',
      'x-processed-at': 'edge'
    }
  });
}

Limitations et Considérations

const edgeLimitations = {
  cpuTime: 'Limité (50-100ms typique)',
  memory: 'Restreint (128MB typique)',
  coldStart: 'Pratiquement zéro, mais existe',
  statefulness: 'Difficile - edge est stateless',
  debugging: 'Plus complexe que traditionnel',
  cost: 'Peut être plus élevé pour fort trafic'
};

// Quand NE PAS utiliser l'edge :
const avoidEdgeFor = [
  'Traitement CPU intensif',
  'Applications stateful complexes',
  'WebSocket de longue durée',
  'Opérations nécessitant >100ms CPU'
];

Performance Réelle : Avant et Après

const realWorldImpact = {
  ecommerce: {
    before: 'TTFB 200ms, Core Web Vitals: Poor',
    after: 'TTFB 10ms, Core Web Vitals: Good',
    result: '+15% conversion rate'
  },
  media: {
    before: 'First paint 1.2s',
    after: 'First paint 0.3s',
    result: '+30% engagement'
  },
  api: {
    before: 'p99 latency 500ms',
    after: 'p99 latency 50ms',
    result: 'Better UX, lower costs'
  }
};

L'edge computing avec Node.js redéfinit la performance web en 2025. <10ms de latence globale n'est plus de la science-fiction - c'est une réalité disponible aujourd'hui. Si vous construisez pour le web, l'edge devrait être sur votre radar. Pour plus sur Node.js moderne, voyez : Serverless en 2025 : Comment Node.js Domine.

C'est parti !

Commentaires (0)

Cet article n'a pas encore de commentaires. Soyez le premier!

Ajouter des commentaires