_app.tsx
の設定: Next.js と Material-UI の連携
_app.tsx とは
Next.js アプリケーションの_app.tsx
ファイルは全ページ共通の設定をする場所です。デフォルトの_app.tsx
ファイルは以下のようになっています。
import "@/styles/globals.css";
import type { AppProps } from "next/app";
export default function App({ Component, pageProps }: AppProps) {
return <Component {...pageProps} />;
}
-
import '@/styles/globals.css'
これはグローバル CSS ファイルをインポートしています。この CSS は全ページに適用されます。ただし、Material-UI を使用する場合は、Material-UI が持つ CSS-in-JS の解決策を使用しますので、この行は削除します。 -
import type { AppProps } from 'next/app'
これは Next.js のAppProps
という型をインポートしています。この型はApp
コンポーネントの引数の型として使用されます。AppProps
にはComponent
とpageProps
の二つのプロパティが含まれており、それぞれ現在のページの実際のコンポーネントとそのプロパティを表しています。 -
export default function App({ Component, pageProps }: AppProps) { ... }
これがメインのApp
コンポーネントです。全てのページはこのApp
コンポーネントを通じてレンダリングされます。Component
とpageProps
を引数として受け取り、Component
をレンダリングします。pageProps
はComponent
に渡されます。
それでは、上記のデフォルト設定を Material-UI と一緒に使えるように変更しましょう。以下のコードが変更後の_app.tsx
です。
import { AppProps } from "next/app";
import { CssBaseline } from "@mui/material";
import { ThemeProvider, createTheme } from "@mui/material/styles";
const theme = createTheme();
function MyApp({ Component, pageProps }: AppProps) {
return (
<ThemeProvider theme={theme}>
<CssBaseline />
<Component {...pageProps} />
</ThemeProvider>
);
}
export default MyApp;
-
import type { AppProps } from 'next/app'
Next.js からAppProps
型をインポートします。import type
を使用することで、AppProps
が型情報であることを明示的に示します。この型はMyApp
コンポーネントの引数の型として使用されます。 -
import { CssBaseline } from '@mui/material'
Material-UI のCssBaseline
をインポートします。これはブラウザ間で一貫した見え方を提供するために、HTML の要素に対するデフォルトスタイルをリセットします。 -
import { ThemeProvider, createTheme } from '@mui/material/styles'
Material-UI のThemeProvider
とcreateTheme
をインポートします。ThemeProvider
は Material-UI のテーマをコンポーネントのツリーに提供します。createTheme
はデフォルトのテーマを作成する関数です。 -
const theme = createTheme()
createTheme
関数を呼び出してデフォルトのテーマを作成し、theme
変数に保存します。 -
function MyApp({ Component, pageProps }: AppProps) { ... }
メインのMyApp
コンポーネントです。全てのページはこのMyApp
コンポーネントを通じてレンダリングされます。 -
return ( ... )
MyApp
コンポーネントのレンダリング部分です。ThemeProvider
を最外層として、CssBaseline
とComponent
を子要素として持ちます。
これで、全てのページに Material-UI のテーマとスタイルリセット(CssBaseline
)が適用されます。
感想
今日は_app.tsxファイルの設定を行いました
JAVAScriptやReactの知識がなく今何をしているかが全く分からない状態からのスタートだったのでchatGPTにひとつひとつ質問しながら進めていきました。
このファイルで何を設定しているか分かってよかったです。