4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Next.js + MUI v5でGoogleフォントを使用する方法

Posted at

概要

Next.jsでMUIをGoogleフォントを使用する方法の備忘録になります。
CDNからGoogleフォントを追加する方法と、NPMパッケージを追加する方法がありますが
本手順はCDNから追加する方法のみ紹介します。

前提条件

Next環境にMUIをインストールしていること。

使用手順

  1. 使用したいGoogle Fontsを決める。フォントを決めたら、リンクをコピーする。以下はTrain Oneを使用する例になる。

    <link href="https://fonts.googleapis.com/css2?family=Poor+Story&family=Train+One&display=swap" rel="stylesheet">
    
  2. pages/_document.jsを作成し、Headタグの中に、先ほどコピーしたリンクを貼り付ける。Next.jsのpagesコンポーネントはデフォルトでHeadbodyタグを定義してくれる。このデフォルト設定を変更するのに使用するのがpages/_document.jsファイルである。

    pages/_document.js
    import { Html, Head, Main, NextScript } from "next/document";
    
    export default function Document() {
      return (
        <Html>
          <Head>
            <link
              href="https://fonts.googleapis.com/css2?family=Train+One&display=swap"
              rel="stylesheet"
            />
          </Head>
          <body>
            <Main />
            <NextScript />
          </body>
        </Html>
      );
    }
    
  3. pages/_document.jsに、”Trail One”のフォントを使用するよう、ThemeProviderを作成する。以下のコードを実装することによって、ページ全体をTrail Oneフォントにすることができる。

    pages/_document.js
    import { ThemeProvider } from "@emotion/react";
    import { createTheme } from "@mui/material";
    import "../styles/globals.css";
    
    function MyApp({ Component, pageProps }) {
      const theme = createTheme({
        typography: {
          fontFamily: ["Train One", "cursive"].join(","),
        },
      });
      return (
        <ThemeProvider theme={theme}>
          <Component {...pageProps} />
        </ThemeProvider>
      );
    }
    
    export default MyApp;
    

一部のみ適用したい場合

テーマ全体ではなく、一部のコンポーネントのフォントだけ変更したい場合は、sxプロパティやカスタムコンポーネントでフォントを指定すると楽。

pages/index.js
import { Typography } from "@mui/material";
import { styled } from "@mui/system";

export default function Home() {
  const customeMenu = (props) => (
    <Typography {...props} variant="h1">
      {props.children}
    </Typography>
  );
  const H1 = styled(customeMenu)({
    color: "green",
    fontFamily: ["Train One", "cursive"].join(","),
  });

  return (
    <>
      <Typography variant="h1">Welcome to Next.js!</Typography>
      <H1>Custome Component</H1>
      <Typography
        variant="h1"
        color="primary"
        sx={{
          fontFamily: ["Train One", "cursive"].join(","),
        }}
      >
        sx Component
      </Typography>
    </>
  );
}
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?