The skeleton of every application is routing. This page will introduce you to the fundamental concepts of routing for the web and how to handle routing in Next.js.
First, you will see these terms being used throughout the documentation. Here's a quick reference:
- Tree: A convention for visualizing a hierarchical structure. For example, a component tree with parent and children components, a folder structure, etc.
- Subtree: Part of a tree, starting at a new root (first) and ending at the leaves (last).
- Root: The first node in a tree or subtree, such as a root layout.
- Leaf: Nodes in a subtree that have no children, such as the last segment in a URL path.
- URL Segment: Part of the URL path delimited by slashes.
- URL Path: Part of the URL that comes after the domain (composed of segments).
In version 13, Next.js introduced a new App Router built on React Server Components, which supports shared layouts, nested routing, loading states, error handling, and more.
The App Router works in a new directory named
app directory works alongside the
pages directory to allow for incremental adoption. This allows you to opt some routes of your application into the new behavior while keeping other routes in the
pages directory for previous behavior. If your application uses the
pages directory, please also see the Pages Router documentation.
Good to know: The App Router takes priority over the Pages Router. Routes across directories should not resolve to the same URL path and will cause a build-time error to prevent a conflict.
By default, components inside
app are React Server Components. This is a performance optimization and allows you to easily adopt them, and you can also use Client Components.
Recommendation: Check out the Server and Client Components page if you're new to Server Components.
Roles of Folders and Files
Next.js uses a file-system based router where:
- Folders are used to define routes. A route is a single path of nested folders, following the file-system hierarchy from the root folder down to a final leaf folder that includes a
page.jsfile. See Defining Routes.
- Files are used to create UI that is shown for a route segment. See special files.
Each folder in a route represents a route segment. Each route segment is mapped to a corresponding segment in a URL path.
To create a nested route, you can nest folders inside each other. For example, you can add a new
/dashboard/settings route by nesting two new folders in the
/dashboard/settings route is composed of three segments:
Next.js provides a set of special files to create UI with specific behavior in nested routes:
|Shared UI for a segment and its children|
|Unique UI of a route and make routes publicly accessible|
|Loading UI for a segment and its children|
|Not found UI for a segment and its children|
|Error UI for a segment and its children|
|Global Error UI|
|Server-side API endpoint|
|Specialized re-rendered Layout UI|
|Fallback UI for Parallel Routes|
Good to know:
.tsxfile extensions can be used for special files.
The React components defined in special files of a route segment are rendered in a specific hierarchy:
error.js(React error boundary)
loading.js(React suspense boundary)
not-found.js(React error boundary)
In a nested route, the components of a segment will be nested inside the components of its parent segment.
In addition to special files, you have the option to colocate your own files (e.g. components, styles, tests etc) inside folders in the
This is because while folders define routes, only the contents returned by
route.js are publically addressable.
Learn more about Project Organization and Colocation.
Server-Centric Routing with Client-side Navigation
pages directory which uses client-side routing, the App Router uses server-centric routing to align with Server Components and data fetching on the server. With server-centric routing, the client does not have to download a route map and the same request for Server Components can be used to look up routes. This optimization is useful for all applications, but has a larger impact on applications with many routes.
Although routing is server-centric, the router uses client-side navigation with the Link Component - resembling the behavior of a Single-Page Application. This means when a user navigates to a new route, the browser will not reload the page. Instead, the URL will be updated and Next.js will only render the segments that change.
Additionally, as users navigate around the app, the router will store the result of the React Server Component payload in an in-memory client-side cache. The cache is split by route segments which allows invalidation at any level and ensures consistency across React's concurrent renders. This means that for certain cases, the cache of a previously fetched segment can be re-used, further improving performance.
Learn more about Linking and Navigating.
When navigating between sibling routes (e.g.
/dashboard/analytics below), Next.js will only fetch and render the layouts and pages in routes that change. It will not re-fetch or re-render anything above the segments in the subtree. This means that in routes that share a layout, the layout will be preserved when a user navigates between sibling pages.
Without partial rendering, each navigation would cause the full page to re-render on the server. Rendering only the segment that’s updating reduces the amount of data transferred and execution time, leading to improved performance.
Advanced Routing Patterns
The App Router also provides a set conventions to help you implement more advanced routing patterns. These include:
- Parallel Routes: Allow you to simultaneously show two or more pages in the same view that can be navigated independently. You can use them for split views that have their own sub-navigation. E.g. Dashboards.
- Intercepting Routes: Allow you to intercept a route and show it in the context of another route. You can use these when keeping the context for the current page is important. E.g. Seeing all tasks while editing one task or expanding a photo in a feed.
These patterns allow you to build richer and more complex UIs, democratizing features that were historically complex for small teams and individual developers to implement.
Now that you understand the fundamentals of routing in Next.js, follow the links below to create your first routes: