修复:增加回到顶部功能,优化博客性能
This commit is contained in:
@@ -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`,共三个:
|
||||
|
||||
Reference in New Issue
Block a user