大版本更新
一口气全面统一博客样式,移除部分冗余导航页面,更专注内容展示。
不因虚度年华而悔恨,不因碌碌无为而羞愧
博客系列第15期。新增 /sponsor/ 打赏页的全过程:扫码/外链二态卡片、打赏者名单网格、内容仓 YAML 配置驱动,以及「页面开关 × 功能开关」双重门控的页面可用性体系。

打赏页 /sponsor/ 要承载三件事:怎么赏(收款码 / 跳转链接)、谁赏过(打赏者名单)、赏金用哪(用途说明)。整页 SSR 渲染零水合——打赏不需要任何客户端交互逻辑,纯静态卡片就够了。
打赏方式抽象成 SponsorMethod,一个联合类型覆盖两种形态:
1type SponsorMethod =2 | { type: "qrcode"; name: string; image: string }3 | { type: "url"; name: string; url: string };qrcode → 扫码卡:图片强制白底 + 0.75rem 内边距。这是内容性例外——微信收款码是黑块码,深色模式下若透出页面底色就扫不出来了,注释里专门写明这里不许跟暗色主题;url → 外链卡:主色「前往打赏」按钮,hover brightness(1.08)、按下 scale(0.97)。两者缺一个字段的直接在 resolveSponsorMethods() 里过滤掉,半残数据不渲染。
全部配置收在内容仓 sponsor.yaml,经 withUserConfig("sponsor") 覆盖主题默认(默认 enable: false):
1enable: true2methods:3 - type: qrcode4 name: 微信5 image: /images/sponsor/wechat.png6 - type: qrcode7 name: 支付宝8 image: /images/sponsor/alipay.png9donors:10 - name: 某位小伙伴11 amount: 5012 date: 2026-08-15图片路径解析三态:/ 开头走 url() 适配 base path,http(s):/data: 原样,其余走构建期 resolveAsset()。收款码图片放内容仓 public/images/sponsor/——收款码属于站点内容,跟着内容仓走。
SponsorDonor { name, amount?, date?, avatar? } 渲染成 auto-fill minmax(13rem, 1fr) 网格,细节:
--initial 喂给伪元素);Intl.DateTimeFormat(siteConfig.lang) 按站点语言本地化;font-variant-numeric: tabular-nums 等宽数字 + 主色——纵向看一列金额不会跳。新页面最容易漏的是「关掉之后呢」。这个主题有一套统一的页面可用性体系:
1// 页面可用 = 页面开关 × 功能开关2siteConfig.pages.sponsor && sponsorConfig.enable任一为 false:路由跳 /404/、顶栏与移动抽屉的导航入口自动隐藏、组件零 DOM。两层开关各管一层——pages.sponsor 是「这个页面要不要存在」,sponsorConfig.enable 是「打赏功能本身开不开」。
圆角卡 + 描边沿用全站 M3E 令牌;用途说明做成 primary-container 底色的胶囊提示条;爱心 badge 是主色圆角方块图标——整页只有一个主色重点(打赏按钮),视线动线:方式 → 名单 → 按钮。
打赏页 200 行内搞定:二态卡片数据模型、内容仓配置驱动、SSR 零水合。真正值得复用的是页面可用性体系——任何新页面接进来,路由 404、导航隐藏、零 DOM 三件事自动成立。
生成精美分享图或复制链接,与更多人分享本文。
最后更新于 ,距今已过 39 天
部分内容可能已过时