一次 VitePress 内容站重构复盘:构建瓶颈、POC 与技术方案
这次重构的核心目标,不是单纯换一套前端框架,而是让内容型网站从“能发布”走向“可持续维护、可持续扩展、可持续优化”。当文章数量、栏目类型、SEO 要求和交互组件逐渐增加时,原有做法很容易在模板、数据、样式和构建链路之间产生耦合,后续每加一种内容形态,都可能牵动一大片页面。
因此,本次重构更像是一次内容工程化整理:保留 Markdown 写作的低门槛,同时把页面渲染、SEO、样式、客户端交互和构建产物收敛到稳定的技术边界里。
为什么需要重构
内容型网站早期通常只关注三件事:页面能打开、文章能展示、搜索引擎能收录。随着规模扩大,问题会逐渐从“有没有”变成“是否稳定、是否一致、是否容易继续增长”。
首先是 SEO 的一致性。文章、教程、列表页、首页等页面都需要准确的标题、描述和结构化信息。如果每个页面各自处理 head 标签,短期看很灵活,长期会导致规则分散、遗漏难查、批量调整困难。
其次是 Markdown 与页面外壳的边界。Markdown 适合承载正文内容,但不适合承担所有页面逻辑。如果把大量组件逻辑混进内容文件,内容编辑会变复杂,构建链路也会越来越不可控。
第三是性能与构建成本。内容站以静态输出为主,绝大多数页面不需要完整的客户端应用能力。只有少数交互区域需要浏览器端接管,因此应该优先静态化正文,把动态部分拆成按需加载的客户端岛。
最后是长期维护。技术栈越清晰,后续迁移、排错、批量生成、内容校验和 SEO 调整就越容易自动化。重构的意义不是追新,而是让网站进入更低维护成本的状态。
原有构建卡在哪里
重构前,构建耗时已经不是偶发慢,而是稳定变成了日常开发和发布中的阻力。一次完整构建往往需要数分钟级别的等待,内容越多、页面越复杂,等待时间越明显。
主要卡点集中在几个环节。
- 第一是 Markdown 页面进入框架编译链路后,页面数量一多,解析、转换、模块分析和打包都会被放大。对内容站来说,大量页面本质只是静态正文,但如果每一页都被当作更重的页面模块处理,构-建成本就会线性甚至成倍增长。
- 第二是自定义组件和示例内容混在 Markdown 中,导致构建器需要同时处理正文、组件、样式和客户端代码。原本只是展示型内容的页面,也可能被拖进更复杂的客户端构建流程。
- 第三是 SEO、导航、列表数据等信息来源不够集中。构建时既要解析内容,又要推导页面元信息,还要生成站内索引和链接关系。如果这些规则散落在不同位置,构建过程不仅慢,也更难判断究竟慢在哪一步。
- 第四是静态资源、样式和页面外壳之间缺少清晰边界。内容越多,公共布局和局部交互越容易互相影响,最终表现为构建时任务变重、变长,也更容易出现局部修改牵动整站的情况。
所以这次重构要解决的不是某一个单点报错,而是构建链路本身的负担:减少不必要的模块编译,降低 Markdown 页面成本,集中 SEO 与路由规则,把真正需要客户端能力的部分拆出来。
技术选择的理由
本次方案围绕 Vite 生态展开,主要考虑的是构建速度、生态成熟度和前端工程的可控性。
Vue 负责统一页面外壳和少量交互组件。它的组件模型适合组织导航、布局、客户端岛和页面公共结构,也方便在需要时扩展更复杂的交互。
Markdown 继续作为内容源。对于教程、文章、说明文档和知识库来说,Markdown 的优势很明确:易写、易迁移、易审查,也方便通过脚本批量处理。
markdown-it 负责正文编译。相比把每一篇 Markdown 都纳入完整的 Vue 编译链路,直接编译正文 HTML 更轻,也更适合大量内容页。
@unhead/vue 负责 SEO 注入。这样 title、description、canonical、Open Graph 等信息可以由统一规则生成,而不是散落在模板或组件内部。
Tailwind CSS 负责样式体系。对于内容型网站,实用类可以降低样式文件膨胀,同时保持布局、颜色、间距和响应式规则的一致性。
整体原则是:内容尽量静态,交互按需增强,SEO 统一注入,构建产物保持可预测。
POC 验证了什么
POC 阶段并不是为了做完整页面,而是验证几条关键路径是否成立。
- 第一条路径是 Markdown 到静态页面的输出。验证内容文件能否稳定解析 frontmatter、提取标题和描述,并输出符合预期的 URL。
- 第二条路径是统一页面外壳。正文由 Markdown 编译,外层由 Vue SSR 渲染,确保导航、布局、主题和公共元素不需要在每篇文章中重复维护。
- 第三条路径是 SEO 规则。首页、普通文章页、列表页应当能够根据不同来源生成 title 和 description,并允许 frontmatter 覆盖默认推导结果。
- 第四条路径是链接兼容。内容中常见的内部链接需要在构建时转换为最终静态路径,避免上线后出现缺失后缀、目录路径不一致等问题。
- 第五条路径是客户端岛。对于演示、工具、信息流或其他需要浏览器端能力的区域,POC 需要证明它们可以从正文静态渲染中拆出来,避免所有内容页都变成完整客户端应用。
- 第六条路径是构建耗时。POC 需要证明新的链路不仅结构更清楚,而且能实质性缩短构建时间。最终验证结果是:在保留内容输出、统一外壳、SEO 注入和链接兼容的前提下,当前完整构建时间已经稳定到约 30 秒左右。
这些验证的价值在于提前确认方向是否可靠。只要关键路径成立,后续扩展就是工程问题,而不是架构风险;只要构建时间降下来,内容更新和发布节奏也会更健康。
实质性落地方案
落地方案可以拆成五层。
-
第一层是内容层。所有文章、教程和说明类内容继续使用 Markdown 保存,frontmatter 只承担必要的元信息,例如标题、描述和分类标记。正文标题用于页面展示,SEO 标题用于搜索结果,两者不强行绑定。
-
第二层是编译层。构建阶段扫描内容目录,解析 Markdown、读取 frontmatter、提取正文摘要,并按约定生成静态路由。首页、目录页和普通页面分别走不同的 URL 输出规则,保证路径结构稳定。
-
第三层是渲染层。页面外壳由 Vue SSR 统一渲染,Markdown 正文作为 HTML 内容进入布局。这样既能保留静态站点的速度,也能让公共 UI 保持组件化。
-
第四层是 SEO 层。所有 head 信息通过统一入口注入,避免模板内零散维护。默认规则应当覆盖大多数页面,特殊页面再通过 frontmatter 或独立数据源覆盖。
-
第五层是交互层。大部分内容保持静态,复杂交互拆成客户端岛。示例演示、在线工具、接口数据展示、局部状态缓存等能力都可以按需挂载,而不是让整站承担同一套客户端运行成本。
这套方案的重点是边界清楚:内容归内容,模板归模板,SEO 归 SEO,交互归交互。边界清楚之后,团队可以分别优化写作体验、构建速度、页面性能和搜索表现。
未来网站内容类型
重构之后,网站可以更自然地承载多种内容类型。
教程类内容适合保持章节化结构,重点是知识递进、示例清晰和长期可维护。
文章类内容适合沉淀技术选型、问题排查、经验复盘和工具推荐,强调搜索友好与阅读体验。
专题类内容适合把分散知识组织成连续路径,例如某个语言、框架、工具链或工程实践的系统学习路线。
工具类内容可以通过客户端岛增强,正文负责解释使用场景,交互区域负责完成计算、预览、转换或查询。
案例类内容可以抽象呈现方法论,不暴露具体业务细节,只总结问题背景、决策过程、踩坑经验和可复用方案。
索引类内容则适合做聚合页,用于承接搜索流量、组织站内链接,并帮助用户从一个主题跳转到更细的知识点。
不同内容类型不应共享同一种页面思路。教程要清晰,文章要可读,工具要高效,专题要有路径,索引要便于扫描。重构后的架构需要支持这些差异,而不是把所有页面压成一种模板。
框架选择的取舍
VitePress 的优势在于简单、快速、面向文档场景,非常适合内容型站点起步。但当网站开始拥有更多自定义页面、SEO 规则、构建转换和局部交互时,就需要更细粒度的控制。
继续使用 Vite 生态,是因为它的开发体验和构建性能仍然适合内容站。引入 Vue SSR,是为了获得统一外壳和组件化能力。使用 markdown-it,是为了避免把所有 Markdown 都变成重量更高的页面模块。使用 @unhead/vue,是为了让 SEO 成为集中规则,而不是分散实现。
这并不意味着框架越多越好。真正重要的是每个工具只负责它擅长的事情:Vite 负责构建,Vue 负责外壳,Markdown 负责内容,Unhead 负责 head 管理,Tailwind 负责样式约束。
选择框架时,不能只看“能不能做”,还要看“长期做下去会不会越来越重”。内容站最怕的是早期方便,后期每一次新增都要绕过历史包袱。好的技术选择应该让新增页面、新增栏目、新增交互都尽量落在已有边界内。
这次重构带来的变化
重构之后,网站的核心收益主要体现在三个方面。
- 第一,构建反馈明显变快。过去完整构建容易进入数分钟等待,现在重构后的构建时间约 30 秒左右,日常修改、验证和发布都轻了很多。
- 第二,内容生产更稳定。Markdown 仍然是主要写作方式,作者不需要理解复杂组件,也不需要在正文里处理页面级逻辑。
- 第三,页面规则更统一。URL、SEO、布局、静态资源和客户端交互都有明确入口,后续排查问题时能快速定位到对应层。
- 第四,扩展空间更清晰。未来无论增加教程专题、文章聚合、轻量工具,还是更复杂的交互模块,都可以沿着客户端岛和统一构建规则继续演进。
一次好的重构,不应该只是把代码搬到新目录,也不应该只是换一个更流行的框架。它应该减少未来每一次修改的摩擦,让内容增长、体验优化和技术维护可以并行推进。
这次 VitePress 内容站重构的价值,正在于把“页面能跑”升级为“体系能长”。对于长期运营的技术网站来说,这比某个单点功能更重要。