npm créer astro@latest -- --template blog
cd [project_name] && npm run dev
À partir d'Astro 5, l'API Content Layer a été introduite, un outil qui vous permet de charger des données depuis n'importe quelle source lors de la construction de votre site et d'y accéder via une API simple et sécurisée.
Cette API offre la flexibilité nécessaire pour gérer le contenu provenant de diverses sources, telles que des fichiers Markdown locaux, des API distantes ou des systèmes de gestion de contenu (CMS). En définissant des « collections » de contenu avec des schémas spécifiques, vous pouvez structurer et valider efficacement vos données. De plus, l'API Content Layer améliore les performances sur les sites riches en contenu, en accélérant les temps de création et en réduisant l'utilisation de la mémoire.
https://astro.build/blog/astro-5/
Vous pouvez utiliser l'API Content Layer d'Astro pour intégrer les publications dev.to dans votre site. Bien qu'il n'y ait pas de chargeur spécifique pour dev.to, vous pouvez en créer un personnalisé qui consomme son API et stocke les publications dans une collection de contenu dans Astro.
Pour y parvenir, suivez ces étapes :
Créez le fichier .env à la racine du projet
.env
DEV_TO_API_URL=https://dev.to/api/ DEV_API_KEY=tu_clave_de_api
Dans src/content.config.ts, définissez une collection pour les publications dev.to à l'aide de l'API Content Layer :
Lors de la création du projet avec le modèle Astro, il génère automatiquement la collection pour le Blog
srccontent.config.ts
import { glob } from 'astro/loaders'; import { defineCollection, z } from 'astro:content'; const blog = defineCollection({ // Load Markdown and MDX files in the `src/content/blog/` directory. loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }), // Type-check frontmatter using a schema schema: z.object({ title: z.string(), description: z.string(), // Transform string to Date object pubDate: z.coerce.date(), updatedDate: z.coerce.date().optional(), heroImage: z.string().optional(), }), }); export const collections = { blog };
Maintenant, nous créons la collection pour les articles Dev.to
const devTo = defineCollection({ loader: async () => { const headers = new Headers({ "api-key": DEV_API_KEY, }); const posts = await fetch(`${DEV_TO_API_URL}articles?username=jmr85`, { headers: headers }).then(res => res.json()); return posts.map((post: any) => ({ id: post.slug, title: post.title, description: post.description, pubDate: new Date(post.published_at), updatedDate: post.edited_at ? new Date(post.edited_at) : null, heroImage: post.cover_image || post.social_image, url: post.url, })); }, schema: z.object({ title: z.string(), description: z.string(), pubDate: z.coerce.date(), updatedDate: z.coerce.date().optional(), heroImage: z.string().nullable(), url: z.string(), }), }); export const collections = { blog, devTo };
Voici le code complet pour
srccontent.config.ts
DEV_TO_API_URL=https://dev.to/api/ DEV_API_KEY=tu_clave_de_api
Regardez le détail dans la définition des champs dans le schéma, les champs doivent correspondre à la collection de blogs du modèle Astro puis ajoutez ceux qui sont particuliers à la collection de posts Dev.to. Ils doivent avoir le même nom que le type de données, afin que nous puissions "fusionner" les articles markdown du modèle Astro avec ceux de Dev.to dans la section Blog.
Vous pouvez désormais accéder aux publications dev.to dans vos composants ou pages Astro en utilisant getCollection :
À l'origine :
srcpagesblogindex.astro
import { glob } from 'astro/loaders'; import { defineCollection, z } from 'astro:content'; const blog = defineCollection({ // Load Markdown and MDX files in the `src/content/blog/` directory. loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }), // Type-check frontmatter using a schema schema: z.object({ title: z.string(), description: z.string(), // Transform string to Date object pubDate: z.coerce.date(), updatedDate: z.coerce.date().optional(), heroImage: z.string().optional(), }), }); export const collections = { blog };
Maintenant, nous allons faire l'itération des articles avec un conditionnel en ligne qui, s'il s'agit de devto, redirigera vers l'url de l'article sur le site https://dev.to/{username}/{slug-article >
{ posts.map((post) => ( <li> <a href={post.collection === "devTo" ? post.data.url : `/blog/${post.id}/`}> <img width={720} height={360} src={post.data.heroImage} alt="" /> <h4> <p><img src="https://img.php.cn/upload/article/000/000/000/173540174627117.jpg" alt="AstroJS : Integra contenido de Dev.to de manera sencilla"></p> <p>Dépôt : https://github.com/jmr85/astro-devto</p>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!