Kacper Drzewicz
Kacper Drzewicz
Senior Software Engineer

Layouts in Next.js: How to Structure Your E-commerce Platform the Right Way

Jul 02, 20252 min read

The Next.js 15 application router provides first-class support for layouts, making shared UI patterns seamless, efficient and composable. Here's a deeper dive into how layouts work, their benefits and best practices.

What are Layouts?

  • Layouts are React components that wrap pages or sub-layouts in app/, rendering children properties for nested content
  • The main layout (in app/layout.tsx) is mandatory - it must contain <html>...<body> tags and applies globally.
  • Additional layouts in subdirectories (e.g., app/categories/layout.tsx) only include routes in that segment.

Folder-based hierarchy and nesting

File system routing dictates layout behavior:

app/ layout.tsx ← root layout (all routes) page.tsx ← homepage categories/ layout.tsx ← wraps categories routes page.tsx ← /categories [slug]/ page.tsx ← /categories/[slug] profile/ layout.tsx ← wraps client profile route page.tsx ← /client

Here root layout wraps every page, profile layout wraps only profile routes - nesting children accordingly. Wrapping a folder name in square brackets (e.g. [slug]) creates a dynamic route segment which is used to generate multiple pages from data. (e.g. specific category pages, dedicated product pages, etc.)

Benefits of using Layouts

1. Preservation of state Since layouts persist during navigation, the state of shared components (e.g. sidebars) is not lost, reducing reassembly and improving UX. This makes an ideal place to initialize global contexts. Especially useful when some of the values come from cookies or headers - helping to eliminate prop drilling and improving the maintainability of your codebase.

2. Performance optimization Layouts are server-side components by default and are cached. Client-side navigation keeps layouts live, minimizing re-rendering.

3. Modular UI Structure You can define different layouts for different sections of the application - e.g., category area vs. client profile - by nesting or using route groups.

4. Clean code organization Layouts enforce structure and collocated logic - styling, metadata, additional providers - all in route-specific files.

First steps: Basic concepts

Defining a root layout:

// app/layout.tsx export default function RootLayout({ children }: { children: React.ReactNode }) { return ( <html lang="en"> <body> <Header /> <main>{children}</main> <Footer /> </body> </html> ) }

This defines a globally shared UI and is required.

Adding nested layouts

// app/categories/layout.tsx export default function CategoriesLayout({ children }: { children: React.ReactNode }) { return ( <div className="flex"> <SideNav /> <div className="flex-grow">{children}</div> </div> ) }

Wraps categories/ routes, stacking inside the root layout.

Best practices

  • Main vs. nested: Only main layouts contain <html> and <body> tags. Subordinate layouts wrap inside them without duplicating these tags.
  • Clean structure: Store layout.tsx, page.tsx and relevant UI components together by route segment.
  • Selective nesting: Use nested layouts only where necessary to avoid unnecessary UI on pages.
  • Use of server components: Default layouts are server-side - ideal for retrieving data via parameters or shared UI logic.
  • Route groups: Create clear layout boundaries (e.g., categories/ vs. profile/) to isolate sections - allowing for multiple layouts at the root level if needed.

Summary

Layouts empower you to:

FunctionDescription
Shared UIHeaders, footers, navigations applied globally or segmented
Nested UIsEach route folder can define its own wrap layout
Smooth stateMaintain React state in nav without full reloading
Organized codeUI and logic co-located per route for ease of maintenance

Next steps

  1. Define a global shell in app/layout.tsx.
  2. Add segment-specific layouts if necessary.
  3. Organize code by route directory for modularity.
  4. Use route groups if you separate contexts with different user interfaces.

These patterns make your Next.js application more maintainable, efficient and user-friendly.

Happy building!

RELATED POSTS
Bartłomiej Gałęzowski
Bartłomiej Gałęzowski
Senior Software Engineer

Deploying Next.js on AWS: Why We Migrated from Amplify to ECS

Jul 09, 20255 min read
Article image
Michał Miler
Michał Miler
Senior Software Engineer

NestJS Multi-tenancy API Key Authorization

Jun 25, 202510 min read
Article image
Aleksy Bohdziul
Aleksy Bohdziul
Senior Software Engineer

Speed Up Your Next.js App: Optimizing S3 Images with Cloudflare Images

Jun 18, 20254 min read
Article image