Getting Started with Astro and MDX

5 min read

What is MDX?

MDX is a powerful extension of Markdown that allows you to use JSX components directly in your content. This means you can write Markdown for your content while incorporating interactive React-like components seamlessly.

With Astro and MDX, you get the best of both worlds:

  • Markdown simplicity for writing content
  • JSX components for interactive elements
  • Static generation for blazing fast performance

Setting Up MDX in Astro

Getting started with MDX in Astro is incredibly straightforward. First, install the official integration:

pnpm astro add mdx

This command automatically:

  • Installs the @astrojs/mdx package
  • Updates your astro.config.mjs file
  • Configures everything you need to start writing MDX

Basic MDX Features

Writing Markdown

You can write regular Markdown as you normally would:

# This is a heading
This is a paragraph with **bold** and *italic* text.

- List item 1
- List item 2
- List item 3

Embedding Components

The real power comes from embedding components. You can import and use Astro components, React components, or any other framework components:

---
import MyComponent from '../components/MyComponent.astro';
import { InteractiveChart } from '../components/Chart.jsx';
---

# My Blog Post

Here's some regular markdown content.

<MyComponent title="Hello from Astro!" />

And here's an interactive chart:

<InteractiveChart data={chartData} />

Frontmatter Variables

You can access frontmatter variables directly in your content:

---
title: "My Post"
author: "John Doe"
tags: ["astro", "mdx", "javascript"]
---

# {frontmatter.title}

Written by **{frontmatter.author}**

Tags: {frontmatter.tags.join(", ")}

Advanced Features

Custom Layouts

MDX files can specify their layout in the frontmatter:

---
layout: ../../layouts/BlogLayout.astro
title: "My Blog Post"
---

The layout receives the frontmatter as props and renders the MDX content in a <slot />.

Syntax Highlighting

Code blocks get automatic syntax highlighting with Shiki:

// JavaScript with beautiful syntax highlighting
function calculateFibonacci(n) {
  if (n <= 1) return n;
  return calculateFibonacci(n - 1) + calculateFibonacci(n - 2);
}

console.log(calculateFibonacci(10)); // 55

TypeScript Support

Full TypeScript support out of the box:

interface User {
  id: number;
  name: string;
  email: string;
}

const createUser = (userData: Omit<User, 'id'>): User => {
  return {
    id: Math.random(),
    ...userData
  };
};

Best Practices

  1. Keep components simple - MDX works best with focused, reusable components
  2. Use frontmatter effectively - Store metadata and configuration in frontmatter
  3. Organize your content - Use a consistent folder structure for your MDX files
  4. Test your components - Make sure interactive components work well in the MDX context

Conclusion

Astro + MDX provides an incredible developer experience for content-heavy sites. You get the simplicity of Markdown with the power of components, all while maintaining excellent performance through Astro’s static-first approach.

Next Steps: Try creating your own MDX files and experiment with embedding different types of components. The possibilities are endless!

Whether you’re building a blog, documentation site, or any content-focused application, this combination gives you the flexibility to create engaging, interactive content without sacrificing performance.