让个人站经得起时间
这篇写 Fox v2 的后台秩序,为什么内容、配置、组件、文档和构建规则会决定一个个人站能不能长期写下去。
我现在越来越相信,一个个人站最难的地方,不是把第一版做出来。
第一版反而是最容易兴奋的时候。想法很多,耐心也多。你可以熬几个晚上,把首页、文章列表、照片墙、杂谈、主题色和动效一口气推到一个能看的状态。甚至哪怕结构有点乱,也会因为新鲜感而被暂时忽略。
真正的考验在后面。
三个月后,你还愿不愿意回来写文章。
半年后,你还看不看得懂当时为什么这样分目录。
一年后,当你想给照片墙加一点新能力,或者想把搜索、RSS、标签和归档补完整时,项目会不会像一团旧毛线一样把你缠住。
这才是个人站的长期问题。
所以这次重构 Fox v2,我越来越不把它当成一次页面改版。
我更愿意把它理解成一次秩序重建。
前台体验决定访问者愿不愿意继续看,后台秩序决定我自己愿不愿意继续写。两件事缺一件都不行。只有漂亮页面,没有内部秩序,时间一长就会变成难以维护的壳。只有内部秩序,没有表达气质,站点又会像一份目录清楚但没人想读的说明书。
Fox v2 要解决的,是这两个东西怎么同时存在。
这篇主要聊后一个。
也就是个人站怎样经得起时间。
一、内容应该像内容
我最早对内容系统的不舒服,来自一个很小的细节。
写内容时,我感觉自己像在改代码。
这句话听起来有点奇怪。因为个人站本来就是代码项目,写文章当然会碰到文件。但这里的关键不是文件,而是心理状态。
如果一篇文章藏在 TypeScript 数组里,照片故事也像配置项一样被塞进数据文件,杂谈又是另一份临时结构,那么每次新增内容,我都要先进入工程模式。我要看字段名,想数组位置,担心逗号和类型,确认它会不会影响页面。
这会削弱写作欲望。
写作本来已经够难了。你要想清楚自己要说什么,要组织句子,要面对自己其实没想明白的地方。如果写之前还要先穿过一层工程摩擦,很多内容就会死在门口。
所以 Fox v2 这次把正式内容放进 src/content/。
文章去 posts。
照片去 photos。
杂谈去 notes。
未来视频先留 videos。
每一条内容都是 Markdown 或 MDX 文件。文件相对路径生成公开地址。资料卡放在 Frontmatter 里,正文放在下面。
这件事听起来很普通。
但普通恰恰是它的价值。
我写文章时,不需要再感觉自己是在改一个页面组件。我只是在写一篇文章。标题、摘要、发布时间、状态、标签、分类、封面和 SEO 信息,都像内容的资料卡。正文就是正文。
内容终于回到了内容的位置。
这一步对长期维护很关键。因为一个个人站如果想写很多年,新增内容这件事必须足够轻。不能每次都像开一次小型施工会。
我希望未来的自己打开项目时,第一眼就知道。
想写东西,去内容目录。
想改页面,去页面入口。
想调展示,去组件。
想改主题,去样式和设计 token。
这种清楚不是洁癖。
它是在保护表达。
二、状态字段是一种诚实
内容系统里有一个很不起眼的字段,叫状态。
published 是公开,draft 是草稿,unlisted 是不进入公开列表的内容。
这种字段看起来像技术细节,其实非常像一种写作伦理。
不是所有内容都应该被公开。
不是所有写完的东西都准备好了。
也不是所有页面入口都应该假装已经完成。
个人站最怕的一种状态,是半成品到处露出来,但页面又装作一切正常。点进一个标签页是 404,搜索入口打开是空白,RSS 链接还没真正生成,照片详情看似存在但没有稳定规则。这种东西会慢慢消耗站点可信度。
所以 Fox v2 里公开列表默认只展示 published。草稿和未列出内容不进入首页、RSS、标签和归档。未完成页面如果已经进入导航,就用建设中页面兜底,而不是让访问者掉进不可控的空洞。
这不是保守。
这是诚实。
我宁愿告诉你,这里还在整理,也不想伪装成已经做完。
这种诚实对自己也有帮助。草稿可以安全地存在,不必因为还没写好就被迫删除。未公开内容可以留作未来素材,不会突然跑到首页。公开内容则承担公开内容应该承担的责任。
个人站如果没有状态边界,很容易把自己逼成两种极端。
要么什么都不敢放。
要么什么都随手放。
状态字段让中间地带出现了。
这对长期写作很重要。
三、配置不能到处散
一个站点时间长了,最容易散掉的是配置。
站点名在哪里,社交链接在哪里,首页状态在哪里,SEO 默认值在哪里,主题图片在哪里,导航在哪里。第一版做的时候,随手写在组件里很方便。反正就一个地方用,反正以后再说。
但「以后再说」会变成债。
当你想改站点名称,发现页面里散着好几份。当你想调整首页 Now,发现文案写在组件里。当你想改默认封面,发现列表页和详情页各有自己的判断。当你想改社交链接,发现首屏和页脚不是同一个来源。
这时候你就不想改了。
不是因为改动大,而是因为你不知道哪里才算改完。
Fox v2 把这些东西收回到 src/config/。站点信息在站点配置里,首页状态在首页配置里,主题图片和签名在主题配置里,导航、社交和 SEO 也各自有自己的位置。
配置只表达稳定事实。
不放渲染逻辑。
这句话很重要。配置不是另一个组件,也不是为了把代码藏起来。配置只是告诉项目,哪些东西是全站事实,哪些东西可以被页面读取。
比如首页 Now 里的更新文案、最近在读、最近在听,就应该是配置,而不是写死在组件里。组件负责展示它,不负责拥有它。
这种分离会让项目变得安静。
未来我要换一本书,换一首歌,调整一句近况,只需要去一个地方。页面不会因为内容变化被迫重新理解结构。
很多长期维护的轻松感,就是从这种小地方来的。
四、组件要知道自己的边界
个人项目很容易写着写着就把所有东西塞进一个页面文件。
一开始很爽。
因为你不用跳文件,不用想抽象,也不用命名。页面从上往下写,哪里缺什么就补什么。直到某天你打开它,发现里面混着数据、配置、样式类名、交互状态、图片逻辑、空状态、链接规则和一堆临时判断。
这时它就不再是页面。
它变成了一个不能碰的盒子。
Fox v2 对这个问题的处理很直接。src/app/ 只放路由、布局、页面入口和 metadata。首页页面只负责组装。首页业务组件放在 src/components/home/。内容展示组件放在 src/components/content/。通用基础组件放在 src/components/ui/。
这听起来像目录规范。
但目录规范背后,其实是责任规范。
一个组件应该知道自己负责什么,也应该知道自己不负责什么。
HomeSnapshot 负责展示当前状态概览,不应该自己拥有所有状态事实。HomeFeaturedContent 负责组织首页 Recent 区域,不应该知道内容怎么从 Markdown 里被读出来。文章详情组件负责呈现详情模型,不应该临时决定哪些文章公开。
边界清楚之后,修改才有方向。
如果文章排序错了,去内容读取和排序逻辑找。
如果文章详情排版不舒服,去内容组件和内容样式找。
如果首页卡片不对,去首页组件找。
如果主题色不稳,去设计 token 找。
没有边界时,每个问题都像全局问题。
有边界后,大多数问题会变回局部问题。
这就是长期维护的核心。
把问题变小。
五、样式也需要秩序
很多个人站越改越乱,不是因为功能复杂,而是因为样式没有秩序。
今天在组件里写一个颜色,明天在全局样式里塞一段页面专属规则,后天为了修一个移动端问题又补一个更强的选择器。短期看都能解决问题。长期看,页面会变成一个靠记忆维持的东西。
你不敢删。
也不敢改。
因为你不知道哪一条样式正在撑住哪个角落。
Fox v2 把样式按职责拆开。全局入口只做入口,主题 token 放在 theme.css,基础排版放在 typography.css,跨组件复用样式放在 components.css,首页样式放在 home.css,内容页面样式放在 content.css,通用动效放在 transitions.css。
这些文件名本身就是提醒。
你要改首页,就不要把规则塞进全局。
你要改主题,就不要在组件里手写颜色。
你要改动效,就要考虑减少动画偏好。
这里有一个很容易被低估的东西,设计 token。通俗说,它就是把颜色、圆角、阴影、布局宽度这些基础设计选择变成统一变量。这样页面不是到处记一堆零散颜色,而是用同一套语言说话。
浅色模式的暖白纸感、樱粉强调色,深色模式的深绿灰背景,玻璃面板的透明度、边框、模糊和阴影,都应该从这套语言里出来。
这样设计才不会随着每次小修改漂移。
长期项目最怕漂移。
漂移不是大错,它是一点点发生的。一个按钮颜色略深,一个卡片阴影略重,一个页面圆角略软。几个月后,站点还在,但气质散了。
样式秩序,就是为了减少这种慢性损耗。
六、文档不是给别人看的
我以前也会觉得,个人项目写这么多文档是不是有点夸张。
后来我改观了。
文档当然可以给别人看,但在个人站里,它更像是写给未来的自己。
因为未来的自己不一定记得今天的自己为什么做这个决定。
为什么首页不是营销页。为什么文章、照片、杂谈是核心内容类型。为什么默认使用 Server Component。为什么内容要进 src/content/。为什么公开列表只展示 published。为什么页面改动需要验收。为什么不直接启动长期挂起的本地服务。
这些东西如果只存在脑子里,很快就会丢。
一旦丢了,项目就会被情绪接管。
今天觉得这个酷,就加。明天觉得那个方便,就塞。后天又觉得之前太复杂,开始删。每次都像在重新发明规则。
Fox v2 的文档把这些规则写下来。项目总说明、产品页面规格、设计系统、工程规范、路线图、SEO 和部署、组件规格、代码规范、测试规划。看起来很多,但它们其实在回答同一个问题。
这个站为什么这样做。
有了这个答案,后续修改就不会完全靠感觉。
文档不是为了让项目显得正式。
它是为了减少反复。
尤其是个人项目,最容易被热情推动,也最容易被热情抛弃。文档的作用,是在热情降下来之后,还能给你一条路。
你不需要重新鼓起很大的劲。
你只要沿着已经写好的规则继续走。
七、构建和验收是边界感
一个能长期维护的站,不能只靠「我觉得应该没问题」。
我在 Fox v2 里很重视构建和验收,不是因为我喜欢跑命令,而是因为它们能帮我发现自己忽略的地方。
npm run build 会先做 Next.js 静态导出,再用 Pagefind 扫描输出目录生成搜索索引。这个过程可以确认公开页面能不能正常生成,文章详情、RSS、标签、搜索索引这些东西是否还连得上。
这对内容站尤其重要。
因为内容不是静止的。今天新增一篇文章,明天加一个标签,后天改一个日期。如果内容字段缺失时静默回退,或者草稿误进公开列表,这些问题很难靠肉眼一次看出来。
构建像一次比较冷静的检查。
它不关心我写得多有感觉。
它只问项目能不能生成。
页面验收则是另一层。构建通过不等于体验通过。页面可能能生成,但移动端横向滚动,深色模式不清楚,按钮没有可访问名称,图片加载失败后布局难看,文本在卡片里溢出。
这些都需要看页面。
所以项目规则里要求用户可见页面改动要用内置浏览器验收。这个要求看起来严格,但它其实是在保护访问者。
个人站也是产品。
只要有人打开,它就有体验责任。
八、RSS 和搜索是给未来留门
RSS 和搜索这两个东西,在个人站里很容易被低估。
因为它们不太显眼。
首页做好了,别人立刻能看到。文章卡片做好了,视觉变化很明显。RSS 做好了,可能只有少数订阅工具会用。搜索做好了,也只有内容变多之后才显出价值。
但正是这种不显眼的能力,决定站点能不能积累。
RSS 是给长期读者留的一扇门。不是每个人都会每天打开我的主页,但有人可能愿意在订阅工具里看到更新。只输出已发布文章,不包含草稿和未列出内容,按发布时间倒序,链接指向文章详情页。这些规则保证了订阅体验不乱。
搜索是给未来内容量准备的路。
现在文章不多时,搜索看起来没那么必要。但如果一个站真的写了几年,内容会变成森林。没有搜索,连自己都很难找回某个旧想法。Pagefind 这种静态全文搜索适合这个阶段,因为它不需要复杂服务,也符合静态站的部署方式。
这两个能力都不是为了显得功能完整。
它们是在承认一件事。
内容会变多。
站点会变老。
而我希望它变老之后仍然可用。
还有一个更实际的原因。
当内容越来越多,站点会开始反过来影响写作方式。没有搜索时,我很难确认自己以前有没有写过类似想法。没有 RSS 时,更新只能被动等人打开首页看到。没有稳定链接时,旧文章很难被再次引用。没有标签和归档时,内容之间的关系也会变薄。
这些能力不是给机器看的。
它们是在给内容留下回路。
一篇文章写完后,不应该只在发布当天出现一次。它应该能被搜索找回,被标签重新串起来,被订阅工具送到读者面前,也能在另一篇文章的上下文里再次出现。这样内容才不是孤岛。
个人站如果想经得起时间,就要让旧内容还有被重新看见的机会。
九、长期维护不是把事情做复杂
说到这里,很容易产生一个误会。
是不是为了长期维护,就要把个人站做得很复杂。
我觉得恰好相反。
长期维护的目标,是让复杂度待在该待的地方。
内容就是内容,配置就是配置,组件就是组件,样式就是样式,工具函数就是工具函数,文档就是文档。不是每件事都要抽象,也不是每个临时需求都要设计一套未来扩展方案。
有些地方应该简单。
比如首页不需要承担完整内容浏览。
比如分页不是第一阶段必需能力。
比如友链和关于页没准备好,就用建设中页面诚实兜底。
比如视频内容先保留目录和规则,不急着做入口。
这种克制和前台体验里的克制是一回事。
前台不把所有东西摆出来。
后台也不把所有未来都提前实现。
能长期走下去的项目,往往不是最聪明的项目,而是最不容易把自己拖垮的项目。每次只做真正需要的东西,每次把边界放回正确位置,每次改完都有验收方法。
这听起来慢。
但慢不是坏事。
慢可以让一个个人站活得久一点。
十、我想给未来的自己少留一点债
Fox v2 这次重构,最打动我的地方不是某个页面变好看了。
而是我觉得未来的自己会少骂现在的自己几句。
他想写文章时,不需要先猜内容在哪里。
他想改首页近况时,不需要翻组件。
他想调整主题时,不需要全站搜索某个颜色。
他想查为什么这么设计时,能在文档里找到理由。
他想确认改动有没有破坏页面时,有构建和验收规则。
这就是后台秩序的意义。
它不是为了服务某个抽象的工程洁癖,而是为了让后来的每一次表达都更轻一点。
个人站是很私人化的东西。它不像公司项目,有明确排期、明确负责人、明确收益。它靠的是一种很脆弱的愿意。今天愿意写,明天愿意改,过几个月还愿意回来看看。
这种愿意,需要被保护。
混乱会消耗它。
清楚会保存它。
所以我现在看 Fox v2,不只是在看一个网站。
我是在看一套能不能让自己继续写下去的生活装置。
它有前台的安静,有后台的秩序,有内容的入口,有未完成的诚实,也有一点对未来的耐心。
这可能就是我想要的个人站。
不是一次做完。
而是经得起一次次回来。
本文采用知识共享 CC BY-NC-SA 4.0 协议发布。
- 作者
- fox
- 最后更新