π Introduction
In this tutorial, you’ll learn how to create a simple blog app using Next.js 14 and Tailwind CSS. This step-by-step guide is perfect for beginners who want to understand Next.js fundamentals like routing, pages, dynamic routes, and styling.
π¦ Step 1: Create a New Next.js App
npx create-next-app@latest simple-blog-app
Follow the prompts:
- TypeScript: No
- App Router: Yes
- Tailwind CSS: Yes
π Step 2: Folder Structure
simple-blog-app/
βββ app/
β βββ page.js β Home Page
β βββ about/page.js β About Page
β βββ blog/page.js β Blog List
β βββ blog/[slug]/page.js β Blog Post (Dynamic)
βββ components/Navbar.js
βββ data/posts.js
π Step 3: Add Dummy Blog Data
// data/posts.js
export const posts = [
{
slug: "nextjs-introduction",
title: "Getting Started with Next.js",
content: "Next.js is a React framework for production..."
},
{
slug: "tailwind-setup",
title: "Using Tailwind CSS with Next.js",
content: "Tailwind makes styling easy and fast..."
}
];
π§© Step 4: Create Navbar Component
// components/Navbar.js
import Link from "next/link";
export default function Navbar() {
return (
<nav className="bg-blue-600 text-white p-4">
<div className="max-w-5xl mx-auto flex gap-4">
<Link href="/">Home</Link>
<Link href="/about">About</Link>
<Link href="/blog">Blog</Link>
</div>
</nav>
);
}
π Step 5: Home Page
// app/page.js
import Navbar from "../components/Navbar";
export default function Home() {
return (
<>
<Navbar />
<main className="max-w-5xl mx-auto p-4">
<h1 className="text-3xl font-bold">Welcome to Simple Blog</h1>
<p className="mt-2">A blog built with Next.js and Tailwind CSS.</p>
</main>
</>
);
}
π Step 6: About Page
// app/about/page.js
import Navbar from "../../components/Navbar";
export default function About() {
return (
<>
<Navbar />
<main className="max-w-5xl mx-auto p-4">
<h1 className="text-2xl font-semibold">About Us</h1>
<p className="mt-2">This is a demo blog made with Next.js 14.</p>
</main>
</>
);
}
π Step 7: Blog List Page
// app/blog/page.js
import { posts } from "../../data/posts";
import Link from "next/link";
import Navbar from "../../components/Navbar";
export default function Blog() {
return (
<>
<Navbar />
<main className="max-w-5xl mx-auto p-4">
<h1 className="text-2xl font-semibold mb-4">Blog Posts</h1>
<ul className="space-y-3">
{posts.map((post) => (
<li key={post.slug}>
<Link href={`/blog/${post.slug}`} className="text-blue-600 hover:underline">
{post.title}
</Link>
</li>
))}
</ul>
</main>
</>
);
}
π Step 8: Dynamic Blog Post Page
// app/blog/[slug]/page.js
import { posts } from "../../../data/posts";
import Navbar from "../../../components/Navbar";
export default function Post({ params }) {
const post = posts.find((p) => p.slug === params.slug);
if (!post) return <p>Post not found!</p>;
return (
<>
<Navbar />
<main className="max-w-5xl mx-auto p-4">
<h1 className="text-2xl font-bold">{post.title}</h1>
<p className="mt-2">{post.content}</p>
</main>
</>
);
}
π Step 9: Deploy on Vercel
Run the following command to deploy your app on Vercel:
npx vercel
Or sign up on https://vercel.com and import your GitHub repo.
π Final Thoughts
This tutorial helped you build a complete blog website using Next.js and Tailwind CSS. You’ve learned about routing, components, and dynamic pages. Now you can expand it with features like markdown blogs, CMS integration, or Firebase.
Happy Coding! π