Implementação de Contentful CMS com Claude Code
Aprenda sobre implementação de Contentful CMS usando o Claude Code. Dicas práticas e exemplos de código incluídos.
Eficientizando a Integração com Contentful CMS usando Claude Code
O Contentful é um dos principais CMS headless, realizando gerenciamento de conteúdo API-first. Com modelos de conteúdo estruturados e uma rica API de distribuição, é possível obter conteúdo de qualquer frontend. Com o Claude Code, você pode avançar eficientemente desde o design do modelo de conteúdo até a integração com o frontend.
Design do Modelo de Conteúdo
> Projete um modelo de conteúdo para um site de blog no Contentful.
> Com 3 tipos de conteúdo: artigo, categoria e autor.
// scripts/setup-content-model.ts
import contentful from 'contentful-management';
const client = contentful.createClient({
accessToken: process.env.CONTENTFUL_MANAGEMENT_TOKEN!,
});
async function setupContentModel() {
const space = await client.getSpace(process.env.CONTENTFUL_SPACE_ID!);
const env = await space.getEnvironment('master');
// Tipo de conteúdo Autor
const author = await env.createContentTypeWithId('author', {
name: 'Author',
fields: [
{ id: 'name', name: 'Name', type: 'Symbol', required: true },
{ id: 'slug', name: 'Slug', type: 'Symbol', required: true },
{ id: 'bio', name: 'Bio', type: 'Text' },
{ id: 'avatar', name: 'Avatar', type: 'Link', linkType: 'Asset' },
],
});
await author.publish();
// Categoria
const category = await env.createContentTypeWithId('category', {
name: 'Category',
fields: [
{ id: 'name', name: 'Name', type: 'Symbol', required: true },
{ id: 'slug', name: 'Slug', type: 'Symbol', required: true },
{ id: 'description', name: 'Description', type: 'Text' },
],
});
await category.publish();
// Artigo do Blog
const blogPost = await env.createContentTypeWithId('blogPost', {
name: 'Blog Post',
fields: [
{ id: 'title', name: 'Title', type: 'Symbol', required: true },
{ id: 'slug', name: 'Slug', type: 'Symbol', required: true },
{ id: 'excerpt', name: 'Excerpt', type: 'Text' },
{ id: 'body', name: 'Body', type: 'RichText' },
{ id: 'featuredImage', name: 'Featured Image', type: 'Link', linkType: 'Asset' },
{ id: 'author', name: 'Author', type: 'Link', linkType: 'Entry' },
{ id: 'category', name: 'Category', type: 'Link', linkType: 'Entry' },
{ id: 'tags', name: 'Tags', type: 'Array', items: { type: 'Symbol' } },
{ id: 'publishedAt', name: 'Published At', type: 'Date' },
],
});
await blogPost.publish();
}
Obtenção de Conteúdo
> Crie um cliente para obter artigos do blog usando a
> Content Delivery API do Contentful. Gere também os tipos TypeScript.
// src/lib/contentful.ts
import { createClient, type Entry, type Asset } from 'contentful';
const client = createClient({
space: process.env.CONTENTFUL_SPACE_ID!,
accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,
});
// Cliente para preview
const previewClient = createClient({
space: process.env.CONTENTFUL_SPACE_ID!,
accessToken: process.env.CONTENTFUL_PREVIEW_TOKEN!,
host: 'preview.contentful.com',
});
function getClient(preview = false) {
return preview ? previewClient : client;
}
// Definição de tipos
interface BlogPostFields {
title: string;
slug: string;
excerpt: string;
body: any; // Rich Text Document
featuredImage: Asset;
author: Entry<AuthorFields>;
category: Entry<CategoryFields>;
tags: string[];
publishedAt: string;
}
interface AuthorFields {
name: string;
slug: string;
bio: string;
avatar: Asset;
}
interface CategoryFields {
name: string;
slug: string;
description: string;
}
// Obter lista de artigos
export async function getBlogPosts(options?: {
limit?: number;
skip?: number;
category?: string;
preview?: boolean;
}) {
const { limit = 10, skip = 0, category, preview = false } = options || {};
const query: any = {
content_type: 'blogPost',
order: ['-fields.publishedAt'],
limit,
skip,
include: 2,
};
if (category) {
query['fields.category.sys.contentType.sys.id'] = 'category';
query['fields.category.fields.slug'] = category;
}
const entries = await getClient(preview).getEntries<BlogPostFields>(query);
return {
posts: entries.items,
total: entries.total,
};
}
// Obter artigo individual
export async function getBlogPost(slug: string, preview = false) {
const entries = await getClient(preview).getEntries<BlogPostFields>({
content_type: 'blogPost',
'fields.slug': slug,
include: 2,
limit: 1,
});
return entries.items[0] || null;
}
Implementação ISR com Next.js
// app/blog/[slug]/page.tsx
import { getBlogPost, getBlogPosts } from '@/lib/contentful';
import { documentToReactComponents } from '@contentful/rich-text-react-renderer';
import { notFound } from 'next/navigation';
export const revalidate = 60; // Revalidar a cada 60 segundos
export async function generateStaticParams() {
const { posts } = await getBlogPosts({ limit: 100 });
return posts.map((post) => ({ slug: post.fields.slug }));
}
export default async function BlogPostPage({
params,
}: {
params: { slug: string };
}) {
const post = await getBlogPost(params.slug);
if (!post) notFound();
return (
<article className="max-w-3xl mx-auto p-6">
<h1 className="text-4xl font-bold">{post.fields.title}</h1>
<p className="text-gray-500 mt-2">
{new Date(post.fields.publishedAt).toLocaleDateString('pt-BR')}
</p>
<div className="prose mt-8">
{documentToReactComponents(post.fields.body)}
</div>
</article>
);
}
Resumo
Combinando a abordagem API-first do Contentful com o Claude Code, você pode construir eficientemente um sistema flexível de gerenciamento de conteúdo. Consulte também o Guia de Construção de Blog CMS e a Comparação SSR/SSG.
Para mais detalhes sobre o Contentful, consulte a documentação oficial do Contentful.
Related Posts
Como Turbinar Seus Projetos Pessoais com o Claude Code [Com Exemplos]
Aprenda a acelerar drasticamente projetos de desenvolvimento pessoal usando o Claude Code. Inclui exemplos reais e um workflow prático da ideia ao deploy.
Como Automatizar Refatoração com o Claude Code
Aprenda a automatizar refatoração de código de forma eficiente usando o Claude Code. Inclui prompts práticos e padrões concretos de refatoração para projetos reais.
Guia Completo de Configuração CORS com Claude Code
Aprenda sobre o guia completo de configuração CORS usando o Claude Code. Dicas práticas e exemplos de código incluídos.