修复:增加回到顶部功能,优化博客性能

This commit is contained in:
2026-09-21 09:37:31 +08:00
parent b0e7d40faf
commit 219cb712a6
27 changed files with 845 additions and 373 deletions
+30 -1
View File
@@ -26,7 +26,7 @@
| 代码块 | Expressive Code(行号、折叠、语言徽章、自定义复制按钮) |
| 数学公式 | remark-math + KaTeX |
| 站内搜索 | Pagefind(构建时索引) |
| 页面切换 | Swup |
| 页面切换 | Astro View Transitions(`<ClientRouter />`) |
| 部署 | `./deploy.sh`(rsync 到树莓派 + 云服务器) |
| 评论系统 | 自托管的 [twikoo](https://twikoo.js.org)(见下) |
@@ -60,6 +60,7 @@ src/
├── content/ Markdown 内容集合(见下)
├── data/ 站点配置:站点信息、个人信息、相册、评论、友链
├── styles/ 全局 CSS
├── scripts/ 浏览器侧交互(lifecycle 契约,见下)
├── plugins/ 自定义 remark / rehype / Expressive Code 插件
├── lib/ hooks/ 支撑逻辑
public/ 原样拷贝到产物根目录的静态资源
@@ -68,6 +69,34 @@ public/ 原样拷贝到产物根目录的静态资源
scripts/ 内容工具脚本
```
## 交互层
除了 React islands,站点还有一批「绑全局监听 / 操作 DOM」的原生脚本(主题切换、
代码复制、github 卡片、灯箱、移动端菜单、评论、回到顶部)。它们都注册在
`src/scripts/interactions.ts`,由 `src/layouts/BaseLayout.astro` 引一次。
因为页面切换走 `<ClientRouter />`(Astro View Transitions),DOM 每次导航都会被换掉,
而**模块脚本只会求值一次**。所以新增交互不要自己监听 `astro:page-load`、也不要用
`window.__xxxBound` 防重复绑定,改用 `src/scripts/lifecycle.ts`:
```ts
import { onPage } from "@/scripts/lifecycle"
onPage("my-widget", () => {
const el = document.querySelector("[data-my-widget]")
if (!el) return // 本页没有这个组件:不挂载,也不报错
const onClick = () => { /* ... */ }
el.addEventListener("click", onClick)
return () => el.removeEventListener("click", onClick) // astro:before-swap 时调用
})
```
`lifecycle` 在 `astro:before-swap` 卸载全部、在 `astro:page-load` 挂载全部,
并保证首屏、切页、模块重复求值这三种情况下都不会重复绑定或漏绑。
页面级的小交互如果**不需要 JS** 就别写 JS:阅读进度条和回到顶部按钮的显隐都由
CSS 滚动驱动动画(`animation-timeline: scroll()`)负责,脚本只管点击与老浏览器降级。
## 写作
内容集合定义在 `src/content/config.ts`,共三个: