Rumah > hujung hadapan web > tutorial js > Mengoptimumkan Penyepaduan API Blog: Pelajaran yang Dipelajari dengan Dev.to dan Hashnode

Mengoptimumkan Penyepaduan API Blog: Pelajaran yang Dipelajari dengan Dev.to dan Hashnode

DDD
Lepaskan: 2024-12-18 10:53:11
asal
409 orang telah melayarinya

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

Semasa pembangunan portfolio peribadi saya dengan Astro, saya menghadapi cabaran yang menarik: bagaimana untuk menyepadukan siaran Dev.to dan Hashnode saya dengan cekap tanpa perlu membina semula tapak setiap kali saya menyiarkan kandungan baharu?

Masalahnya

Masalahnya kelihatan mudah pada mulanya: paparkan semua siaran saya daripada kedua-dua platform pada satu halaman. Walau bagaimanapun, saya menghadapi beberapa cabaran:

  1. Had Penomboran: Pada mulanya, saya hanya mendapat 20-30 siaran pertama
  2. Siaran Yang Hilang: Setiap kali saya menerbitkan siaran baharu, saya perlu mengubah suai kod tersebut untuk dipaparkan
  3. Cache Agresif: Catatan baharu tidak muncul serta-merta kerana cache

Penyelesaian

1. Titik Akhir Tanpa Pelayan

Saya mencipta titik akhir tanpa pelayan di Astro yang menggabungkan siaran daripada kedua-dua platform:

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'
    }
  });
};
Salin selepas log masuk

2. Memaksimumkan Pendapatan Selepas

Kuncinya ialah meminta bilangan maksimum jawatan yang mungkin:

// 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
          }
        }
      }
    }
  }
`;
Salin selepas log masuk

3. Mengelakkan Cache

Untuk memastikan kandungan segar, saya melaksanakan strategi anti-cache:

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

4. Pelaksanaan Klien

Untuk memastikan antara muka dikemas kini, saya mencipta komponen React yang mengendalikan memuatkan dan mengemas kini siaran:

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>
  );
}
Salin selepas log masuk

Faedah Yang Diperolehi

  1. Kemas Kini Automatik: Catatan baharu muncul tanpa perlu membina semula tapak
  2. Prestasi Lebih Baik: Pemuatan awal lebih pantas berkat titik akhir tanpa pelayan
  3. Tiada Kehilangan Kandungan: Semua siaran boleh diakses, tidak kira bila ia diterbitkan
  4. Penyelenggaraan Dikurangkan: Tiada campur tangan manual diperlukan untuk memaparkan siaran baharu

Pengendalian Ralat

Saya melaksanakan sistem pengendalian ralat yang teguh:

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) : [];
  }
}
Salin selepas log masuk

Pengoptimuman Prestasi

Untuk meningkatkan lagi prestasi, saya melaksanakan:

  1. Cache Setempat:
// 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));
}
Salin selepas log masuk
  1. Malas Memuatkan Imej:
function PostImage({ src, alt }) {
  return (
    <img 
      loading="lazy"
      src={src} 
      alt={alt}
      className="w-full h-48 object-cover"
    />
  );
}
Salin selepas log masuk

Penyelesaian ini telah terbukti teguh dan cekap, membolehkan saya:

  • Pastikan portfolio saya dikemas kini secara automatik
  • Tingkatkan pengalaman pengguna dengan pengecasan pantas
  • Kurangkan keperluan untuk penyelenggaraan manual
  • Pastikan semua kandungan saya tersedia dan terkini

Langkah Seterusnya

Saya bercadang untuk melaksanakan:

  1. Sistem carian dan penapisan pos
  2. Pratonton kandungan
  3. Metrik penglibatan
  4. Sistem ulasan bersatu

Atas ialah kandungan terperinci Mengoptimumkan Penyepaduan API Blog: Pelajaran yang Dipelajari dengan Dev.to dan Hashnode. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan