Heim > Web-Frontend > js-Tutorial > Optimierung der Blog-API-Integration: Erkenntnisse mit Dev.to und Hashnode

Optimierung der Blog-API-Integration: Erkenntnisse mit Dev.to und Hashnode

DDD
Freigeben: 2024-12-18 10:53:11
Original
321 Leute haben es durchsucht

Optimizando la Integración de APIs de Blog: Lecciones Aprendidas con Dev.to y Hashnode

Während der Entwicklung meines persönlichen Portfolios mit Astro stieß ich auf eine interessante Herausforderung: Wie kann ich meine Dev.to- und Hashnode-Beiträge effizient integrieren, ohne die Website jedes Mal neu erstellen zu müssen, wenn ich etwas poste? neuer Inhalt?

Das Problem

Das Problem schien zunächst einfach: alle meine Beiträge von beiden Plattformen auf einer einzigen Seite anzuzeigen. Allerdings bin ich auf mehrere Herausforderungen gestoßen:

  1. Paginierungsbeschränkungen: Anfangs habe ich nur die ersten 20–30 Beiträge erhalten
  2. Verlorene Beiträge: Jedes Mal, wenn ich einen neuen Beitrag veröffentlichte, musste ich den Code ändern, damit er angezeigt wurde
  3. Aggressiver Cache: Neue Beiträge wurden aufgrund des Caches nicht sofort angezeigt

Die Lösung

1. Serverloser Endpunkt

Ich habe in Astro einen serverlosen Endpunkt erstellt, der die Beiträge beider Plattformen kombiniert:

export const GET: APIRoute = async () => {
  const [hashnodePosts, devtoPosts] = await Promise.all([
    getHashnodePosts(),
    getDevToPosts()
  ]);

  const allPosts = [...hashnodePosts, ...devtoPosts]
    .sort((a, b) => 
      new Date(b.rawDate).getTime() - new Date(a.rawDate).getTime()
    );

  return new Response(JSON.stringify(allPosts), {
    headers: {
      'Content-Type': 'application/json',
      'Cache-Control': 'no-store, no-cache, must-revalidate'
    }
  });
};
Nach dem Login kopieren

2. Maximierung der Nachakquise

Der Schlüssel besteht darin, die maximal mögliche Anzahl an Beiträgen anzufordern:

// Para Dev.to
const params = new URLSearchParams({
  username: 'goaqidev',
  per_page: '1000', // Máximo número de posts
  state: 'published'
});

// Para Hashnode
const query = `
  query {
    publication(host: "goaqidev.hashnode.dev") {
      posts(first: 1000) { // Máximo número de posts
        edges {
          node {
            title
            brief
            // ...otros campos
          }
        }
      }
    }
  }
`;
Nach dem Login kopieren

3. Den Cache meiden

Um sicherzustellen, dass die Inhalte aktuell sind, habe ich eine Anti-Cache-Strategie implementiert:

const timestamp = new Date().getTime();
const response = await fetch(`/api/posts.json?_=${timestamp}`, {
  headers: {
    'Cache-Control': 'no-cache',
    'Pragma': 'no-cache'
  }
});
Nach dem Login kopieren

4. Client-Implementierung

Um die Benutzeroberfläche auf dem neuesten Stand zu halten, habe ich eine React-Komponente erstellt, die das Laden und Aktualisieren von Beiträgen übernimmt:

import { useState, useEffect } from 'react';

function BlogPosts() {
  const [posts, setPosts] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const fetchPosts = async () => {
      try {
        const timestamp = new Date().getTime();
        const response = await fetch(`/api/posts.json?_=${timestamp}`);
        const data = await response.json();
        setPosts(data);
      } catch (error) {
        console.error('Error fetching posts:', error);
      } finally {
        setLoading(false);
      }
    };

    fetchPosts();
    // Actualizar cada 5 minutos
    const interval = setInterval(fetchPosts, 5 * 60 * 1000);
    return () => clearInterval(interval);
  }, []);

  if (loading) return <div>Cargando posts...</div>;

  return (
    <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
      {posts.map(post => (
        <article key={post.id} className="card">
          <h2>{post.title}</h2>
          <p>{post.brief}</p>
          <a href={post.url}>Leer más</a>
        </article>
      ))}
    </div>
  );
}
Nach dem Login kopieren

Erhaltene Vorteile

  1. Automatische Aktualisierung: Neue Beiträge werden angezeigt, ohne dass die Website neu erstellt werden muss
  2. Bessere Leistung: Das anfängliche Laden ist dank des serverlosen Endpunkts schneller
  3. Kein Inhaltsverlust: Alle Beiträge sind zugänglich, unabhängig davon, wann sie veröffentlicht wurden
  4. Reduzierter Wartungsaufwand: Kein manueller Eingriff erforderlich, um neue Beiträge anzuzeigen

Fehlerbehandlung

Ich habe ein robustes Fehlerbehandlungssystem implementiert:

async function fetchPosts() {
  try {
    const response = await fetch('/api/posts.json');
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    const posts = await response.json();
    return posts;
  } catch (error) {
    console.error('Error fetching posts:', error);
    // Intentar cargar desde caché local si está disponible
    const cachedPosts = localStorage.getItem('blog_posts');
    return cachedPosts ? JSON.parse(cachedPosts) : [];
  }
}
Nach dem Login kopieren

Leistungsoptimierung

Um die Leistung weiter zu verbessern, habe ich Folgendes implementiert:

  1. Lokaler Cache:
// Guardar posts en localStorage
localStorage.setItem('blog_posts', JSON.stringify(posts));

// Cargar posts desde localStorage mientras se actualiza
const cachedPosts = localStorage.getItem('blog_posts');
if (cachedPosts) {
  setPosts(JSON.parse(cachedPosts));
}
Nach dem Login kopieren
  1. Verzögertes Laden von Bildern:
function PostImage({ src, alt }) {
  return (
    <img 
      loading="lazy"
      src={src} 
      alt={alt}
      className="w-full h-48 object-cover"
    />
  );
}
Nach dem Login kopieren

Diese Lösung hat sich als robust und effizient erwiesen und ermöglicht mir Folgendes:

  • Mein Portfolio automatisch auf dem neuesten Stand halten
  • Verbessern Sie das Benutzererlebnis durch Schnellladen
  • Reduzieren Sie den Bedarf an manueller Wartung
  • Stellen Sie sicher, dass alle meine Inhalte verfügbar und aktuell sind

Nächste Schritte

Ich habe vor, Folgendes umzusetzen:

  1. Post-Such- und Filtersystem
  2. Inhaltsvorschau
  3. Engagement-Kennzahlen
  4. Einheitliches Kommentarsystem

Das obige ist der detaillierte Inhalt vonOptimierung der Blog-API-Integration: Erkenntnisse mit Dev.to und Hashnode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage