森研究室の公式 Web サイトです。Next.js 15 と TypeScript を使用して構築されています。
- フレームワーク: Next.js 15 (App Router)
- 言語: TypeScript
- 国際化: next-intl (日本語、英語、中国語対応)
- スタイリング: CSS Modules
- コンテンツ管理: microCMS
- パッケージマネージャー: npm
morilab/
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── [locale]/ # 多言語対応のページ
│ │ │ ├── about/ # 研究室について
│ │ │ ├── access/ # アクセス情報
│ │ │ ├── members/ # メンバー一覧
│ │ │ ├── news/ # ニュース
│ │ │ ├── publications/ # 論文・発表
│ │ │ └── themes/ # 研究テーマ
│ │ └── globals.css # グローバルスタイル
│ ├── components/ # Reactコンポーネント
│ │ ├── pages/ # ページコンポーネント
│ │ └── ui/ # 再利用可能なUIコンポーネント
│ ├── lib/ # ユーティリティ関数
│ │ ├── microcms.ts # microCMS API連携
│ │ └── utils.ts # 共通ユーティリティ
│ ├── i18n/ # 国際化設定
│ └── messages/ # 翻訳ファイル
├── data/ # CSVデータ(バックアップ)
├── public/ # 静的ファイル
└── package.json
npm install
.env
ファイルを作成し、以下の環境変数を設定してください:
MICROCMS_SERVICE_DOMAIN=your-service-domain
MICROCMS_API_KEY=your-api-key
npm run dev
ブラウザで http://localhost:3000 を開いて確認してください。
このプロジェクトは 3 つの言語に対応しています:
- 日本語 (ja): デフォルト言語
- 英語 (en)
- 中国語 (zh)
- URL パスで言語を指定:
/ja/
,/en/
,/zh/
src/i18n/routing.ts
でルーティング設定src/messages/
内の JSON ファイルで翻訳管理
- ニュース: 研究室の最新情報
- メンバー: 研究室メンバーの情報
- 論文・発表: 研究成果の発表
src/lib/microcms.ts
で microCMS API からデータを取得:
// 最新ニュースの取得
const news = await fetchAllNews();
// メンバー情報の取得
const members = await fetchMembers();
// 論文・発表の取得
const publications = await fetchPublications();
各コンポーネントは独自の CSS Module ファイルを持ちます:
import styles from "./page.module.css";
export default function Component() {
return <div className={styles.container}>...</div>;
}
src/app/globals.css
: 全体のスタイルsrc/styles/variants.css
: 共通のスタイル変数
src/app/[locale]/
内に新しいディレクトリを作成page.tsx
ファイルを作成- 必要に応じて
page.module.css
でスタイルを追加
// src/app/[locale]/example/page.tsx
import styles from "./page.module.css";
export default function ExamplePage() {
return (
<div className={styles.container}>
<h1>新しいページ</h1>
</div>
);
}
既存のページコンポーネントはsrc/components/pages/
以下に定義されています,ここには,ページ固有のコンポーネントなどを配置します.ファイルはindex.tsx
とclients.tsx
に分かれています.fetch したいデータは全てindex.tsx
内で処理し,clients.tsx
には Client コンポーネントを記述してください.本リポジトリでは SSG を採用しているため,SSG に則った開発をしてください.
ここでは,汎用コンポーネントを「2つ以上のファイルで使用するコンポーネント」と「共通化した方が実装が楽だと感じたコンポーネント」の積集合で定義します.今後実装をする中で共通化の指標に困った場合,本実装のui/
以下を参考にしてください.
src/components/ui/
内にディレクトリを作成index.tsx
とindex.module.css
を作成
// src/components/ui/example/index.tsx
import styles from "./index.module.css";
interface ExampleProps {
title: string;
}
export default function Example({ title }: ExampleProps) {
return (
<div className={styles.container}>
<h2>{title}</h2>
</div>
);
}
src/messages/
内の各言語ファイルに翻訳を追加- コンポーネントで
useTranslations
フックを使用
import { useTranslations } from "next-intl";
export default function Component() {
const t = useTranslations("common");
return <h1>{t("title")}</h1>;
}
npm run build
このプロジェクトは完全な静的サイト生成(SSG)を使用しています:
export const dynamic = "force-static"
: 静的生成を強制export const revalidate = false
: 再検証を無効化
-
環境変数が読み込まれない
.env
ファイルが正しい場所にあるか確認- 開発サーバーを再起動
-
microCMS API エラー
- API キーとサービスドメインが正しいか確認
- ネットワーク接続を確認
-
TypeScript エラー
npm run lint
でエラーを確認- 型定義を適切に追加
- 新しい機能を追加する際は、適切なブランチを作成
- コードの品質を保つため、ESLint を実行
- 多言語対応が必要な場合は、翻訳ファイルも更新
このプロジェクトは森研究室の公式 Web サイトです。
ローカル環境で SSG サイトのテスト,デモをしたい場合,以下のコマンドを利用してください.
npm run build
cd out
python3 -m http.server