723 字
4 分钟
零额外负担:可选功能应该怎么设计

博客主题很容易变成「功能堆叠」:评论、统计、音乐、动画、各种小部件。每加一个功能,作者就多一份配置负担,读者就多一份加载成本。

本站采用一个很朴素的原则:关掉的功能,必须像从未存在过一样。

什么叫「零额外负担」#

一个可选功能在 enable: false 或完全未配置时,应该满足四个条件:

维度要求
网络零外部请求
DOM零节点、零布局偏移
包体零新增依赖进入主包
兼容不要求旧文章补字段

「关掉」不是「隐藏」,而是根本不参与构建。

配置层先做判断#

最简单的做法,是在配置解析阶段就把关闭的功能过滤掉,而不是等渲染时再 if 一下:

配置层的开关判断
export const navBarConfig: NavBarConfig = {
links: pruneUnavailableNavLinks(defaultLinks, unavailableFeatureRoutes),
};

这样导航、页面入口和站点地图都拿到同一份结果,不会出现「导航没了,但页面还在」的半关闭状态。

需要交互的功能按需加载#

有些功能即使开启,也不应该进入首屏主包。例如评论系统和图表渲染,只有在页面真正需要时才动态加载:

flowchart LR
  A[页面构建] --> B{功能开启?}
  B -- 否 --> C[不生成任何资源]
  B -- 是 --> D[生成触发点]
  D --> E{用户触发?}
  E -- 否 --> F[零网络请求]
  E -- 是 --> G[动态加载模块]

为什么不用「留着以后可能有用」#

未使用的代码不会自动消失。它会进入依赖树、增加构建时间、带来安全更新负担,还会让后来的人误以为它是必要部分。

对内容作者的友好性#

零负担还有一层含义:不强迫旧内容迁移。新增一个可选字段时,旧文章不需要批量补 frontmatter;字段缺失时应该有合理默认值,而不是构建失败。

这条原则从哪里来?

它来自一次次「只是加个小功能」带来的连锁反应:配置越来越多、页面越来越慢、关掉之后还要清理残留。把约束写进规则,比事后补救更省力。

小结#

可选功能的设计难点,不在开启时的效果,而在关闭时的干净程度。一个功能只有做到「开则可用、关则无痕」,才值得长期留在主题里。

这也是本站愿意为一些小功能写更多判断逻辑的原因:复杂度应该由需要它的人承担,而不是由所有人承担。

第 11 篇,共 12 篇本文属于系列

零额外负担:可选功能应该怎么设计
https://www.ycera.cn/posts/zero-extra-burden/
作者
初月_Yuechu
发布于
2026-10-30
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取