[{"data":1,"prerenderedAt":52},["ShallowReactive",2],{"category-工程":3},{"name":4,"posts":5},"工程",[6,19,28,37,44],{"path":7,"title":8,"description":9,"date":10,"updated":11,"tags":12,"category":4,"cover":16,"draft":17,"pinned":18,"featured":17},"\u002Fposts\u002Fxml-escaping-stress-test","特殊字符与代码块压测：& \u003C > \" ' 全都要","一篇专门用来喂 RSS\u002FAtom 校验器的文章。正文里塞满了 & \u003C > 引号、CDATA 边界、嵌套代码块和原始 HTML 片段。","2025-10-20",null,[13,14,15],"RSS","XML","测试","\u002Fimages\u002Fcovers\u002Fcharset.png",false,true,{"path":20,"title":21,"description":22,"date":23,"updated":11,"tags":24,"category":4,"cover":11,"draft":17,"pinned":17,"featured":17},"\u002Fposts\u002Fdeleted-90-percent","我删掉了站点的 90% 功能","一个博客需要什么？列表、文章、归档、搜索、订阅。其他东西我全删了，然后发现加载时间从 2.3 秒掉到了 380 毫秒。","2025-10-12",[25,26,27],"性能","架构","反思",{"path":29,"title":30,"description":31,"date":32,"updated":11,"tags":33,"category":4,"cover":11,"draft":17,"pinned":17,"featured":17},"\u002Fposts\u002Fcjk-tokenizer","中文分词为什么把搜索做坏了","MiniSearch 默认按空格切词，对中文来说等于完全失效。这篇讲 CJK 该怎么切，以及 bigram 加单字兜底为什么比单纯整词匹配更靠谱。","2025-09-30",[34,35,36],"搜索","MiniSearch","中文",{"path":38,"title":39,"description":40,"date":41,"updated":11,"tags":42,"category":4,"cover":11,"draft":17,"pinned":17,"featured":17},"\u002Fposts\u002Fstatic-search","静态博客的搜索为什么不用后端","300KB 的索引、一次懒加载、纯前端查询。对一个几百篇文章的博客来说，这个方案比任何搜索引擎都合适。","2025-09-05",[34,26,43],"SSG",{"path":45,"title":46,"description":47,"date":48,"updated":11,"tags":49,"category":4,"cover":11,"draft":17,"pinned":17,"featured":17},"\u002Fposts\u002Fzero-hardcode","一个配置文件能解决多少问题","零硬编码听起来是教条，实践起来是架构约束。这篇讲我怎么用四个配置文件把全站的可变内容抽干净，以及它带来的真实收益。","2025-07-10",[26,50,51],"配置","可维护性",1794113902385]