Next.js(PageRouter)の_app.tsxでグローバルスタイルを適用する方法。Emotionも使います!
前置き
入社3ヶ月目の駆け出しフロントエンドエンジニアによる備忘録です。
今回は、$ create-next-app
で作成した Next.js の PageRouter についての記事となります。
◎ 今回やりたいこと
- 自前で用意した
reset.css
を一発で全ページに反映させたい。 -
next/font/google
でインポートしたNoto Sans JP
を一発でグローバルスタイルに適用したい。
◎ 使用環境と技術
項目 | 選択した技術 | バージョン |
---|---|---|
フレームワーク | Next.js | 14.1.3 |
言語 | TypeScript | ^5 |
スタイリング | Emotion | 11.11.4 |
◎ さっそくやってみよう
reset.css を一発で全ページに反映させる
まずは、reset.css
を /src/styles/reset.css
という構造で配置します。
次に _app.tsx
の先頭部分に下記のコードを追加し、reset.css
をインポートします。
import "@/styles/reset.css";
これで reset.css
をプロジェクト全体のグローバルスタイルとして適用できました。
思ったより簡単でした。
Noto Sans JP を一発でグローバルスタイルに適用する
まずは Noto Sans JP
をインポートしていきます。
_app.tsx
の先頭に下記のコードを追加して下さい。
import { Noto_Sans_JP } from 'next/font/google';
この行では、Next.js の機能を使って Google Fonts から Noto Sans JP
という日本語フォントをインポートしています。 next/font/google
は Next.js が提供する Google Fonts を扱うためのモジュールです。
次にインポートした Noto_Sans_JP
関数を実行し、その設定を行っていきます。
const notoSansJP = Noto_Sans_JP({
subsets: ['latin']
});
フォントの設定を変更したい場合は、この Noto_Sans_JP
関数の引数を変更して下さい。
続いて Emotion を _app.tsx
にインポートします。
まず _app.tsx
の先頭部分に下記のコードを追加して下さい。
// ---- Emotion ----
/** @jsxImportSource @emotion/react */
import { css, Global } from '@emotion/react';
次に _app.tsx
の中にある APP
コンポーネントに、先程 Emotion で導入した Grobal
コンポーネントを追加して下さい。そこに同じく Emotion の機能を使って notoSansJP
を埋め込みます。
export default function App({ Component, pageProps }: AppProps) {
return (
<>
{/* Globalコンポーネントでは、cssではなくstylesを使用する必要がある */}
+ <Global
+ styles={css`
+ body {
+ font-family: ${notoSansJP.style.fontFamily};
+ }
+ `}
+ />
<Component {...pageProps} />
</>
);
}
これで Next.js プロジェクト全体に Noto Sans JP
を導入することができました!
◎ 完成後のファイル
import type { AppProps } from 'next/app';
// --- resetCSS ---
import '@/styles/reset.css';
// ---- Emotion ----
/** @jsxImportSource @emotion/react */
import { css, Global } from '@emotion/react';
// ---- Googleフォント ----
import { Noto_Sans_JP } from 'next/font/google';
const notoSansJP = Noto_Sans_JP({
subsets: ['latin'],
});
export default function App({ Component, pageProps }: AppProps) {
return (
<>
<Global
styles={css`
body {
font-family: ${notoSansJP.style.fontFamily};
}
`}
/>
<Component {...pageProps} />
</>
);
}
参考
バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。
Discussion