SrP-Sheet 是一个静态导出的 Next.js 吉他谱例站,用来整理 PDF 谱例、PNG 预览图和少量 Bilibili 演示视频。站点定位是轻量、可维护、有编辑感的谱例索引:内容通过 Markdown 维护,构建期校验 metadata,最终导出为静态文件并由 Cloudflare Workers Static Assets 托管。
- 谱例列表与详情页
- 客户端搜索、类型筛选、调弦筛选、附件筛选
- PDF 下载与 PNG 谱例预览
- Bilibili 播放器嵌入,iframe 地址由结构化 metadata 生成
- 关于页与站外链接入口
- 静态导出部署到 Cloudflare Workers Static Assets
- Next.js App Router
- TypeScript
- Tailwind CSS + CSS variables
- Markdown frontmatter 内容文件
- Zod 构建期 schema 校验
- Vitest 单元测试
- Wrangler / Cloudflare Workers Static Assets
关键约束:
next.config.ts使用output: "export"- 动态谱例路由使用
generateStaticParams() - 内容来自
content/sheets/*.md,不在页面组件中硬编码谱例数据 - Bilibili 内容只存
bvid/page/start,不存 iframe HTML - 第一版不使用数据库、登录、评论、投稿、Server Actions、ISR、cookies、需要运行时 Request 的 Route Handlers
app/ Next.js App Router 页面
components/ 站点 UI 组件
content/sheets/ 谱例 Markdown 内容
lib/ 内容加载、schema、搜索、排序、外链数据
public/assets/sheets/ PDF 与 PNG 谱例预览
public/assets/social/ 导航与关于页使用的外链 SVG
tests/ Vitest 测试
wrangler.jsonc Cloudflare Workers Static Assets 配置
每个谱例是一个 Markdown 文件,文件名与 slug 保持一致:
content/sheets/haru-dorobou.md
当前 frontmatter 重点字段:
title: "春泥棒"
slug: "haru-dorobou"
type: "full-score" # full-score = 整谱, lick = 乐句
summary: "《春泥棒》的吉他谱 PDF 与 Bilibili 演示视频整理页。"
instrument: "acoustic-guitar"
tuning: "E Standard"
capo: 3品
featured: true
publishedAt: "2026-06-03"
pdf: "/assets/sheets/pdf/haru-dorobou.pdf"
preview: "/assets/sheets/previews/haru-dorobou.png"
bilibili:
bvid: "BV1kzwpeaE4h"
page: 1
start: 0
rights: "用户提供的学习用途谱例与公开 Bilibili 演示链接;如涉及权利问题请联系移除。"说明:
type只允许full-score或lickpreview可以是 PNG/JPG/WebP 路径,也可以是空字符串""- 只有
pdf和非空preview同时存在时,详情页才显示谱例预览 - Markdown body 当前保持为空,详情页不默认渲染“练习说明”正文
source、updatedAt、difficulty、tags、techniques不属于当前公开内容模型
内容文件只写结构化 metadata:
bilibili:
bvid: "BV1Pt4y1v7Bb"
page: 3
start: 0播放器地址由 lib/bilibili.ts 生成,统一关闭自动播放和弹幕参数。不要在 Markdown 中粘贴任意 iframe HTML。
安装依赖:
pnpm install本地开发:
pnpm dev质量检查:
pnpm typecheck
pnpm lint
pnpm test
pnpm build静态产物本地预览:
pnpm build
pnpm start:staticpnpm start:static 使用 Wrangler 预览 out/。如果 Windows 上构建报 EBUSY,通常是旧的 Wrangler / workerd 进程仍锁住 out/,先停止预览进程再重新构建。
wrangler.jsonc 指向静态导出目录:
部署前运行完整检查:
pnpm typecheck
pnpm lint
pnpm test
pnpm build
pnpm start:static部署:
pnpm deploy- 新增谱例时同时添加或确认 PDF、preview 图片路径存在
- 修改内容 schema、Bilibili、搜索筛选、PDF/preview 行为时必须补测试
tests/是源码测试目录,必须保留在仓库中.gitignore会忽略本地 agent 输出、临时 docs、coverage、test-results、Wrangler/Next 产物和日志- 已跟踪的
docs/项目资料仍保留在历史中;忽略规则只避免未来本地临时文档误提交
导航栏和关于页外链统一配置在 lib/social-links.ts:
{ "name": "srp-sheet", "assets": { "directory": "./out", "not_found_handling": "404-page" } }