[{"data":1,"prerenderedAt":443},["ShallowReactive",2],{"post-\u002Fposts\u002F63afeff4":3,"post-nav-\u002Fposts\u002F63afeff4":399,"post-related-\u002Fposts\u002F63afeff4":419},{"id":4,"title":5,"abbrlink":6,"aisummary":7,"body":8,"category":384,"cover":385,"date":386,"description":387,"draft":388,"extension":389,"featured":388,"meta":390,"navigation":307,"path":391,"pinned":388,"seo":392,"stem":393,"tags":394,"updated":385,"__hash__":398},"posts\u002Fposts\u002Fdeleted-90-percent.md","我删掉了站点的 90% 功能","63afeff4","作者分享了简化博客站点功能的过程，删除了90%的非核心功能，包括后台管理、评论系统和多个次要页面，以减少维护负担。通过去除不必要的代码，提升了性能指标，如FCP和LCP显著缩短，JS体积大幅减少。作者发现删除功能更难的是心理层面，制定规则后逐步清理，最终保留了核心内容，使写作流程更加高效便捷。",{"type":9,"value":10,"toc":376},"minimark",[11,15,18,21,25,28,95,98,101,104,150,153,156,166,169,172,175,236,239,242,321,324,327,330,336,339,342,345,355,366,369,372],[12,13,14],"p",{},"上一个版本的博客有 14 个页面、3 个第三方脚本、一套后台、还有评论系统。",[12,16,17],{},"我每个月写两篇文章。",[12,19,20],{},"这两件事之间存在严重的不匹配。",[22,23,24],"h2",{"id":24},"先算笔账",[12,26,27],{},"我把访问数据拉出来看了看：",[29,30,31,47],"table",{},[32,33,34],"thead",{},[35,36,37,41,44],"tr",{},[38,39,40],"th",{},"页面",[38,42,43],{},"月访问",[38,45,46],{},"占比",[48,49,50,62,73,84],"tbody",{},[35,51,52,56,59],{},[53,54,55],"td",{},"首页",[53,57,58],{},"1,240",[53,60,61],{},"41%",[35,63,64,67,70],{},[53,65,66],{},"文章详情",[53,68,69],{},"1,510",[53,71,72],{},"50%",[35,74,75,78,81],{},[53,76,77],{},"归档",[53,79,80],{},"180",[53,82,83],{},"6%",[35,85,86,89,92],{},[53,87,88],{},"其他所有页面",[53,90,91],{},"90",[53,93,94],{},"3%",[12,96,97],{},"「其他所有页面」包括：分类索引、标签云、友链、关于、搜索页、404、两个我忘了当初为什么建的空页面。",[12,99,100],{},"它们加起来占了 3% 的流量，却占了我 70% 的维护时间。",[22,102,103],{"id":103},"删掉的清单",[105,106,107,115,121,127,133,139],"ul",{},[108,109,110,114],"li",{},[111,112,113],"strong",{},"后台管理"," —— 我用 Vim 写 markdown 比用任何后台都快",[108,116,117,120],{},[111,118,119],{},"评论系统"," —— 一年收到 4 条评论，其中 3 条是垃圾",[108,122,123,126],{},[111,124,125],{},"访问统计的第三方脚本"," —— 一个用了 8 年的静态博客，我不需要实时看板",[108,128,129,132],{},[111,130,131],{},"搜索独立页"," —— 搜索应该是弹窗，不该是一次页面跳转",[108,134,135,138],{},[111,136,137],{},"分类页的独立布局"," —— 它和标签页长得一模一样，为什么要写两遍",[108,140,141,144,145,149],{},[111,142,143],{},"暗色模式的切换动画库"," —— 我写了 40 行 ",[146,147,148],"code",{},"clip-path"," 替代了它",[22,151,152],{"id":152},"保留的东西",[12,154,155],{},"删完之后剩下这些，一个都不能少：",[157,158,163],"pre",{"className":159,"code":161,"language":162},[160],"language-text","\u002F                 首页，最新文章列表\n\u002Fposts\u002F[slug]     文章\n\u002Farchive          归档\n\u002Fcategories       分类\n\u002Ftags             标签\n\u002Flinks            友链\n\u002Fabout            关于\n\u002Frss.xml          订阅\n","text",[146,164,161],{"__ignoreMap":165},"",[12,167,168],{},"九个路由。其中三个（分类、标签、归档）共用同一个列表组件——它们本来就是同一个东西的不同切片。",[22,170,171],{"id":171},"性能是删出来的",[12,173,174],{},"改动前后，用 Lighthouse 在同一台机器上测：",[29,176,177,190],{},[32,178,179],{},[35,180,181,184,187],{},[38,182,183],{},"指标",[38,185,186],{},"改前",[38,188,189],{},"改后",[48,191,192,203,214,225],{},[35,193,194,197,200],{},[53,195,196],{},"FCP",[53,198,199],{},"1.8s",[53,201,202],{},"0.4s",[35,204,205,208,211],{},[53,206,207],{},"LCP",[53,209,210],{},"2.3s",[53,212,213],{},"0.6s",[35,215,216,219,222],{},[53,217,218],{},"JS 体积",[53,220,221],{},"284 KB",[53,223,224],{},"41 KB",[35,226,227,230,233],{},[53,228,229],{},"首屏请求数",[53,231,232],{},"23",[53,234,235],{},"6",[12,237,238],{},"没有做任何「优化」。没有拆包、没有预加载、没有 CDN 调优。",[12,240,241],{},"我只是不再发送用户不需要的代码。",[157,243,247],{"className":244,"code":245,"language":246,"meta":165,"style":165},"language-js shiki shiki-themes github-light github-dark","\u002F\u002F 删之前：每个页面都加载完整运行时\nimport { Analytics } from '@heavy\u002Fanalytics'\nimport { Comments } from '@heavy\u002Fcomments'\nimport { AdminWidget } from '@heavy\u002Fadmin'\n\n\u002F\u002F 删之后：什么都没有\n\u002F\u002F 静态 HTML + 一个 3KB 的搜索索引（首次搜索才加载）\n","js",[146,248,249,258,276,289,302,309,315],{"__ignoreMap":165},[250,251,254],"span",{"class":252,"line":253},"line",1,[250,255,257],{"class":256},"sJ8bj","\u002F\u002F 删之前：每个页面都加载完整运行时\n",[250,259,261,265,269,272],{"class":252,"line":260},2,[250,262,264],{"class":263},"szBVR","import",[250,266,268],{"class":267},"sVt8B"," { Analytics } ",[250,270,271],{"class":263},"from",[250,273,275],{"class":274},"sZZnC"," '@heavy\u002Fanalytics'\n",[250,277,279,281,284,286],{"class":252,"line":278},3,[250,280,264],{"class":263},[250,282,283],{"class":267}," { Comments } ",[250,285,271],{"class":263},[250,287,288],{"class":274}," '@heavy\u002Fcomments'\n",[250,290,292,294,297,299],{"class":252,"line":291},4,[250,293,264],{"class":263},[250,295,296],{"class":267}," { AdminWidget } ",[250,298,271],{"class":263},[250,300,301],{"class":274}," '@heavy\u002Fadmin'\n",[250,303,305],{"class":252,"line":304},5,[250,306,308],{"emptyLinePlaceholder":307},true,"\n",[250,310,312],{"class":252,"line":311},6,[250,313,314],{"class":256},"\u002F\u002F 删之后：什么都没有\n",[250,316,318],{"class":252,"line":317},7,[250,319,320],{"class":256},"\u002F\u002F 静态 HTML + 一个 3KB 的搜索索引（首次搜索才加载）\n",[22,322,323],{"id":323},"一个反直觉的发现",[12,325,326],{},"删功能最难的从来不是技术，是心理。",[12,328,329],{},"每删一个东西，我都会想：「万一以后要用呢？」",[12,331,332,333],{},"后来我给自己定了个规则：",[111,334,335],{},"如果要重新加回来，成本低于 2 小时，那就先删掉。",[12,337,338],{},"后台管理？重写要 8 小时，不删。评论系统？接第三方要 20 分钟，删。搜索页？改成弹窗要 1 小时，删。",[12,340,341],{},"这条规则让我删掉了大约 60% 的东西，而没有任何一个功能被真的加回来过。",[22,343,344],{"id":344},"结论",[346,347,348],"blockquote",{},[12,349,350,351,354],{},"一个博客的核心是：",[111,352,353],{},"让人能读到文章。"," 其他一切都是配角。",[12,356,357,358,361,362,365],{},"我现在写一篇新文章的工作流是：新建一个 ",[146,359,360],{},".md"," 文件，写 frontmatter，写正文，",[146,363,364],{},"git push","。",[12,367,368],{},"三十秒后它就在线上了，带 RSS、带搜索索引、带 OG 图。",[12,370,371],{},"这才是写博客该有的摩擦系数。",[373,374,375],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#57606A;--shiki-dark:#9AA4B0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":165,"searchDepth":260,"depth":260,"links":377},[378,379,380,381,382,383],{"id":24,"depth":260,"text":24},{"id":103,"depth":260,"text":103},{"id":152,"depth":260,"text":152},{"id":171,"depth":260,"text":171},{"id":323,"depth":260,"text":323},{"id":344,"depth":260,"text":344},"工程",null,"2025-10-12","一个博客需要什么？列表、文章、归档、搜索、订阅。其他东西我全删了，然后发现加载时间从 2.3 秒掉到了 380 毫秒。",false,"md",{},"\u002Fposts\u002F63afeff4",{"title":5,"description":387},"posts\u002Fdeleted-90-percent",[395,396,397],"性能","架构","反思","s1XGOdM-MNOJwSMwVEJ4mOBktpTLuGP522L3pb6zjwc",{"prev":400,"next":410},{"path":401,"title":402,"description":403,"date":404,"updated":385,"tags":405,"category":384,"cover":409,"draft":388,"pinned":307,"featured":388},"\u002Fposts\u002F57060fdd","特殊字符与代码块压测：& \u003C > \" ' 全都要","一篇专门用来喂 RSS\u002FAtom 校验器的文章。正文里塞满了 & \u003C > 引号、CDATA 边界、嵌套代码块和原始 HTML 片段。","2025-10-20",[406,407,408],"RSS","XML","测试","\u002Fimages\u002Fcovers\u002Fcharset.png",{"path":411,"title":412,"description":413,"date":414,"updated":385,"tags":415,"category":384,"cover":385,"draft":388,"pinned":388,"featured":388},"\u002Fposts\u002F26fa10db","中文分词为什么把搜索做坏了","MiniSearch 默认按空格切词，对中文来说等于完全失效。这篇讲 CJK 该怎么切，以及 bigram 加单字兜底为什么比单纯整词匹配更靠谱。","2025-09-30",[416,417,418],"搜索","MiniSearch","中文",[420,427,435],{"path":421,"title":422,"description":423,"date":424,"updated":385,"tags":425,"category":384,"cover":385,"draft":388,"pinned":388,"featured":388},"\u002Fposts\u002Fff906e7f","静态博客的搜索为什么不用后端","300KB 的索引、一次懒加载、纯前端查询。对一个几百篇文章的博客来说，这个方案比任何搜索引擎都合适。","2025-09-05",[416,396,426],"SSG",{"path":428,"title":429,"description":430,"date":431,"updated":385,"tags":432,"category":384,"cover":385,"draft":388,"pinned":388,"featured":388},"\u002Fposts\u002F71970a13","一个配置文件能解决多少问题","零硬编码听起来是教条，实践起来是架构约束。这篇讲我怎么用四个配置文件把全站的可变内容抽干净，以及它带来的真实收益。","2025-07-10",[396,433,434],"配置","可维护性",{"path":436,"title":437,"description":438,"date":439,"updated":385,"tags":440,"category":384,"cover":442,"draft":388,"pinned":388,"featured":307},"\u002Fposts\u002Ff50285d4","测试文章甲：带封面的推荐位文章","这是首页改版验收用的测试文章甲，有封面且标记为 featured，应出现在顶部轮播第一位。","2026-11-01",[408,441],"首页改版","\u002Fimages\u002Fcovers\u002Fview-transition.png",1794495070320]