Understanding File‑System Routing in Next.js

Hero image for Understanding File‑System Routing in Next.js. Image by Krakograff Textures.
Hero image for 'Understanding File‑System Routing in Next.js.' Image by Krakograff Textures.

One of the reasons Next.js felt so refreshing when it arrived was that it removed a surprising amount of routing ceremony.

In many React setups, getting routing working meant pulling in a router library, defining route configuration, wiring components to paths, and keeping all of that in sync as the application grew. None of that was impossible, but it was another layer of work before the actual product even started feeling like a product.

Next.js took a different approach. Instead of treating routes as configuration first, it treated routes as files.

That is the basic idea behind filesystem routing.

The nice thing about filesystem routing is that it scales further than people sometimes assume. On the Nando’s UK & Ireland Replatform, that convention helped keep a large Next.js codebase legible without turning routing into yet another config problem.


Routes come from the pages directory

In a traditional Next.js Pages Router application, every file inside pages becomes a route.

For example:

pages/  index.tsx  about.tsx  contact.tsx

creates:

  • /
  • /about
  • /contact

That mapping is direct enough that you can often understand a large part of an application's route structure simply by looking at the folder tree.


index files represent the root of a directory

This is the first small rule worth remembering.

pages/index.tsx maps to /.

If we create:

pages/blog/index.tsx

that maps to /blog.

So index means "the route for this directory itself", rather than adding /index to the URL.

This makes nested site sections feel natural to organise.


Nested Folders Create Nested URLs

Suppose the project grows:

pages/  index.tsx  blog/    index.tsx    first-post.tsx

Now the routes are:

  • /
  • /blog
  • /blog/firstpost

This is where the system starts paying off. The route structure and the file structure reinforce each other, which usually makes both easier to reason about.

The moment filebased routing clicks, the next thing to look at is Dynamic Routes in Next.js, because that is where the simple model starts doing real work.


That Clarity Matters More than It First Appears

Routing problems are often not caused by the router being technically incapable. They are caused by the route structure being hard to see.

When a project has:

  • route definitions in one file
  • page components somewhere else
  • navigation links somewhere else again

the mental cost of change rises quickly.

Filesystem routing reduces that cost by making the route tree more visible. It does not solve every routing concern, but it removes a surprising amount of indirection.


Each Page File Exports the Component for That Route

A minimal page looks like this:

const AboutPage = (): JSX.Element => {  return <h1>About</h1>;};export default AboutPage;

There is no separate registration step. The file location already does that job.

That is one of the reasons a new Next.js project can start feeling productive very quickly. Adding a page often means simply creating a file in the right place.


This Works Especially Well for Content‑Led Sites

For websites with a fairly clear page hierarchy, filesystem routing feels very natural:

  • home page
  • about page
  • contact page
  • services section
  • blog section

The folder structure can mirror the site structure directly. That makes the codebase easier to browse, especially for developers joining the project later.


The pages directory is not just about tidy URLs

It also helps establish an architectural boundary.

Files in pages are route entry points. They are not just ordinary components. They define what the user can navigate to directly.

That distinction encourages a useful separation between:

  • pagelevel route files
  • reusable UI components
  • shared utilities

When a codebase respects that boundary, it tends to stay easier to navigate.


It is Still Possible to Overcomplicate the Structure

Filesystem routing is simpler than many alternatives, but simplicity at the feature level does not prevent poor organisation.

For example, deeply nested folders can still become awkward if the product structure itself is awkward. Likewise, stuffing too much implementation detail directly into page files can make the route layer heavy and repetitive.

The routing model helps, but it does not replace sensible project structure.


Next.js Routing Removed the "Define It Twice" Problem

Before filebased routing, there was often a mild duplication problem:

  • create a component
  • create a route definition
  • link them together

Next.js reduces that to one act:

  • create the page file

That may sound modest, but removing repeated setup work is often what makes a framework feel fast and pleasant rather than merely capable.


A Small Example of Growth

Imagine a company site expanding from three pages to a small article section:

pages/  index.tsx  services.tsx  contact.tsx  articles/    index.tsx    accessibility-basics.tsx    seo-tips.tsx

The site structure is obvious immediately.

That is not just a convenience for the developer writing the code. It also helps code reviewers, future maintainers, and anyone trying to trace how the application is organised.


The Routing Model Encourages Convention Over Configuration

That phrase can sound a bit grand, but here it really just means:

If you follow the file placement rules, the framework can do the rest without asking for extra route wiring.

That is why Next.js filesystem routing feels less like a library feature and more like a project convention that happens to be enforced by the framework.


This Simplicity is One Reason Next.js Scaled Well in Teams

Conventions are valuable when several developers are adding pages regularly.

If everyone knows that a route is created by adding the appropriate file under pages, there is less time spent asking:

  • where route configuration lives
  • how this page should be registered
  • which central file needs updating

Predictability is an underrated productivity feature.


It is Not Magic, It is Just a Strong Default

That is perhaps the best way to think about it.

Next.js filesystem routing is not clever because it does something impossibly advanced. It is clever because it takes a common need and gives it a convention strong enough that most projects do not need to debate it from scratch.

For many websites and applications, that is exactly the right level of framework help.


Structure Does the Routing Work

Routing becomes easier to manage when the route structure is visible and conventional rather than hidden in configuration. Next.js filesystem routing does precisely that. It turns adding a page into an ordinary file operation and makes the site's structure legible from the repository itself.

That is why the feature resonated so strongly. It did not just create routes. It removed friction around thinking about them.


Categories:

  1. Development
  2. Front‑End Development
  3. Guides
  4. JavaScript
  5. Next.js