开发维护
运行时
- Node.js:
24.x(生产与 Vercel 项目设置都是这个)。package.json的engines.node是权威。 - 包管理器:pnpm(
packageManager: pnpm@11.7.0)。 - 框架:Pages Router,不要换成 App Router。
- 服务端入口:
server.js(dev 与 prod 都用它),不要用next dev/next start。
server.js 加载 .env.local、准备 Next、处理 PORT 环境变量、跑 graceful shutdown。proxy.ts 才是 locale 中间件入口。
快速开始
打开 http://localhost:3000,proxy.ts 会把 / 308 重定向到 /zh-CN(取决于 NEXT_LOCALE cookie 与 Accept-Language)。
常用命令
单测:
Vitest 用 jsdom,匹配 **/*.test.ts。新单测统一放 tests/<area>/,已分 lib / components / hooks / i18n / pages / repo 六个目录(GOTCHAS.md 第 27 条)。不要再把 .test.ts 放在源码旁边。
本地 COS Referer 工作流
cdn.arsvine.com 桶只放行 Referer 匹配 arsvine.com / *.arsvine.com。localhost 与空 Referer 会被拒。
为了本地能用真 COS 资源,提供一个 Windows helper:
-HostsOnly 模式后,浏览器开 http://dev.arsvine.com 即可命中本地 80 端口、且 Referer 是 dev.arsvine.com,COS 桶会放行。
本地 COS workspace
cos-workspace/ 完全是本地工作目录,必须在 .gitignore 里。
pnpm assets:prepare 期望 cos-workspace/public-root-legacy/ 是当前线上公开桶的镜像。详见 website/asset-pipeline 与 website/cos-and-cdn。
数据与文案编辑
改站点 / 作品 / 经历 / 生活 / 友链 / 技能 / 文案,优先动这些文件,不要绕到组件逻辑里写死:
新增 locale 必须同步:
i18n/config.ts(locales + 各 map + helpers)locales/<locale>.jsondata/<topic>/<locale>.ts(每个 topic)lib/i18n-data.ts静态注册表proxy.ts的 locale 检测(如需支持新的 Accept-Language tag)
远端图床白名单
集中在 config/image-hosts.js,按 Next.js images.remotePatterns 规范写:
加 / 删域名只动这一个文件,不要复制到 next.config.js。
默认白名单的来源:
cdn.arsvine.com— 腾讯云 COS 香港桶arsvine-cdn,承载所有自有图、封面、图集、字体、装饰placehold.co—data/*.ts的占位图images.unsplash.com/source.unsplash.com— 模板示例图
大图走 cdn.arsvine.com + unoptimized={true},避免烧 Vercel Hobby Image Optimization 配额。
字体托管
Realm 把 Google Fonts 搬到 cdn.arsvine.com/shared/fonts/,不在 fonts.googleapis.com 拉——国内访问 Google Fonts 不稳定。三个字族:
Dosis300/400/500(HUD UI 主力)Noto Sans SC300/400/500/700(中文正文 + 部分粗体)Noto Serif SC400/700(MDX 阅读体)
data/site.ts 的 fonts.googleStylesheet 是真理之源。改完后:
上传时 COS 元数据要严格:
COS 自定义 header 的 Value 字段只能写值,不能把 Cache-Control: ... 整个粘进去。写错会导致 Cache-Control: Cache-Control: ...,Firefox 会拒收字体,传统中文偶现「豆腐字」。GOTCHAS.md 第 3 条。
提交前
至少:
UI / 交互改动还要手验:
- 桌面、移动端布局
- 首页 → 内容聚合 → 详情的过渡
- 公开博文 + 受保护博文
- 移动端 hash 导航到 content 段
- 音乐播放器开关 / 切歌
- 自定义光标 hover label / BACK 状态
- CJK / 带音 Latin 字形渲染