Using Fonts in Next.js and Tailwind (Google Fonts, Local Fonts, Tailwind CSS)

Next.js 13 introduced new & improved font optimization.
Here's a quick guide on getting up and going.
Google fonts
You import Google fonts straight from next/font.
Then apply the styles to the root element of the app.
// pages/_app.js
import { Roboto_Flex } from 'next/font/google';
// If loading a variable font, you don't need to specify the font weight
const roboto = Roboto_Flex({
// Google Fonts are automatically subset, so for optimization, specify the required subset
subsets: [ 'latin' ],
// weight: [ '400', '700' ],
})
export default function RootLayout({ children }) {
return (
// Apply the styles to the root element
<html lang="en" className={roboto.className}>
<body>{children}</body>
</html>
);
}
One thing to note is if loading a variable font, you don't need to specify the font weight.
Nextjs also recommends using variable fonts for the best performance and flexibility.
Here's a list of Variable fonts on Google fonts: https://fonts.google.com/variablefonts
Local fonts
Import the next/font/local helper and pass the src property the path to your local font file.
// pages/_app.js
import localFont from 'next/font/local';
// Specify the `src` of your local font file (this can be inside your `pages` directory
const customFont = localFont({ src: "./cool-font.woff2" })
export default function RootLayout({ children }) {
return (
// Apply the styles to the root element
<html lang="en" className={customFont.className}>
<body>{children}</body>
</html>
);
}
Tailwind CSS
Tailwind uses a slightly different approach and can be set up in a few ways.
The easiest option is to use a CSS variable.
I'll use the same Roboto font from our initial example below.
But then, instead of applying the font.className, we will use the font.variable.
We then need to update our fontFamily in our tailwind.config.js to keep our fallbacks and update our CSS variable.
Show me the code
// pages/_app.js
import { Roboto_Flex } from 'next/font/google';
const roboto = Roboto_Flex({
subsets: [ 'latin' ],
// Apply the variable name
variable: "--roboto-font",
})
export default function RootLayout({ children }) {
return (
// Apply the font variable and sans fonts
<html lang="en" className={`${roboto.variable} font-sans`}>
<body>{children}</body>
</html>
);
}
Now update our tailwind.config.js:
// tailwind.config.js
const { fontFamily } = require('tailwindcss/defaultTheme')
module.exports = {
content: [
'./pages/**/*.{js,ts,jsx,tsx}',
'./components/**/*.{js,ts,jsx,tsx}',
],
theme: {
extend: {
// Update the fontFamily in your theme 👇
fontFamily: {
sans: ['var(--roboto-font)', ...fontFamily.sans],
},
},
},
plugins: [],
}
Voilà! 🎉
You now customize your Next.js apps to your heart's content.
Follow me on Twitter or connect on LinkedIn.
🚨 Want to make friends and learn from peers? You can join our free web developer community here. 🎉
