Developers
This guide covers best practices for developing with Agility CMS, including code organization, performance, security, and maintainability.
This guide covers best practices for developing with Agility CMS, including code organization, performance, security, and maintainability.
Organize code logically:
src/
├── app/ # Next.js App Router
├── components/
│ └── agility-components/ # Agility components
├── lib/
│ ├── cms/ # CMS utilities
│ └── types/ # TypeScript types
└── middleware.ts # Middleware
// ✅ Good
const { fields } = await getContentItem<IPost>({
contentID: 204,
languageCode: "en-us"
})
// ❌ Bad
const { fields } = await getContentItem({
contentID: 204,
languageCode: "en-us"
})
interface IPost {
contentID: number
fields: {
heading: string
slug: string
content: string
image: ImageField
}
}
<AgilityPic> for Agility imagespriority for above-the-fold imagesfallbackWidthtry {
const { fields } = await getContentItem<IPost>({
contentID: 204,
languageCode: "en-us"
})
} catch (error) {
// Handle gracefully
return <div>Content not available</div>
}
const { fields } = await getContentItem<IPost>({
contentID: 204,
languageCode: "en-us"
}).catch(() => ({
fields: {
heading: "Default Heading",
content: "Default content"
}
}))
<AgilityPic
image={imageField}
alt={imageField.label || "Descriptive alt text"}
data-agility-field="image"
/>
/**
* Blog post content item
* @interface IPost
*/
interface IPost {
/** Post heading/title */
heading: string
/** URL-friendly slug */
slug: string
/** Post content (HTML) */
content: string
}
Always use TypeScript for type safety.
Always handle errors gracefully.
Leverage caching for performance.
Use environment variables and configuration.
Test with different content and scenarios.