How to use Material-UI with Next.js ?
Last Updated :
26 Jul, 2024
Integrating Material-UI (now known as MUI) with Next.js allows you to build modern, responsive user interfaces with a comprehensive set of React components. In this article, we will learn some additional necessary steps to be performed to integrate Material-UI with the Next.js project.
Prerequisites:
Approach
To use the Material-UI with Next.js we have to wrap the complete app with the ThemeProvider for consistent theming, using Material-UI components in your pages, and ensuring server-side rendering support with Emotion’s styling solutions for optimized performance and consistent styling.
First Let's start by creating a Next.js project.
Steps to Integrate Material UI with Next.js
Step 1: Initialize a nwe Next.js project using the following command:
npx create-next-app gfg-next-mui
Step 2: Move to the Project directory
cd gfg-next-mui
Step 3: Install Material-UI
To install the dependencies and save them in your package.json file, run:
npm install @mui/material @emotion/react @emotion/styled @emotion/server
Project Structure:
It will look like this.

The updated dependencies in the package.json file are:
"dependencies": {
"@emotion/react": "^11.13.0",
"@emotion/server": "^11.11.0",
"@emotion/styled": "^11.13.0",
"@mui/material": "^5.16.5",
"next": "14.2.4",
"react": "^18",
"react-dom": "^18"
}
Step 4: Modify the _document.js file. Configure the next app for server-side rendering using the Material UI and emotion library.
JavaScript
// pages/_document.js
import * as React from 'react';
import Document, { Html, Head, Main, NextScript } from 'next/document';
import createEmotionServer from '@emotion/server/create-instance';
import theme from '../src/theme';
import createEmotionCache from '../src/createEmotionCache';
export default class MyDocument extends Document {
render() {
return (
<Html lang="en">
<Head>
{/* PWA primary color */}
<meta name="theme-color"
content={theme.palette.primary.main} />
<link rel="shortcut icon"
href="/static/favicon.ico" />
<link
rel="stylesheet"
href=
"https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
/>
{/* Inject MUI styles first to match with the prepend: true configuration. */}
{this.props.emotionStyleTags}
</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
);
}
}
// `getInitialProps` belongs to `_document` (instead of `_app`),
// it's compatible with static-site generation (SSG).
MyDocument.getInitialProps = async (ctx) => {
const originalRenderPage = ctx.renderPage;
// You can consider sharing the same emotion cache between
// all the SSR requests to speed up performance.
// However, be aware that it can have global side effects.
const cache = createEmotionCache();
const { extractCriticalToChunks } = createEmotionServer(cache);
ctx.renderPage = () =>
originalRenderPage({
enhanceApp: (App) =>
function EnhanceApp(props) {
return <App emotionCache={cache} {...props} />;
},
});
const initialProps = await Document.getInitialProps(ctx);
// This is important. It prevents emotion to render invalid HTML.
// See
// https://github.com/mui-org/material-ui/issues/26561#issuecomment-855286153
const emotionStyles = extractCriticalToChunks(initialProps.html);
const emotionStyleTags = emotionStyles.styles.map((style) => (
<style
data-emotion={`${style.key} ${style.ids.join(' ')}`}
key={style.key}
// eslint-disable-next-line react/no-danger
dangerouslySetInnerHTML={{ __html: style.css }}
/>
));
return {
...initialProps,
emotionStyleTags,
};
};
Step 5: Define Material-UI theme with custom primary, secondary, and error colors using createTheme
from @mui/material/styles
.
Create an src folder, add theme.js and createEmotionCache.js files as below
JavaScript
// Filename - src/theme.js
import { createTheme } from "@mui/material/styles";
import { red } from "@mui/material/colors";
// Create a theme instance.
const theme = createTheme({
palette: {
primary: {
main: "#556cd6",
},
secondary: {
main: "#19857b",
},
error: {
main: red.A400,
},
},
});
export default theme;
JavaScript
// Filename - src/createEmotionCache.js
import createCache from '@emotion/cache';
export default function createEmotionCache() {
return createCache({ key: 'css', prepend: true });
}
Step 5: Update the file /pages/_app.js with the below code
JavaScript
// Filename - pages/_app.js
import * as React from "react";
import PropTypes from "prop-types";
import Head from "next/head";
import { ThemeProvider } from "@mui/material/styles";
import CssBaseline from "@mui/material/CssBaseline";
import { CacheProvider } from "@emotion/react";
import theme from "../src/theme";
import createEmotionCache from "../src/createEmotionCache";
// Client-side cache shared for the whole session
// of the user in the browser.
const clientSideEmotionCache = createEmotionCache();
export default function MyApp(props) {
const { Component,
emotionCache = clientSideEmotionCache,
pageProps } = props;
return (
<CacheProvider value={emotionCache}>
<Head>
<meta
name="viewport"
content="initial-scale=1,
width=device-width" />
</Head>
<ThemeProvider theme={theme}>
{/* CssBaseline kickstart an elegant,
consistent, and simple baseline to
build upon. */}
<CssBaseline />
<Component {...pageProps} />
</ThemeProvider>
</CacheProvider>
);
}
MyApp.propTypes = {
Component: PropTypes.elementType.isRequired,
emotionCache: PropTypes.object,
pageProps: PropTypes.object.isRequired,
};
Step 6: Update the Home Component in /pages/index.js with the below code.
JavaScript
// pages/inde.js
import Head from "next/head";
import styles from "../styles/Home.module.css";
export default function Home() {
return (
<div className={styles.container}>
<Head>
<title>Create Next App</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<main className={styles.main}>
<h1 className={styles.title}>
Welcome to <a href="https://nextjs.org">
Next.js!</a> integrated with{" "}
<a href="https://mui.com/">Material-UI!</a>
</h1>
<p className={styles.description}>
Get started by editing{" "}
<code className={styles.code}>
pages/index.js</code>
</p>
</main>
</div>
);
}
Steps to run the application: To run the app, type the following command in the terminal.
npm run dev
Output:
Similar Reads
How to use Select Component in Material UI ?
Select components are used for collecting user-provided information from a list of options. Material UI for React has this component available for us and it is very easy to integrate. We can use the Select Component in ReactJS using the following approach:Creating React Application And Installing Mo
2 min read
How to use Bootstrap with NextJS?
Next.js is an open-source web development framework based on React and has gained significant popularity due to its amazing features. It is developed by Vercel and Next.js stands out for its robust capabilities, including server-side rendering(SSR) and enhanced search engine optimization (SEO). Next
3 min read
E-Medical Store using Next JS
The project is an e-medical store application built using React with NextJS. It allows users to browse medical products, add them to the cart, and perform filtering and sorting based on price and product type. Preview of final output: Let us have a look at how the final application will look like. E
6 min read
How to use Slider Component in Material UI ?
Sliders allow users to make selections from a range of values. Material UI for React has this component available for us and it is very easy to integrate. We can use the Slider Component in ReactJS using the following approach:Creating React Application And Installing Module:Step 1: Create a React a
2 min read
Material UI List using React.js
Lists are a continuous group of text or images. They are composed of items containing primary and supplemental actions, which are represented by icons and text. Material UI for React has this component available for us, and it is very easy to integrate. We can use the List Component in ReactJS using
5 min read
How to Create a Navigation Bar with Material-UI ?
The Navigation Bar Material UI component provides an efficient way to navigate through web application pages. React utilizes material UI NavBar for responsive and flexible navigation that is easy to implement and also provides animated transitions. ApproachTo create responsive top Navigation Bar Mat
3 min read
How to Add Themes in Material UI ?
In Material UI, themes allow easy customization of design elements like colors and typography in React apps. The MuiThemeProvider component applies these themes across the app, ensuring consistent visuals. Installationnpm install @mui/material @emotion/react @emotion/styledThe table below illustrate
1 min read
How to use Box Component in Material UI ?
The Material UI Box component serves as a wrapper component for most of the CSS utility needs. Material UI for React has this component available for us and it is very easy to integrate. We can use the Box component in ReactJS using the following ways. Prerequisites to use MUI Box ComponentReact JSR
2 min read
How to use Tailwind CSS with Next.js Image ?
Integrating Tailwind CSS with Next.js enables you to style your application efficiently using utility-first CSS. When combined with the Next.js Image component, you can create responsive and optimized images with ease and consistency. In this article, we will learn how to use Tailwind CSS with Next.
3 min read
How to use Fab Component in Material UI ?
Fab stands for Floating Action Button is which appears in front of all screen content, typically as a circular shape with an icon in its center. Material UI for React has this component available for us and it is very easy to integrate. It can be used to turn an option on or off. We can use the Fab
2 min read