bedda.tech logobedda.tech
← Back to blog

Getting Started with Next.js and MDX for Your Blog

Bedda Team
5 min read
frontendfull-stackbest practicesweb development

Building a blog doesn't have to be complicated. With Next.js and MDX, you can create a fast, SEO-friendly blog with the power of React components right in your markdown content.

What is MDX?

MDX is a superset of Markdown that allows you to use JSX components within your markdown files. This means you can:

  • Write content in familiar Markdown syntax
  • Embed interactive React components
  • Create custom layouts and designs
  • Maintain type safety with TypeScript

Why Next.js + MDX?

The combination of Next.js and MDX offers several advantages:

Performance Benefits

  • Static Generation: Blog posts are generated at build time for optimal performance
  • Image Optimization: Automatic image optimization with Next.js Image component
  • Code Splitting: Only load the JavaScript needed for each page

Developer Experience

// Type-safe blog post metadata
interface BlogPost {
  slug: string;
  title: string;
  date: string;
  description: string;
  author: string;
  tags?: string[];
}

SEO Advantages

  • Server-side rendering for search engines
  • Automatic sitemap generation
  • RSS feed support
  • Open Graph and Twitter Card meta tags

Setting Up Your Blog

1. Install Dependencies

First, install the required packages:

npm install @next/mdx @mdx-js/loader @mdx-js/react @types/mdx
npm install remark-gfm rehype-highlight rehype-slug rehype-autolink-headings
npm install gray-matter reading-time

2. Configure Next.js

Update your next.config.mjs:

import createMDX from '@next/mdx';
import remarkGfm from 'remark-gfm';
import rehypeHighlight from 'rehype-highlight';

const withMDX = createMDX({
  options: {
    remarkPlugins: [remarkGfm],
    rehypePlugins: [rehypeHighlight],
  },
});

export default withMDX({
  pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'],
});

3. Create Your Content Structure

Organize your blog posts:

content/
└── blog/
    ├── post-one.mdx
    ├── post-two.mdx
    └── post-three.mdx

4. Add Frontmatter

Every blog post should start with frontmatter:

---
title: 'Your Post Title'
date: '2025-01-16'
description: 'A compelling description'
author: 'Your Name'
tags: ['tag1', 'tag2']
---

Key Features to Implement

Reading Time

Calculate reading time automatically:

import readingTime from 'reading-time';

const stats = readingTime(content);
console.log(stats.text); // "5 min read"

Show related posts based on tags:

export function getRelatedPosts(slug: string, limit: number = 3) {
  const currentPost = getPostBySlug(slug);
  const allPosts = getAllPosts();

  return allPosts
    .filter((post) => post.slug !== slug)
    .filter((post) => hasCommonTags(post, currentPost))
    .slice(0, limit);
}

RSS Feed

Generate an RSS feed for subscribers:

export async function GET() {
  const posts = getAllPosts();

  const rss = `<?xml version="1.0" encoding="UTF-8"?>
    <rss version="2.0">
      <channel>
        <title>Your Blog</title>
        ${posts.map((post) => `<item>...</item>`).join('')}
      </channel>
    </rss>`;

  return new Response(rss, {
    headers: { 'Content-Type': 'application/xml' },
  });
}

Best Practices

1. Optimize Images

Always optimize images before adding them:

  • Compress images (aim for < 200KB)
  • Use appropriate dimensions (1200x630 for featured images)
  • Add descriptive alt text

2. Write for SEO

  • Keep titles under 60 characters
  • Write descriptions around 150-160 characters
  • Use semantic headings (H1 → H2 → H3)
  • Include relevant keywords naturally

3. Structure Your Content

Good content structure improves readability and SEO. Use headings, lists, and code blocks to break up your content.

Use lists for better scannability:

  • Introduction: Hook the reader
  • Body: Detailed content with examples
  • Conclusion: Summary and call-to-action

4. Add Code Examples

Include practical, runnable examples:

// Good: Clear, commented code
function greet(name) {
  // Validate input
  if (!name) return 'Hello, stranger!';

  // Return personalized greeting
  return `Hello, ${name}!`;
}

Deployment

  1. Push your code to GitHub
  2. Import project in Vercel
  3. Deploy automatically on every push

Environment Variables

Set your environment variables:

NEXT_PUBLIC_SITE_URL=https://yourdomain.com

Common Challenges and Solutions

ChallengeSolution
Slow build timesUse incremental static regeneration
Large bundle sizeImplement dynamic imports
Poor mobile renderingUse responsive images and typography
Missing metadataValidate frontmatter with TypeScript

What's Next?

Now that you have a functional blog, consider adding:

  • Full-text search with Algolia or Fuse.js
  • Comments with Giscus or Disqus
  • Newsletter integration with ConvertKit
  • Analytics with Vercel Analytics or Plausible

Conclusion

Building a blog with Next.js and MDX gives you the best of both worlds: the simplicity of Markdown and the power of React. The setup might seem complex at first, but once configured, it provides an excellent authoring and reading experience.

Key Takeaways

  • MDX combines Markdown simplicity with React power
  • Next.js provides excellent performance and SEO
  • Proper configuration enables advanced features
  • Focus on content quality and user experience

Ready to start blogging? Copy the template and write your first post!

Have Questions or Need Help?

Our team is ready to assist you with your project needs.

Contact Us