木戸亮輔のポートフォリオサイト。Zennブログと連携し、プロダクトや技術記事を紹介しています。
- Zennブログ連携: ZennのRSSフィードから記事を自動取得
- Productsページ: Zennで"Product"タグがついた記事を表示
- Blogページ: すべてのZenn記事を表示
- Homeページ: 上位3件のProduct記事を表示
- ダークモード対応: ライト/ダークテーマの切り替え
- レスポンシブデザイン: モバイル・タブレット・デスクトップ対応
- フレームワーク: Next.js 15 (App Router)
- 言語: TypeScript
- スタイリング: Tailwind CSS
- UIコンポーネント: Radix UI
- アイコン: Lucide React
- パッケージマネージャー: pnpm
- Node.js 18以上
- pnpm 10以上
# リポジトリをクローン
git clone https://github.com/dokkiitech/portfolio.git
cd portfolio
# 依存関係をインストール
pnpm installpnpm devブラウザで http://localhost:3000 を開いて確認できます。
pnpm buildpnpm startポート3006で起動します。
portfolio/
├── app/ # Next.js App Router
│ ├── about/ # Aboutページ
│ ├── blog/ # Blogページ(全記事)
│ ├── contact/ # Contactページ
│ ├── products/ # Productsページ(Productタグの記事)
│ ├── appoint/ # 予約ページ
│ ├── layout.tsx # ルートレイアウト
│ └── page.tsx # Homeページ
├── components/ # Reactコンポーネント
│ ├── ui/ # 再利用可能なUIコンポーネント
│ ├── blog-card.tsx # ブログ記事カード
│ ├── latest-products.tsx # 最新プロダクト表示
│ ├── navigation.tsx # ナビゲーションバー
│ └── ...
├── lib/ # ユーティリティ関数
│ ├── zenn.ts # Zenn RSS取得・パース処理
│ └── utils.ts # 汎用ユーティリティ
└── public/ # 静的ファイル
- ZennのRSSフィード (
https://zenn.dev/{username}/feed) から記事を取得 - 1時間ごとにキャッシュを再検証 (ISR)
- タグでフィルタリングして表示
Zennで記事を投稿する際に "Product" タグをつけると:
/productsページに表示される- Homeページの "Latest Products" セクションに上位3件が表示される
lib/zenn.ts でZennのユーザー名を変更できます:
// 例: Blogページ
const articles = await getZennArticles("dokkiitech")
// 例: Productsページ
const articles = await getZennProductArticles("dokkiitech")パフォーマンス最適化のため、以下のコンポーネントは遅延読み込みを使用:
CodeAnimationLatestProducts
- ZennのRSSフィード: 1時間ごとに再検証 (
revalidate: 3600) - ISR (Incremental Static Regeneration) を活用して、静的生成とデータの鮮度を両立
ZennのRSSフィードに含まれるHTMLタグやCDATAセクションは、stripHTMLTags関数で自動的に除去されます。
Private
木戸亮輔 (DOKKIITECH)
- Website: dokkiitech.com
- Zenn: @dokkiitech
木戸亮輔のプロフィールを表示するHPです。