Understanding File-Based Routing in Next.js

@rnab
3 min readFeb 11, 2025

--

Next.js, a popular React framework, is designed to simplify the development of React applications by offering features like server-side rendering, static site generation, and, notably, file-based routing. In this article, we will delve into the basics of file-based routing in Next.js, understand how it works, and see examples to help you implement it in your projects using TypeScript.

What is File-Based Routing?

In traditional web development, one typically defines routes in a centralized configuration file. However, Next.js simplifies routing by enabling file-based routing, where the file and directory structure within the pages directory dictate the application's routes. This approach leverages the filesystem itself as the primary source of truth for routing.

How File-Based Routing Works in Next.js

When you create a Next.js application, it automatically sets up a pages directory at the root of your project. This directory is reserved for defining your application's routes.

Here’s how it generally works:

  • Each .tsx file inside the pages directory automatically becomes a route.
  • Nested directories inside pages correspond to route segments.
  • Special files and folders like _app.tsx, _document.tsx, and api can be used for advanced functions.
  • Dynamic routes can be created using file naming conventions with square brackets [param].

Example: Basic Routes

Let’s understand this with some examples. Suppose you have a following file structure in your pages directory:

pages/
├─ index.tsx
├─ about.tsx
├─ blog/
├─ index.tsx
├─ [slug].tsx
  • index.tsx maps to the root route /.
  • about.tsx maps to the /about route.
  • blog/index.tsx maps to the /blog route.
  • blog/[slug].tsx is a dynamic route, mapping to /blog/some-slug, where some-slug is a dynamic segment.

Example: Creating a Simple Page

To create a simple static page like about.tsx, your file might look like this:

// pages/about.tsx
import React from 'react';

const About: React.FC = () => {
return (
<div>
<h1>About Us</h1>
<p>This is the about page.</p>
</div>
);
};

export default About;

When you navigate to /about in your browser, Next.js will serve this component.

Dynamic Routing

Dynamic routing is extremely powerful and allows you to handle routes based on dynamic parameters. For instance, in a blog, each post might be accessed via /blog/post-title. This can be achieved using dynamic routes in Next.js.

Create a new file named [slug].tsx inside the blog directory for this purpose:

// pages/blog/[slug].tsx
import { useRouter } from 'next/router';
import React from 'react';

const BlogPost: React.FC = () => {
const router = useRouter();
const { slug } = router.query;

return (
<div>
<h1>Blog Post</h1>
<p>Slug: {slug}</p>
</div>
);
};

export default BlogPost;

In this example, when you visit /blog/my-first-post, Next.js will render the BlogPost component with the slug value of my-first-post.

API Routes

Next.js also allows you to define API routes in the pages/api directory. These files define serverless functions that can be called directly in your application.

For example, creating pages/api/hello.ts:

// pages/api/hello.ts
import { NextApiRequest, NextApiResponse } from 'next';

export default function handler(req: NextApiRequest, res: NextApiResponse) {
res.status(200).json({ message: 'Hello from API' });
}

When you visit /api/hello, the server will respond with JSON { message: 'Hello from API' }.

Advantages of File-Based Routing

  • Simplicity: No need to maintain a separate routing configuration file.
  • Organization: The directory structure provides a clear overview of available routes.
  • Scalability: Easily add new pages or features by creating new files or folders.

Conclusion

File-based routing is one of the many features that make Next.js an attractive choice for building modern web applications. By relying on the filesystem to handle routing, Next.js offers simplicity and flexibility, reducing boilerplate and making it easier to reason about the structure of your application. By leveraging TypeScript and Next.js together, developers can take advantage of both strong typing and ergonomic routing for building scalable and maintainable applications.

As you continue developing with Next.js, familiarize yourself with its powerful routing capabilities — it’s a major component in optimizing your workflow and delivering a polished, high-quality application. Happy coding!

--

--

@rnab
@rnab

Written by @rnab

Typescript, Devops, Kubernetes, AWS, AI/ML, Algo Trading

No responses yet