为什么我又搭了一个个人主页

不是没有地方写东西,而是没有一个地方能同时放文章、小游戏和工具。顺便说说这次的技术选型为什么是 Astro 而不是 VitePress。

我一直觉得,个人主页这东西的价值不在于「有」,而在于「顺手」。过去几年我搭过三版,每一版都死在同一个地方:想加一个小游戏,或者一个工具,结果发现整个站点的结构不允许。

问题的形状

把需求摊开会发现它其实是两类东西:

  • 内容型:文章、关于页。它们要的是首屏快、SEO 好、读完就走。
  • 应用型:小游戏、在线工具。它们要的是交互流畅、JS 体积可控、故障不要传染。

文档型框架(VitePress、Docusaurus)的生来假设是「站点由页面组成」,而应用页只是页面的一种。但真正写起来你会发现,一个需要 canvas、需要键盘输入、需要独立状态的东西,和一篇 Markdown 文章的共同点少得可怜。

为什么最后选了 Astro

我原本的首选是 VitePress —— 我熟悉 Vue,它也够简单。但有几个点让我换了:

  1. VitePress 没有内置博客。分类、标签、归档、RSS 全要自己基于 createContentLoader 写,社区方案基本是主题级 fork。
  2. Markdown 即路由。纯应用页必须写成 xxx.md 再包一层 <ClientOnly>,还要用 layout: page 甩掉侧边栏。
  3. 最要命的:没有视口级的懒加载defineAsyncComponent 是渲染即加载,不是进入视口才加载。

Astro 的 islands 模型正好补上第三点 —— 它不只是异步下载 chunk,而是把水合本身推迟到需要的时候。同时 @astrojs/vue 让我继续写 .vue 单文件组件,之前的习惯一点没浪费。

这个站点的结构

三类页面,三套策略:

类型 例子 JS 策略
内容型 首页、文章 纯静态 HTML,接近零 JS
索引型 博客列表、游戏列表 静态清单,交互部分单独做 island
应用型 贪吃蛇、JSON 工作台 静态空壳 + 按需加载 Vue 应用

写文章的时候完全不用考虑游戏那边的事,反过来也一样。这就是我想要的。

← 返回文章列表

评论