はじめに
Next.jsで認証の仕組みを作っていくチュートリアルの具体的な作業[第二回]となります。
この記事では、Next.js と Tailwind CSS 、そして shadcn を使用して、アカウント登録画面の実装方法を解説します。これらの技術を組み合わせて、モダンで使いやすいフォームデザインを作成し、実際のアプリケーションに即した実装方法を学んでいきます。最初にカードコンポーネントを使ってデザインのベースを作り、その後、ログイン画面やソーシャルログインボタンの追加まで一歩ずつ進めていきます。
このチュートリアルを通じて、Next.jsでのページ構築や、shadcnによるコンポーネント利用、Tailwind CSSによるスタイリングの基本を身につけましょう。
今回のゴール
この記事のゴールはTailwind CSSとshadcnを駆使して下記のようなアカウント登録画面を作成するところまでとなります。
既にTailwind CSSやshadcnは使い方を知っているという方はこの記事は飛ばして頂いても問題ありません。
カードコンポーネントの活用
shadcnのカードコンポーネントを活用してアカウント登録画面の大枠を作っていきます。
下記のコマンドでshadcnのカードコンポーネントをインストールします。
$ npx shadcn@latest add card
インストールが終わると、/components/ui
配下にcard.tsx
ファイルが作成されます。
一部抜粋
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
一番最後にexport
されているコンポーネントがありますが幾つかあります。
アカウント登録画面とログイン画面は比較的似たデザインにしようと考えていますので、これらのコンポーネントをまとめたCardWrapper
コンポーネントを/components/auth
配下に作成し、それを使っていきます。
'use client'
import { Card, CardContent, CardFooter, CardHeader } from '@/components/ui/card'
interface CardWrapperProps {
children: React.ReactNode
headerLabel: string
buttonLabel?: string
buttonHref?: string
showSocial?: boolean
}
export const CardWrapper = ({
children,
buttonLabel,
buttonHref,
showSocial,
}: CardWrapperProps) => {
return (
<Card className="w-[400px] shadow-md">
<CardHeader></CardHeader>
<CardContent>{children}</CardContent>
{showSocial && <CardFooter></CardFooter>}
{buttonLabel && buttonHref && <CardFooter></CardFooter>}
</Card>
)
}
このコンポーネントは使用する際に幾つかのpropsを受け取るようにしており、その用途をまとめました。
- children: 入力フォームを受け取る
- headerLabel: カードのタイトルの文字列を受け取る
- buttonLabel: カードのフッターに設置するボタンの名称を受け取る
- buttonHref: ボタンをクリックした際の遷移先を設定する
- showSocial: ソーシャルアイコンを表示するかどうかの設定
カードのヘッダー部分のコンポーネント作成
カードの枠が完成しましたのでその中身を作成していきます。
まずはヘッダー部分に当たるコンポーネントになります。
/components/auth
配下にheader.tsx
作成し、それを使っていきます。
interface HeaderProps {
label: string
}
export const Header = ({ label }: HeaderProps) => {
return (
<div className="flex w-full flex-col items-center justify-center gap-y-4">
<h1 className='text-2xl font-semibold'>認証チュートリアル</h1>
<p className="text-sm text-muted-foreground">{label}</p>
</div>
)
}
フッターに設置するボタンのコンポーネント作成
import Link from 'next/link'
import { Button } from '@/components/ui/button'
interface FooterButtonProps {
href: string
label: string
}
export const FooterButton = ({ href, label }: FooterButtonProps) => {
return (
<Button variant="link" className="w-full font-normal" size="sm" asChild>
<Link href={href}>{label}</Link>
</Button>
)
}
ボタンコンポーネントを再び定義しました。
Next.jsの提供しているLinkコンポーネントを使って画面遷移できるようにしてあります。
またデザインはshadcnのボタンコンポーネントを活用しています。
ソーシャルアイコンを表示するコンポーネントの作成
CardWrapper
で使用する最後のコンポーネントとなります。
今回の認証チュートリアルでは最初にメールアドレス/パスワードでログインできる仕組みを構築します。その後、GoogleやGithubのアカウントでもログインできる方法もご紹介していきます。そこの段階で初めて役に立つコンポーネントなのですがこのタイミングで作成しておきます。
まず最初にアイコンを使用するため下記のコマンドでライブラリを追加します。
$ npm i react-icons
react-iconsというアイコンがまとまっているライブラリになります。
Next.jsのサーバーコンポーネント、クライアントコンポーネントどちらでも動く便利なライブラリです。
2024年9月現在で約48,000種類も提供されているようです。
48,000種類を一つずつ見ていくのは大変なので先ほどのホームページの検索画面でgoogle
やgithub
などを入力して探します。このような感じでアイコンを探して、使いたいものが見つかればインポートの書き方を表示してくれますので、そのままコピペで画面上にアイコンが表示されます。
このサイトからGoogleとGithubのアイコンを探して、/components/auth
配下にsocial.tsx
作成しアイコンを使用します。
import { FaGithub } from 'react-icons/fa'
import { FcGoogle } from 'react-icons/fc'
import { Button } from '@/components/ui/button'
export const Social = () => {
return (
<div className="flex w-full items-center gap-x-2">
<Button size="lg" className="w-full" variant="outline">
<FcGoogle className="size-5" />
</Button>
<Button size="lg" className="w-full" variant="outline">
<FaGithub className="size-5" />
</Button>
</div>
)
}
これでアカウント登録画面を作成するのに必要なコンポーネントが一通り揃いました。
これらを組み立てて実際の表示できることを確認していきます。
アカウント登録画面の実装
まずはCardWrapper
の修正
'use client'
import { Card, CardContent, CardFooter, CardHeader } from '@/components/ui/card'
+import { FooterButton } from './footer-button'
+import { Header } from './header'
+import { Social } from './social'
interface CardWrapperProps {
children: React.ReactNode
headerLabel: string
buttonLabel?: string
buttonHref?: string
showSocial?: boolean
}
export const CardWrapper = ({
children,
+ headerLabel,
buttonLabel,
buttonHref,
showSocial,
}: CardWrapperProps) => {
return (
<Card className="w-[400px] shadow-md">
- <CardHeader></CardHeader>
+ <CardHeader>
+ <Header label={headerLabel} />
+ </CardHeader>
<CardContent>{children}</CardContent>
- {showSocial && <CardFooter></CardFooter>}
+ {showSocial && (
+ <CardFooter>
+ <Social />
+ </CardFooter>
)}
- {buttonLabel && buttonHref && <CardFooter></CardFooter>}
+ {buttonLabel && buttonHref && (
+ <CardFooter>
+ <FooterButton label={buttonLabel} href={buttonHref} />
+ </CardFooter>
)}
</Card>
)
}
基本的には先ほど作成したFooterButton
,Header
,Social
をそれぞれ必要な場所に配置していくこととなります。
次はアカウント登録専用のコンポーネントを作成します。
/components/auth
配下にregister-form.tsx
ファイルを作成し、上記で作成したCardWrapper
を使ってコンポーネントを作成していきます。
import { CardWrapper } from './card-wrapper'
export const RegisterForm = () => {
return (
<CardWrapper
headerLabel="各項目を入力してアカウントを作成"
buttonLabel="既にアカウントを登録済みの方はコチラ"
buttonHref="/auth/login"
showSocial
>
入力フォーム
</CardWrapper>
)
}
このコンポーネントに所謂メールアドレスやパスワードなどを入力できる入力フォームを作っていきますが、それは次の記事でご紹介しますので、ここでは一旦、テキストだけ入れておきます。
登録画面では、既にアカウント登録を済ませている方向けにログイン画面に遷移できるボタンを別途用意しています。
次は上記のRegisterForm
を使って実際に画面に表示する作業となります。
/app/auth/register
配下のpage.tsx
を修正します。
+import { RegisterForm } from '@/components/auth/register-form'
const RegisterPage = () => {
- return <div>アカウント登録画面</div>
+ return <RegisterForm />
}
export default RegisterPage
先ほどまでテキストで「アカウント登録画面」とだけ表示されてたところを、RegisterForm
に置き換えています。
最後に画面のレイアウトを整えていきます。
/app/auth
配下にlayout.tsx
を作成しデザインを整えていきます。
const AuthLayout = ({ children }: { children: React.ReactNode }) => {
return (
<div className="flex h-full items-center justify-center bg-gradient-to-br from-sky-100 to-blue-300">
{children}
</div>
)
}
export default AuthLayout
Next.jsを起動し、トップ画面からアカウント登録画面に遷移すると下記のような画面が表示されたらOKです。
「既にアカウントを登録済みの方はコチラ」というテキストが表示されているかと思いますが、こちらをクリックすると、ログイン画面に遷移できるかと思いますので合わせてご確認ください。
さいごに
今回はTailwind CSSやshadcnを用いて幾つかのコンポーネントを作成し、そしてそれらをまとめ実際に表示できるところまで行いました。
shadcnは一般的に使われるコンポーネントの用意しているので少ない作業でそれらしいコンポーネントを作ることが可能だとイメージが湧いてきたら幸いです。
次回はこの画面に入力フォームを作りながら入力内容のチェックをするバリデーション機能を実装してきます。
次の記事はこちら
関連する技術ブログ
チャットアプリ(画像・PDF送信、ビデオ通話機能付き)
お客様固有の要件を除き一般的なチャットアプリに求められる最低限の機能を実装しデモアプリとしてご紹介いたします。
shinagawa-web.com
React × Tailwind CSS × Emotionで実践するコンポーネント設計ガイド:デザインシステム・状態管理・再利用性の最適解
React、Tailwind CSS、Emotion、Storybook、Figma、Next.jsを活用したコンポーネント設計のベストプラクティスを紹介。デザインシステムに基づく命名規則、適切な状態管理、再利用性を高める抽象化、アクセシビリティ対応、スタイルガイドラインの整備、テーマ設定、バージョン管理、ドキュメント作成まで、モダンフロントエンド開発に欠かせない知識を徹底解説します。
shinagawa-web.com
Chakra UI・ShadCN・Material UIを活用したデザインシステムの構築と運用
デザインシステムの要件定義から適用ガイドラインの策定、UIコンポーネントの設計・実装、レスポンシブ対応、アクセシビリティ強化まで、幅広い観点で解説。Chakra UI・ShadCN・Material UIなどのUIフレームワークを活用しながら、カラーパレットやタイポグラフィの統一、コードスタイルの整備、開発者・デザイナー向けのドキュメント作成、プロトタイピング、ユーザビリティ向上のためのテスト戦略までを包括的に取り上げます。
shinagawa-web.com
管理ダッシュボード機能(グラフ表示、データ取り込み)
一般的な家計簿アプリとして求められる最低限の機能を実装しデモアプリとしてご紹介いたします。
shinagawa-web.com
Next.jsとAuth.jsで認証機能を実装するチュートリアル
Next.jsでアプリケーションを作る時に必要となる認証機能をどのように実装するかをご紹介する記事となります。アカウント登録から始まり、ログイン、ログアウト、ページごとのアクセス制御、OAuth、二要素認証、パスワードリセットなど認証に関連する様々な機能をコードベースでご紹介します。
shinagawa-web.com
Next.js 14でトップ画面を作成し、ログイン・アカウント登録画面への遷移を実装する方法
この記事のゴールはNext.jsが動かせる状態にして、トップ画面にタイトルとボタンを設置。その後、ボタンをクリックするとログイン画面、アカウント登録画面に遷移するところまでとなります。
shinagawa-web.com
動画配信サービス(クレカ決済、視聴履歴機能付き)
お客様固有の要件を除き一般的な動画配信プラットフォームに求められる最低限の機能を実装しデモアプリとしてご紹介いたします。
shinagawa-web.com
キャッシュ戦略完全ガイド:CDN・Redis・API最適化でパフォーマンスを最大化
Webアプリの高速化には、適切なキャッシュ戦略が不可欠。本記事では、CDN(Cloudflare / AWS CloudFront)による静的コンテンツ配信、Redis / Memcached を活用したデータベース負荷軽減、APIレスポンスキャッシュ(GraphQL / REST API)など、キャッシュを駆使してパフォーマンスを向上させる方法を解説。TTL設定、Next.js ISR / SSG のプリフェッチ、クエリキャッシュ(React Query / Apollo Client)、キャッシュヒット率の分析など、実践的なノウハウも紹介します。
shinagawa-web.com
弊社の技術支援サービス
無駄なコストを削減し、投資対効果を最大化する
クラウド費用の高騰、不要なSaaSの乱立、開発工数の増加――これらの課題に悩んでいませんか?本サービスでは、クラウドコストの最適化、開発効率向上、技術選定の最適化 を通じて、単なるコスト削減ではなく、ROIを最大化する最適解 をご提案します。
shinagawa-web.com
最新技術の導入・検証を支援するPoCサービス
Remix、React Server Components、TypeScript移行、クラウドサービス比較、マイクロサービス、サーバーレス、デザインシステムなど、最新技術のPoC(概念実証)を通じて、最適な技術選定と導入を支援します。貴社の開発課題に合わせた検証・実装で、ビジネスの成長を加速させます。
shinagawa-web.com
開発生産性を最大化するための支援サービス
開発チームの生産性向上、コードの品質管理、インフラの最適化まで、様々な側面からサポートします。コードベースのリファクタリングから、テスト自動化、オンボーディング強化まで、プロジェクトの成功に必要なすべての支援を提供。御社の開発現場が効率的に機能するように、技術的な障害を取り除き、スムーズな開発を実現します。
shinagawa-web.com
開発品質向上支援 – 効率的で安定したプロダクトを実現
フロントエンドからバックエンド、データベースまで、開発プロセス全体を最適化し、安定したプロダクト作りをサポートします。コードレビューの仕組み、型定義の強化、E2Eテスト環境の構築など、開発の各ステップにおけるベストプラクティスを導入することで、より効率的でバグの少ない、そしてユーザー満足度の高いサービス提供を支援します。
shinagawa-web.com
Webアプリのセキュリティ強化支援
Webアプリの脆弱性対策からインフラのセキュリティ強化まで、包括的なセキュリティ支援を提供。OWASP Top 10対策、JWT認証の最適化、APIのアクセス制御、依存パッケージの監査、セキュアコーディングの標準化など、実践的なアプローチで開発現場の安全性を向上させます。
shinagawa-web.com
目次
お問い合わせ