Nextの続きです。前回はNextスターターキットのコンポーネント&モジュールについてまとめました。今回は最終回、ページファイル編になります。Next.jsの複数ページ設定(/pages
フォルダ)を使った内容になります。それではいきましょう!
【目次】
※参考:前回記事
【React】Nextスターターキットを作った-2. コンポーネント編(Next + TypeScript + CSS in JS) - クモのようにコツコツと
※参考:ReactでWebアプリを作るシリーズまとめ
qiita.com
前回のおさらい
Nextスターターキットで作ったコンポーネントやモジュールをまとめた。async/awaitのエラーハンドリングなども。
※参考:前回記事
【React】Nextスターターキットを作った-2. コンポーネント編(Next + TypeScript + CSS in JS) - クモのようにコツコツと
今回は各ページのファイルについてまとめる。Next.jsの/pages
フォルダの中に作っていく。
作ったもの
ソースコード
※参考:GitHub - ryo-i/next-app-started
プレビュー
※参考:Nextアプリスターターキット
トップページ
/pages/index.tsx
に当たる部分
next-app-started.vercel.app
トップページ固有のOGPも表示される!
Aboutページ
/pages/about.tsx
に当たる部分
※参考:next-app-started.vercel.app
Aboutページ固有のOGPも表示される!
404ページ
/pages/404.tsx
に当たる部分。存在しないURLを開くと表示される。
※参考:https://next-app-started.vercel.app/abc123456
トップページ
/pages
フォルダにindex.tsx
を追加。
Head
、Header
、Inner
、Footer
コンポーネントをインポート
import Head from 'next/head'; import Header from '../components/Header'; import Inner from '../components/Inner'; import Footer from '../components/Footer';
Head
はNext.jsが用意しているheadタグをカスタマイズするコンポーネント
※参考:【React】Next.jsのリンク設定(Link)、共通コンポーネント化、headタグ設定(Head) - クモのようにコツコツと
Header
、Inner
、Footer
は前回作成したコンポーネント(Inner
はトップページ固有)
※参考:【React】Nextスターターキットを作った-2. コンポーネント編(Next + TypeScript + CSS in JS) - クモのようにコツコツと
次にトップページのテキスト設定
変数Data
でdata.json
を取得
import Data from '../data/data.json';
変数headerTitle
、headerText
、pageTitle
、pageText
でテキスト設定
const headerTitle = Data.header.title; const headerText = Data.header.text; const pageTitle = Data.main.title; const pageText = Data.main.text;
Home
コンポーネント作成
function Home() { return ( <> <Head> <title>{ headerTitle }</title> <meta name="description" content={ headerText } /> <meta property="og:title" content={ headerTitle } /> <meta property="og:description" content={ headerText } /> </Head> <Header /> <main> <h1>{ pageTitle }</h1> <p dangerouslySetInnerHTML={{ __html: pageText }}></p> <Inner /> </main> <Footer /> </> ) }
Head
コンポーネントでheadタグ設定
titleタグ&og:title
でheaderTitle
を読み込む
description
&og:description
でheaderText
を読み込むHeader
コンポーネントを読み込み- mainタグの設定
h1タグでpageTitle
、pタグでpageText
を読み込む
Inner
コンポーネントを読み込む Footer
コンポーネントを読み込む
最後にHome
をエクスポート
export default Home;
これでトップページが表示される!
※参考:Nextアプリスターターキット
Aboutページ
/pages
フォルダにabout.tsx
を追加。
Head
、Header
、Profile
、Footer
コンポーネントをインポート
import Head from 'next/head'; import Header from '../components/Header'; import Profile from '../components/Profile'; import Footer from '../components/Footer';
Profile
は前回作成したコンポーネントで、Aboutページ固有の内容
※参考:【React】Nextスターターキットを作った-2. コンポーネント編(Next + TypeScript + CSS in JS) - クモのようにコツコツと
次にAboutページのテキスト設定
変数Data
でdata.json
を取得
import Data from '../data/data.json';
変数headerTitle
、pageTitle
、pageText
、headTitle
でテキスト設定
const headerTitle = Data.header.title; const pageTitle = 'このアプリについて'; const pageText = 'アプリの概要をここに書く。'; const headTitle = pageTitle + ' | ' + headerTitle;
pageTitle
とpageText
はベタガキ、headTitle
はpageTitle
とheaderTitle
の組み合わせ
About
コンポーネント作成
// Component function About() { return ( <> <Head> <title>{ headTitle }</title> <meta name="description" content={ pageText } /> <meta property="og:title" content={ headTitle } /> <meta property="og:description" content={ pageText } /> </Head> <Header /> <main> <h1>{ pageTitle }</h1> <p dangerouslySetInnerHTML={{ __html: pageText }}></p> <section> <h2>使い方</h2> <p>アプリの説明説明説明説明説明説明説明説明</p> </section> <Profile /> </main> <Footer /> </> ); }
- トップページと違いsectionタグの中がベタガキ
- トップページと違い
Profile
コンポーネントを読み込んでいる
最後にAbout
コンポーネントをエクスポート
export default About;
これでAboutページが表示される!
※参考:このアプリについて | Nextアプリスターターキット
404ページ
もう一つ、404ページも作成した。
Next.jsでは/pages
に存在しないURLを開くとデフォルトで用意された404ページが表示される。
この404ページをカスタマイズするには/pages
に404.tsx
を追加すればいいようだ。
※参考:Advanced Features: エラーページのカスタマイズ | Next.js
これまで作ったトップページ、Aboutページと同じ構成の404ページを作ってみた。
Head
、Link
、Header
、Profile
、Footer
コンポーネントをインポート
import Head from 'next/head'; import Link from 'next/link'; import Header from '../components/Header'; import Profile from '../components/Profile'; import Footer from '../components/Footer';
Aboutページで表示したProfile
をここでも表示することにする。
404ページのテキスト設定
変数Data
でdata.json
を取得
import Data from '../data/data.json';
変数headerTitle
、pageTitle
、pageText
、headTitle
でテキスト設定
const headerTitle = Data.header.title; const pageTitle = '404ページ'; const pageText = 'お探しのページは見つかりませんでした。'; const headTitle = pageTitle + ' | ' + headerTitle;
Aboutページと同じくpageTitle
、pageText
はベタガキ
notFound
コンポーネント作成
// Component function notFound() { return ( <> <Head> <title>{ headTitle }</title> <meta name="description" content={ pageText } /> <meta property="og:title" content={ headTitle } /> <meta property="og:description" content={ pageText } /> </Head> <Header /> <main> <h1>{ pageTitle }</h1> <p dangerouslySetInnerHTML={{ __html: pageText }}></p> <section> <h2>Homeに戻る</h2> <p>こちらからお戻りください→ <Link href="/"><a>Home</a></Link></p> </section> <Profile /> </main> <Footer /> </> ); }
- Aboutページと同じくsectionタグの中がベタガキ
- pタグの中でNext.jsの
Link
でトップページへのリンクを設定 - Aboutページと同じく
Profile
コンポーネントを読み込んでいる
最後にnotFound
コンポーネントをエクスポート
export default notFound;
これで存在しないURLを開くと404ページ が表示される!
※参考:https://next-app-started.vercel.app/abc123456
最後に
ということでReactスターターキットをNext.jsで作り替えてNextスターターキットが完成しました!
今回の経験で得られた知見
- コンポーネントの作り方、使い方はNext.jsとReactは違いを感じない
- ReactのSPAではreact-routerやhelmet使ってた実現していた複数ページ構成がNext.jsでは最初から用意されている
- SPAではheadタグがブラウザ側で動的に変更されるために悩み所だったOGP設定の問題がNext.jsで解決した!
ということでReactアプリとNextアプリではアプリの主要構成に本質的な違いはなく、SPAで苦心した周辺要素(ルーティングやOGP)はNext.jsの方が楽に感じました。
※参考:【React】OGPはつらいよ ーSPAでの動的OGP・失敗編ー(Reactアプリスターターキット) - クモのようにコツコツと
今後もこのNext.js + TypeScript + CSS in JS環境でWebアプリを作っていきたく思います♪
CSSに関してはNext.jsはCSS Modules推しのようで、またTailwind CSSを公式サポートする流れもあるようです。
※参考:Next.js が CSS Modules を推奨する真相に迫りたい
個人的にはReactのCSS設定はいろいろ試した上でStyled-componentsが一番使いやすく感じています。
※参考:ReactのCSS設定方法について調べたこと(className属性、style属性、CSS Modules、CSS in JS、CSSフレームワーク) - クモのようにコツコツと
今後もReact 、Next.js、フロントエンド界隈の動向の様子を見つつ本スターターキットをブラッシュアップしていきます。それではまた!
※参考:ReactでWebアプリを作るシリーズまとめ
qiita.com