<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>时过境迁技术笔记</title>
    <link>https://hsgjq.top</link>
    <description>一个记录前端与 Node 实践的个人博客，内容围绕 Vue、Nuxt、NestJS 与工程化展开，附源码级的原理笔记。</description>
    <item>
      <title>一个 401，查出四个前端机制：缓存回放、隐藏页的 rAF、百分比圆角、缓动过冲</title>
      <link>https://hsgjq.top/posts/gang-deng-lu-jiu-guo-qi-yi-ci</link>
      <guid>https://hsgjq.top/posts/gang-deng-lu-jiu-guo-qi-yi-ci</guid>
      <pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate>
      <description>响应头里的 token 被 304 原样回放，把刚签发的新 token 顶掉，表现成刚登录就过期。顺带记三个前端细节：隐藏标签页里 rAF 不执行、扁盒子的 50% 圆角是胶囊、缓动曲线的过冲只有 0.0008。</description>
    </item>
    <item>
      <title>点「项目」页面就死：一次客户端无限重定向</title>
      <link>https://hsgjq.top/posts/dian-xiang-mu-ye-mian-jiu-si-yi</link>
      <guid>https://hsgjq.top/posts/dian-xiang-mu-ye-mian-jiu-si-yi</guid>
      <pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate>
      <description>为了保留旧地址大小写加的一条跳转规则，被注册成了客户端路由；路由匹配不区分大小写，于是它自己跳自己。</description>
    </item>
    <item>
      <title>从打包上传到 push 即上线：把 CD 接通</title>
      <link>https://hsgjq.top/posts/cong-da-bao-shang-chuan-dao-push-ji</link>
      <guid>https://hsgjq.top/posts/cong-da-bao-shang-chuan-dao-push-ji</guid>
      <pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate>
      <description>私有仓库的镜像包默认也是私有的，健康检查的探测地址在宿主机有 nginx 时会打错地方。两处都是配好之后才验出来的。</description>
    </item>
    <item>
      <title>上线那天：域名、证书，和一条我打错的 IP</title>
      <link>https://hsgjq.top/posts/shang-xian-na-tian-yu-ming-zheng-shu</link>
      <guid>https://hsgjq.top/posts/shang-xian-na-tian-yu-ming-zheng-shu</guid>
      <pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate>
      <description>把 69 打成 96，于是照着"安全组没放行"这条错线索查了一整晚。分层排查的前提是先确认敲的是哪扇门。</description>
    </item>
    <item>
      <title>键里的斜杠会变成冒号：清缓存清了个空</title>
      <link>https://hsgjq.top/posts/jian-li-de-xie-gang-hui-bian-cheng</link>
      <guid>https://hsgjq.top/posts/jian-li-de-xie-gang-hui-bian-cheng</guid>
      <pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate>
      <description>按源码里的分组名去匹配存储键，结果一条都没删掉，接口还回 200。返回一个可被证伪的数字，这类问题当场就能发现。</description>
    </item>
    <item>
      <title>后台保存文章，前台一小时没变</title>
      <link>https://hsgjq.top/posts/hou-tai-bao-cun-wen-zhang-qian-tai</link>
      <guid>https://hsgjq.top/posts/hou-tai-bao-cun-wen-zhang-qian-tai</guid>
      <pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate>
      <description>SSR 缓存要有主动失效这条通道。密钥两侧必须同值、这个接口不能对公网开、回执要能被打脸（计数）。</description>
    </item>
    <item>
      <title>301、302、307 我一开始分不清</title>
      <link>https://hsgjq.top/posts/301-302-307-wo-yi-kai-shi-fen</link>
      <guid>https://hsgjq.top/posts/301-302-307-wo-yi-kai-shi-fen</guid>
      <pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate>
      <description>永久和临时不只是名字区别，搜索端权重转移不一样。框架给的默认值不一定是你要的那个，得显式写。</description>
    </item>
    <item>
      <title>我把 compose 的 override 写错，站点停了二十分钟</title>
      <link>https://hsgjq.top/posts/wo-ba-compose-de-override-xie-cuo-zhan</link>
      <guid>https://hsgjq.top/posts/wo-ba-compose-de-override-xie-cuo-zhan</guid>
      <pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate>
      <description>ports 是追加不是替换，合并之后 80 端口撞了；而 up 失败前旧容器已经被换掉。配置检查命令的输出格式也骗了我一次。</description>
    </item>
    <item>
      <title>swap、堆上限和构建内存墙</title>
      <link>https://hsgjq.top/posts/swap-dui-shang-xian-he-gou-jian-nei</link>
      <guid>https://hsgjq.top/posts/swap-dui-shang-xian-he-gou-jian-nei</guid>
      <pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate>
      <description>swap 让构建不被杀但变慢，抬堆上限让 Node 敢用更多内存，两件事要一起做。试过的几个数字和哪个最后成了，都写在里面。</description>
    </item>
    <item>
      <title>1.9G 内存的服务器上，nuxt build 在第 36 秒被杀</title>
      <link>https://hsgjq.top/posts/1-9g-nei-cun-de-fu-wu-qi</link>
      <guid>https://hsgjq.top/posts/1-9g-nei-cun-de-fu-wu-qi</guid>
      <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
      <description>V8 堆耗尽直接 SIGABRT，日志里只有一句低内存提示。先分清是被系统杀的还是自己崩的，再决定加内存还是加 swap。</description>
    </item>
    <item>
      <title>代码块里的三个反引号把正文截断了</title>
      <link>https://hsgjq.top/posts/dai-ma-kuai-li-de-san-ge-fan</link>
      <guid>https://hsgjq.top/posts/dai-ma-kuai-li-de-san-ge-fan</guid>
      <pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
      <description>解析 Markdown 时嵌套代码块要按围栏长度配对。也解释了为什么"取正文第一张图"要先把代码块整段剥掉。</description>
    </item>
    <item>
      <title>图片到底存哪：从对象存储的念头回到自建目录</title>
      <link>https://hsgjq.top/posts/tu-pian-dao-di-cun-na-cong-dui</link>
      <guid>https://hsgjq.top/posts/tu-pian-dao-di-cun-na-cong-dui</guid>
      <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
      <description>算了一下流量和成本，先放在自己的卷里，把上传路径和访问路径分开设计，将来要换存储只改一处。</description>
    </item>
    <item>
      <title>中文字体子集化之后首屏少了 900KB</title>
      <link>https://hsgjq.top/posts/zhong-wen-zi-ti-zi-ji-hua-zhi</link>
      <guid>https://hsgjq.top/posts/zhong-wen-zi-ti-zi-ji-hua-zhi</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
      <description>整包中文字体动辄几 MB。按实际用到的字符子集化、font-display 设 strategy，代价是新字会掉字体。</description>
    </item>
    <item>
      <title>深色模式：颜色变量该放哪一层</title>
      <link>https://hsgjq.top/posts/shen-se-mo-shi-yan-se-bian-liang</link>
      <guid>https://hsgjq.top/posts/shen-se-mo-shi-yan-se-bian-liang</guid>
      <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
      <description>语义变量而不是具体色值，切换只改一组自定义属性。闪烁问题出在样式加载时机，不是 JS。</description>
    </item>
    <item>
      <title>分页组件在手机上顶掉一行</title>
      <link>https://hsgjq.top/posts/fen-ye-zu-jian-zai-shou-ji-shang</link>
      <guid>https://hsgjq.top/posts/fen-ye-zu-jian-zai-shou-ji-shang</guid>
      <pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate>
      <description>flex 里有个"不允许压缩"的兄弟项，就会把列表挤出去。min-width: 0 这个开关单独说一次。</description>
    </item>
    <item>
      <title>头像从 base64 改成文件存储</title>
      <link>https://hsgjq.top/posts/tou-xiang-cong-base64-gai-cheng-wen-jian</link>
      <guid>https://hsgjq.top/posts/tou-xiang-cong-base64-gai-cheng-wen-jian</guid>
      <pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
      <description>base64 塞进数据库之后每次查询都拖一大坨。改成存路径、文件进卷，还要处理历史数据怎么迁移。</description>
    </item>
    <item>
      <title>热力图从 GitHub 抓数据，私有仓库不算</title>
      <link>https://hsgjq.top/posts/re-li-tu-cong-github-zhua-shu-ju</link>
      <guid>https://hsgjq.top/posts/re-li-tu-cong-github-zhua-shu-ju</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <description>匿名抓取只有公开贡献。换成 GraphQL 加令牌之后数字才对得上，代价是要管一个会过期的令牌。</description>
    </item>
    <item>
      <title>RSS 和 sitemap 是怎么被爬虫看到的</title>
      <link>https://hsgjq.top/posts/rss-he-sitemap-shi-zen-me-bei-pa</link>
      <guid>https://hsgjq.top/posts/rss-he-sitemap-shi-zen-me-bei-pa</guid>
      <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
      <description>生成时机、地址、robots 里要不要写。sitemap 带 lastmod 之后，改动被抓取的速度明显不一样。</description>
    </item>
    <item>
      <title>表格插槽里的 row 是宽类型：TS7053</title>
      <link>https://hsgjq.top/posts/biao-ge-cha-cao-li-de-row-shi</link>
      <guid>https://hsgjq.top/posts/biao-ge-cha-cao-li-de-row-shi</guid>
      <pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate>
      <description>组件库插槽给的 row 是 Record&lt;string, any&gt; 之类，取字段时报错的是索引那一行。枚举映射写成按字段值的函数最省事。</description>
    </item>
    <item>
      <title>要不要为系列单独建一张表</title>
      <link>https://hsgjq.top/posts/yao-bu-yao-wei-xi-lie-dan-du</link>
      <guid>https://hsgjq.top/posts/yao-bu-yao-wei-xi-lie-dan-du</guid>
      <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
      <description>一个字段能解决的事不要建表，除非要排序、要页面、要统计。我把三个判断条件列出来，最后选了建表。</description>
    </item>
  </channel>
</rss>