このプロジェクトは、郵便番号から住所を検索する Web アプリケーションです。Next.js を使用して実装されており、2 つの異なる実装方法を提供しています。
- Next.js の App Router を使用した実装
- React コンポーネントによる UI 実装
- クライアントサイドでのデータ処理
- Tailwind CSS によるスタイリング
- Next.js の API Routes を使用した実装
- フロントエンドとバックエンドの分離
- RESTful API によるデータ提供
- シンプルな HTML/JavaScript クライアント
| 機能 | 1st Version | 3rd Version |
|---|---|---|
| アーキテクチャ | モノリシック | クライアント・サーバー |
| データ処理 | クライアントサイド | サーバーサイド |
| 拡張性 | 限定的 | 高い(API として再利用可能) |
| 実装の複雑さ | 中程度 | 低(クライアント側) |
| パフォーマンス | データ量に依存 | サーバーサイドで最適化可能 |
-
データ変換スクリプトの作成
KEN_ALL.CSVを JSON 形式に変換- Shift-JIS エンコーディングの処理
- 必要なフィールドの抽出
-
Next.js プロジェクトのセットアップ
npx create-next-app@latest zipcode-app --typescript --tailwind --eslint
-
1st Version の実装
app/page.tsxにメインコンポーネントを実装- クライアントサイドでの検索機能
- リアルタイムサジェスト機能
-
3rd Version の実装
app/api/zipcode/route.tsに API エンドポイントを実装public/client.htmlにシンプルなクライアントを実装- デバウンス処理とエラーハンドリング
# 依存パッケージのインストール
npm install
# CSVからJSONへの変換
npm run convert# 開発サーバーの起動
npm run dev- ブラウザで
http://localhost:3000にアクセス - Next.js の App Router を使用した実装にアクセス
- ブラウザで
http://localhost:3000/client.htmlにアクセス - シンプルな HTML クライアントにアクセス
- API エンドポイント:
http://localhost:3000/api/zipcode?q=100
GET /api/zipcode?q={query}
q: 検索クエリ(郵便番号の一部、3 文字以上)
{
"results": [
{
"zipCode": "1000001",
"prefecture": "東京都",
"city": "千代田区",
"street": "千代田"
}
]
}{
"error": "エラーメッセージ"
}- Next.js 15.3.2
- TypeScript
- Tailwind CSS
- Node.js
- CSV Parser
- Iconv-lite (文字エンコーディング変換)
- エラーハンドリングの強化
- パフォーマンスの最適化
- テストの追加
- キャッシュ機能の実装
- セキュリティの強化
- レスポンシブデザインの改善
# Dockerイメージのビルド
docker-compose build
# コンテナの起動
docker-compose up- ブラウザで
http://localhost:3000にアクセス - シンプルな HTML クライアントは
http://localhost:3000/client.htmlでアクセス可能
- ソースコードの変更は自動的にホットリロードされます
node_modulesはコンテナ内で管理されます- コンテナの停止は
docker-compose downで実行できます