Next.jsReact博客

blog-v2 — Next.js 博客模板

作者 wimpykid719

基于 Next.js App Router 的 Markdown 博客模板,支持本地或 GitHub 仓库作为文章源,内置文章列表与分页、RSS、站点地图、OG 图片、代码高亮与 KaTeX 公式。

看看你的网站会是什么样

浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。

3 个预览视图
桌面端首页1 / 3
桌面端截图首屏预览

由服务器浏览器实际访问页面后截取。

全部页面与视图 3

截图用于了解视觉与布局,交互效果请以实际项目为准。

采集于 2026-10-14查看来源

值得关注的模板亮点

从已有项目资料中,快速了解它的特点。

01

Markdown 文章生成,默认读取本地 content/articles/*.md

02

可选 GitHub 文章源:设置 GITHUB_REPOS 后从仓库 articles/ 目录读取 Markdown

03

文章列表支持分页(/articles?page=2),并提供文章详情页

04

内置 RSS(/rss.xml,最多 50 条含分类)、sitemap.xml、robots.txt 与 OG 图片路由

05

支持 highlight.js 代码高亮与 KaTeX 数式

06

可选 GA4 统计与首页 Analytics Dashboard(需 GA4 Data API 服务账号凭据)

模板详细介绍

这是一个用 Next.js(App Router)搭建的博客模板,文章由 Markdown 生成。默认从本地 `content/articles/*.md` 读取文章,也可通过设置环境变量 `GITHUB_REPOS` 改为从 GitHub 仓库的 `articles/` 目录读取 Markdown。

页面与路由包括:首页 `/`、文章列表 `/articles`(支持 `?page=` 分页)、文章详情 `/articles/[slug]`、RSS `/rss.xml`(最多 50 条并输出分类)、站点地图 `/sitemap.xml`、`/robots.txt` 以及用于 OG/Twitter 的 `/opengraph-image`。SEO 方面提供 canonical、OG、Twitter Card,并支持 Google Search Console 验证。

文章 front matter 需要包含 title、emoji、type(tech 或 idea)、topics、published、date 等字段,可选的 `qiitaId` 会替换 slug,使 URL 变为 `/articles/<qiitaId>`;canonical 可按配置优先指向 Qiita/Zenn 原文。GitHub 源模式下 slug 冲突按 `GITHUB_REPOS` 顺序先到先得,且只显示 `published: true` 的文章。

可选集成包括 GA4 的 PV 统计与首页 Analytics Dashboard(需 GA4 Data API 的服务账号凭据),以及代码高亮(highlight.js)和数式(KaTeX)。项目使用 pnpm,提供 DevContainer 配置,README 给出的部署方式是 Vercel。README 未说明除 Vercel 之外的其他部署平台细节,也未提供性能或生产就绪程度的说明。

Next.js博客

适合你的项目吗?

适用场景

  • 用 Markdown 维护并发布个人技术博客
  • 把 Zenn 或 Qiita 仓库中的 articles/ 目录作为文章源统一展示
  • 需要 RSS、站点地图与 OG 图片等基础 SEO 输出的博客站点
  • 在 DevContainer 中开发并部署到 Vercel 的 Next.js 博客

适合人群

  • 习惯用 Markdown 写作的个人创作者
  • 使用 Next.js App Router 并希望以 pnpm 管理依赖的开发者
  • 需要将 GitHub 仓库中的文章同步到自有博客的人
  • 希望在 Vercel 上部署博客的开发者

上手与定制指南

结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。

  1. 1

    项目使用 pnpm(packageManager: pnpm),本地运行需进入 app 目录执行 pnpm install 与 pnpm dev

  2. 2

    推荐使用 DevContainer:克隆仓库后先复制 .devcontainer/.env.sample 为 .devcontainer/.env,再在 VS Code 中 Reopen in Container,然后在容器内执行 cd app && pnpm dev

  3. 3

    建议设置 NEXT_PUBLIC_SITE_URL(末尾不加斜杠),用于生成 sitemap、robots、rss 与 canonical;未设置时回退到 site.json,再回退到 http://localhost:3000

  4. 4

    使用 GitHub 文章源时需配置 GITHUB_REPOS,可选 GITHUB_OWNER、GITHUB_BLOG_PATH(默认 articles)、GITHUB_TOKEN

  5. 5

    Vercel 部署时在 Project Settings → Environment Variables 中配置环境变量,并确认 pnpm build 通过;RSS 与 sitemap 使用 fs 或 GitHub API,运行在 Node.js runtime

查看仓库使用说明

授权与来源资料

使用条件与限制

免费使用 · 保留许可声明

本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。

使用时需要遵守

  • 允许免费使用、修改、商用和分发该版本代码。
  • 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
  • 代码按现状提供;担保与责任限制以原许可证及适用法律为准。

额外费用与待核对事项

  • 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
  • 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
  • 可选功能:设置环境变量 GITHUB_REPOS 后,文章将从 GitHub 仓库的 articles/ 目录读取,而非本地 Markdown。
  • 可选功能:需设置 GA4 测量 ID 才会启用 Google Analytics 的 PV 统计。
  • 设置 GITHUB_REPOS 后,文章列表与正文将通过 GitHub Contents API 获取,而非本地文件。
  • GITHUB_TOKEN 为可选,但访问私有仓库或规避速率限制时需要提供。
  • 首页的 Analytics Dashboard(PV/热门页面)为可选功能,需使用 GA4 Data API。
  • 使用 GA4 Data API 前,需在 Google Analytics(GA4)侧为服务账号授予至少查看权限。
  • 生成指向 Zenn/Qiita 原文的 canonical 时,需设置 ZENN_USER_NAME 与 QIITA_USER_NAME。
  • 使用 DevContainer 的 GitHub 文章源时,GITHUB_REPOS 为必填项。
  • 使用 DevContainer 的 GitHub 文章源时,GITHUB_OWNER 为必填项。
  • GITHUB_TOKEN 为可选但推荐;访问私有仓库或规避速率限制时需要。
  • README 给出的部署方式为 Vercel,并称其最为简单。
  • 部署到 Vercel 时,需在 Project Settings → Environment Variables 中设置 NEXT_PUBLIC_SITE_URL 等变量。
  • /rss.xml 与 sitemap.xml 因使用 fs 或 GitHub API 获取文章,需运行在 Node.js runtime。
  • npm/npx 命令执行前需确认,可通过 USE_NPM_ANYWAY=1 绕过。
  • pnpm-workspace.yaml 设置了 minimumReleaseAge: 4320(3 天),阻止安装新发布的包。
查看原文依据

Permission is hereby granted, free of charge

许可证原文

- **GitHub記事ソース(任意)**: 環境変数 `GITHUB_REPOS` を設定すると、GitHubリポジトリ上の `articles/` 配下Markdownも読み込み可能

README 原文

- **Google Analytics(任意)**: GA4測定IDを設定するとPV計測

README 原文

`GITHUB_REPOS` を設定すると、ローカルではなく **GitHubのContents API** から記事一覧/本文を取得します。

README 原文

- `GITHUB_TOKEN`: 任意(private repoやレート制限対策)

README 原文

- **GA4 Data API(任意)**: ホームの「Analytics Dashboard(PV/人気ページ)」表示に使用

README 原文

- 事前に **Google Analytics(GA4)側でサービスアカウントに閲覧権限以上**を付与してください

README 原文

- **`ZENN_USER_NAME`**, **`QIITA_USER_NAME`**: 原本canonical(Zenn/Qiita)生成に使用(`site.json` でも設定可)

README 原文

- `GITHUB_REPOS`(必須;推奨フォーマット: `owner/repo-a,owner/repo-b`)

README 原文

- `GITHUB_OWNER`(必須;リポジトリパス用)

README 原文

- `GITHUB_TOKEN`(任意だが推奨;privateリポジトリやレート制限対策に必要)

README 原文

Vercelへのデプロイが最も簡単です。

README 原文

- **Project Settings → Environment Variables** に `NEXT_PUBLIC_SITE_URL`(必要に応じて他の変数も)を設定

README 原文

- `/rss.xml` や `sitemap.xml` は記事取得に `fs`(ローカル)またはGitHub APIを使うため、**Node.js runtime**で動作します(実装で固定済み)

README 原文

- npm/npxコマンドは実行前に確認が必要です(`USE_NPM_ANYWAY=1` でバイパス可能)

README 原文

- `pnpm-workspace.yaml` に `minimumReleaseAge: 4320`(3日)を設定し、新しくリリースされたパッケージのインストールを防止します

README 原文
https://github.com/wimpykid719/blog-v2/blob/main/LICENSE.mdhttps://github.com/wimpykid719/blog-v2/blob/main/README.md

DeepSeek 根据仓库许可证和 README 整理 ·2026-10-14。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。

项目核对记录与介绍依据

模板资料

来源平台
GitHub
资料与维护参考分
资料较完整 · 80 / 100
技术栈
Next.js · React
网站类型
博客
这个分数如何计算

本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。

这个项目需要核对什么

记录的仓库更新时间
2026-04-16
截图检查日期
2026-10-14

已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。

目录记录的主要技术栈是 Next.js。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。

查看具体选型方法 →

介绍的制作与核对状态

介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。

审核声明: codex-user-requested-batch-review-20261015 · 2026-10-15

查看当时使用的来源资料

SHA-256: e2782dbb5c4a0529467ef5c6f29e03bdcf15b61465f6361411879ef5eab265eb

2026-10-14T15:46:49.350Z

来源文件 / 仓库
# 🏡 DevSpot Blog(Next.js)

[English](./README.en.md) | **日本語**

> 💡 **個人クリエイターにおすすめ!**
> このブログは**誰でも簡単にデプロイできて、無料で運用できる**個人クリエイター向けのブログテンプレートです。Vercelへのデプロイが簡単で、コストゼロで始められます。

## 概要

Next.js(App Router)で作ったブログです。記事はMarkdownから生成され、**記事一覧**・**記事詳細**・**RSS**・**サイトマップ**・**OG画像**などを備えています。

## 主な機能

- **Markdown記事配信**: `content/articles/*.md`(ローカル)から記事を生成
- **GitHub記事ソース(任意)**: 環境変数 `GITHUB_REPOS` を設定すると、GitHubリポジトリ上の `articles/` 配下Markdownも読み込み可能
- **記事一覧 + ページネーション**: `/articles?page=2` のようにページング
- **SEO対応**: canonical/OG/Twitter Card、`robots.txt`、`sitemap.xml`
- **RSSフィード**: `/rss.xml`(最大50件、カテゴリ出力)
- **コードハイライト/数式**: highlight.js / KaTeX 対応
- **Google Analytics(任意)**: GA4測定IDを設定するとPV計測

## ページ / ルーティング

- **ホーム**: `/`
- **記事一覧**: `/articles`(`?page=` 対応)
- **記事詳細**: `/articles/[slug]`
- **RSS**: `/rss.xml`
- **サイトマップ**: `/sitemap.xml`
- **robots**: `/robots.txt`
- **OG画像**: `/opengraph-image`(OG/Twitter用)

## 記事の追加・更新(ローカルMarkdown)

1. `content/articles/` に `my-article.md` を追加
2. front matter を設定(必須項目あり)

例:

```md
---
title: "記事タイトル"
emoji: "📝"
type: "tech" # "tech" | "idea"
topics: ["Next.js", "TypeScript"]
published: true
date: "2025.12.31" # 例: YYYY.MM.DD / YYYY-MM-DD / YYYY/MM/DD
# qiitaId: "xxxxxxxxxxxxxxxxxxxx" # 任意
---

# 見出し

本文...
```

### `slug` と `qiitaId` について(重要)

- **通常**: `content/articles/my-article.md` → slug は `my-article`
- **`qiitaId` を指定**: slug は `qiitaId` に置き換わります(URLが `/articles/<qiitaId>` になります)
- canonical URL は、設定に応じて **Qiita/Zenn(原本)を優先**します(後述)

## 記事の追加・更新(GitHubリポジトリから読み込む:任意)

`GITHUB_REPOS` を設定すると、ローカルではなく **GitHubのContents API** から記事一覧/本文を取得します。

- `GITHUB_REPOS`: 例 `["owner/repo-a","owner/repo-b"]` または `owner/repo-a,owner/repo-b`
- `GITHUB_BLOG_PATH`: 記事ディレクトリ(デフォルト `articles`)
- `GITHUB_TOKEN`: 任意(private repoやレート制限対策)
- `GITHUB_OWNER`: 任意(`GITHUB_REPOS` に repo名だけ書く場合の補完)

注意:

- slug が衝突する場合は **`GITHUB_REPOS` の指定順で先勝ち**します
- `published: true` の記事のみ表示されます

### GitHubリポジトリの階層構造

GitHubリポジトリから記事を読み込む場合、以下の階層構造でMarkdownファイルを配置してください。

```
リポジトリルート/
├── articles/          # 記事ディレクトリ(GITHUB_BLOG_PATH で変更可能、デフォルト: articles)
│   ├── article-1.md
│   ├── article-2.md
│   └── ...
└── .gitignore         # その他のファイル(任意)
```

**例: Zenn記事用リポジトリ**

```
zenn-content/
└── articles/
    ├── nextjs-tutorial.md
    ├── react-server-components.md
    └── ...
```

**例: Qiita記事用リポジトリ**

```
qiita-content/
└── articles/
    ├── fastapi-guide.md
    ├── docker-basics.md
    └── ...
```

**複数リポジトリを指定する場合:**

```bash
GITHUB_REPOS='["zenn-content","qiita-content"]'
```

この場合、両方のリポジトリの `articles/` 配下のMarkdownファイルが読み込まれます。

**ファイル名とslugの関係:**

- ファイル名: `my-article.md` → slug は `my-article`
- front matter に `qiitaId` がある場合: slug は `qiitaId` に置き換わります

## 環境変数

### 必須(推奨)

- **`NEXT_PUBLIC_SITE_URL`**: 本番URL(末尾スラッシュ無し推奨)
  - `sitemap.xml` / `robots.txt` / `rss.xml` / canonical URL の生成に使われます
  - 未設定時は `site.json` → それも空なら `http://localhost:3000` にフォールバック

### 任意

- **`NEXT_PUBLIC_GA4_MEASUREMENT_ID`**: GA4測定ID(設定時のみ計測スクリプトを挿入)
- **GA4 Data API(任意)**: ホームの「Analytics Dashboard(PV/人気ページ)」表示に使用
  - **`GA4_PROPERTY_ID`**: GA4のプロパティID(数値。例: `123456789`)
  - **`GA4_CLIENT_EMAIL`**: サービスアカウントの `client_email`
  - **`GA4_PRIVATE_KEY`**: サービスアカウントの `private_key`(改行を含む場合は `\n` でも可)
  - 事前に **Google Analytics(GA4)側でサービスアカウントに閲覧権限以上**を付与してください
- **`NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION`**: Google Search Console 用 verification
- **`ZENN_USER_NAME`**, **`QIITA_USER_NAME`**: 原本canonical(Zenn/Qiita)生成に使用(`site.json` でも設定可)
- **GitHub記事ソース**: `GITHUB_REPOS`, `GITHUB_BLOG_PATH`, `GITHUB_TOKEN`, `GITHUB_OWNER`

## ローカルでの環境構築 / 起動

このプロジェクトは `packageManager: pnpm` です。

### 方法1: DevContainerを使用(推奨)

このプロジェクトには **DevContainer設定** が含まれており、Docker環境で一貫した開発環境を提供します。

#### 特徴

- 🐳 **マルチステージDockerビルド**: Zsh開発環境 + 軽量な本番イメージ
- 📦 **pnpm** via Corepack
- 🖥️ **Zsh with autosuggestions & persistent history** でスムーズなCLIワークフロー
- 🛠 **Biome** をフォーマッター & リンターとして使用(Git統合で一貫したコミット)
- 🎨 **Tailwind CSS** サポート(VS Code拡張機能もプリインストール済み)
- 🔧 **Devcontainer設定** で再現可能でポータブルなワークスペース
- 🛡️ **サプライチェーン攻撃対策**: バージョンピン、リリース年齢チェック、npm/npx使用制限

#### セットアップ手順

1. **リポジトリをクローン**
   ```zsh
   git clone https://github.com/wimpykid719/blog-v2
   cd blog-v2
   ```

2. **環境ファイルを作成**
   コンテナを起動する前に、サンプル環境ファイルをコピーします:
   ```zsh
   cp .devcontainer/.env.sample .devcontainer/.env
   ```

3. **GitHub記事ソースの設定(任意)**
   このプロジェクトは、GitHubリポジトリに保存されたMarkdownファイルから `/articles` ページを生成できます。

   `.devcontainer/.env` に以下の変数を設定してください(`.devcontainer/.env.sample` からコピー後):
   - `GITHUB_REPOS`(必須;推奨フォーマット: `owner/repo-a,owner/repo-b`)
   - `GITHUB_OWNER`(必須;リポジトリパス用)
   - `GITHUB_BLOG_PATH`(任意、デフォルト: `articles`)
   - `GITHUB_TOKEN`(任意だが推奨;privateリポジトリやレート制限対策に必要)

4. **Dev Containerで開く**
   VS Codeでプロジェクトを開き、「Reopen in Container」を実行して開発環境を初期化します。
   必要なツール(pnpm、Biome、Tailwindなど)はすべてプリインストール済みです。

5. **Next.jsアプリを起動**
   コンテナ内で:
   ```zsh
   cd app && pnpm dev
   ```
   
   アプリは 👉 http://localhost:3000 でアクセスできます。

6. **Biome設定**
   初回起動時、Biomeがnode_modulesにインストールされたBiomeを参照できないためエラーが発生する場合があります。
   解決するには、Ctrl+Shift+P でコマンドパレットを開き、以下のコマンドを実行してください:
   ```
   >Biome: Restart
   ```

### 方法2: 通常のローカル環境

DevContainerを使用しない場合:

```bash
cd app
pnpm install
pnpm dev
```

ブラウザで `http://localhost:3000` を開いて確認してください。

### Lint / Format

```bash
pnpm lint
pnpm format
```

## デプロイ(Vercel)

Vercelへのデプロイが最も簡単です。

- **Project Settings → Environment Variables** に `NEXT_PUBLIC_SITE_URL`(必要に応じて他の変数も)を設定
- `pnpm build` が通ることを確認してデプロイ

補足:

- `/rss.xml` や `sitemap.xml` は記事取得に `fs`(ローカル)またはGitHub APIを使うため、**Node.js runtime**で動作します(実装で固定済み)

## 🛡️ サプライチェーン攻撃対策

このボイラープレートには、npmサプライチェーン攻撃から保護するためのセキュリティ対策が含まれています:

### 1. pnpm使用の強制

- npm/npxコマンドは実行前に確認が必要です(`USE_NPM_ANYWAY=1` でバイパス可能)
- Corepack経由でpnpmが主要パッケージマネージャーとして強制されます

### 2. バージョンピン

- `save-exact=true` を設定した `.npmrc` により、正確なバージョンが保存されます
- `npm-package-json-lint` がすべての依存関係が正確なバージョン(`^` や `~` なし)を使用していることをチェックします
- `pnpm lint:package-json` を実行してバージョンピンを確認できます

### 3. リリース年齢保護

- `pnpm-workspace.yaml` に `minimumReleaseAge: 4320`(3日)を設定し、新しくリリースされたパッケージのインストールを防止します
- `renovate.json` でRenovateが新しいバージョンに更新する前に3日待つように設定されています

### 設定ファイル

初期化時に以下のセキュリティ設定ファイルが `app/` に自動的にコピーされます:
- `.npmrc` - バージョンピン設定
- `.npmpackagejsonlintrc.json` - package.jsonのリンティングルール
- `pnpm-workspace.yaml` - リリース年齢保護付きのpnpmワークスペース設定

ルートレベルの設定:
- `renovate.json` - 依存関係更新用のRenovate bot設定

## 📂 プロジェクト構造

```
.
├── .devcontainer/      # Devcontainer設定、Dockerfile & 環境設定
│   ├── .env.sample
│   ├── .zshrc
│   ├── app/            # Next.jsアプリ初期化用のテンプレートファイル
│   │   ├── .npmrc
│   │   ├── .npmpackagejsonlintrc.json
│   │   └── pnpm-workspace.yaml
│   ├── compose.yml
│   ├── devcontainer.json
│   ├── Dockerfile
│   └── entrypoint.sh
├── .gitignore          # Git ignoreファイル
├── app/                # Next.jsアプリケーションソースコード
│   ├── public/         # 静的アセット
│   ├── src/            # アプリケーションソース
│   ├── content/        # Markdown記事(ローカル)
│   ├── next.config.ts
│   └── package.json
├── LICENSE.md          # プロジェクトライセンス
├── README.md
└── renovate.json       # Renovate bot設定
```

## ✅ 主な特徴

- Docker & Dev Containersによる一貫した開発環境
- Biome + TailwindCSSが標準装備されたオピニオン付きセットアップ
- 生産性向上のための履歴永続化付きZshシェル
- デプロイに最適化された本番対応ビルド
- 無料で運用可能(Vercelなど)
- 簡単なデプロイプロセス

## 📜 ライセンス

MIT
反馈内容错误

看看同类模板

对比同技术栈与用途的模板,找到更适合的视觉与内容结构。