Creating dynamic routes in Astro allows you to build flexible, data-driven websites efficiently. Whether you’re developing a blog, e-commerce site, or documentation platform, understanding dynamic routing is crucial for scaling your Astro applications. Let’s explore how to implement and leverage dynamic routes effectively.
Dynamic routing in Astro enables you to generate multiple pages from a single template file, making your code more maintainable and your development process more efficient. This approach is particularly useful when working with content management systems, APIs, or any data source that requires multiple similar pages.
In this guide, we’ll cover everything you need to know about dynamic routing in Astro, from basic setup to advanced implementations. By the end, you’ll be able to create flexible, maintainable page structures that scale with your content.
Table of Contents
- Understanding Dynamic Routes in Astro
- Basic Dynamic Route Setup
- Working with Multiple Dynamic Parameters
- Dynamic Routes with REST APIs
- Implementing Dynamic Route Patterns
- Error Handling and Optional Parameters
- Best Practices for Dynamic Routes
- Conclusion
Understanding Dynamic Routes in Astro
Astro’s dynamic routing system uses a file-based routing approach with special syntax for creating dynamic parameters. These routes are defined in your project’s src/pages
directory using square brackets [param]
in the filename.
For example, a file named src/pages/blog/[slug].astro
will generate routes for any blog post where [slug]
is replaced with the actual post identifier.
Basic Dynamic Route Setup
Let’s create a basic dynamic route for a blog post system:
---
// src/pages/blog/[slug].astro
export async function getStaticPaths() {
const posts = [
{
slug: 'first-post',
title: 'My First Post',
content: 'This is my first blog post'
},
{
slug: 'second-post',
title: 'My Second Post',
content: 'This is my second blog post'
}
];
return posts.map(post => ({
params: { slug: post.slug },
props: { post }
}));
}
const { post } = Astro.props;
---
<html>
<head>
<title>{post.title}</title>
</head>
<body>
<h1>{post.title}</h1>
<p>{post.content}</p>
</body>
</html>
Code language: JavaScript (javascript)
Working with Multiple Dynamic Parameters
Astro supports multiple dynamic parameters in a single route. This is useful for creating more complex URL structures:
---
// src/pages/[category]/[id].astro
export async function getStaticPaths() {
return [
{ params: { category: 'electronics', id: '1' } },
{ params: { category: 'books', id: '2' } }
];
}
const { category, id } = Astro.params;
---
<h1>Category: {category}</h1>
<p>Product ID: {id}</p>
Code language: JavaScript (javascript)
Dynamic Routes with REST APIs
Let’s create a more practical example using an external API:
---
// src/pages/products/[id].astro
export async function getStaticPaths() {
const response = await fetch('https://api.example.com/products');
const products = await response.json();
return products.map(product => ({
params: { id: product.id.toString() },
props: { product }
}));
}
const { product } = Astro.props;
---
<html>
<head>
<title>{product.name}</title>
</head>
<body>
<h1>{product.name}</h1>
<p>{product.description}</p>
<p>Price: ${product.price}</p>
</body>
</html>
Code language: JavaScript (javascript)
Implementing Dynamic Route Patterns
Astro supports various dynamic route patterns to handle different URL structures:
Rest Parameters
Use [...path]
to catch all remaining path segments:
---
// src/pages/docs/[...path].astro
export async function getStaticPaths() {
return [
{ params: { path: 'intro/getting-started' } },
{ params: { path: 'advanced/dynamic-routes' } }
];
}
const { path } = Astro.params;
---
<h1>Documentation: {path}</h1>
Code language: JavaScript (javascript)
Error Handling and Optional Parameters
It’s important to handle cases where the requested path doesn’t exist:
---
// src/pages/[slug].astro
export async function getStaticPaths() {
const posts = await getPosts(); // Your data fetching function
return posts.map(post => ({
params: { slug: post.slug },
props: { post }
}));
}
const { post } = Astro.props;
if (!post) {
return Astro.redirect('/404');
}
---
<html>
<head>
<title>{post.title}</title>
</head>
<body>
<h1>{post.title}</h1>
<div set:html={post.content}></div>
</body>
</html>
Code language: JavaScript (javascript)
Best Practices for Dynamic Routes
- Performance Optimization: Generate only necessary routes to avoid build-time bloat.
- URL Structure: Keep your URL structure clean and logical.
- Error Handling: Always implement proper error handling for missing routes.
- TypeScript Integration: Use TypeScript for better type safety:
interface Post {
slug: string;
title: string;
content: string;
}
export async function getStaticPaths() {
const posts: Post[] = await getPosts();
return posts.map((post) => ({
params: { slug: post.slug },
props: { post }
}));
}
Code language: JavaScript (javascript)
Conclusion
Dynamic routes in Astro provide a powerful way to create flexible, scalable web applications. They enable you to generate multiple pages from a single template, making your codebase more maintainable and efficient. As you’ve seen in our examples, you can use dynamic routes for various use cases, from simple blog posts to complex documentation systems.
If you’re looking to expand your Astro knowledge further, check out our guide on integrating Tailwind CSS with Astro to enhance your styling capabilities.
Start implementing dynamic routes in your Astro projects today, and remember to follow the best practices we’ve discussed to ensure optimal performance and maintainability. Happy coding!