<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloudflare on 吾思 梦阁</title><link>https://wstek.win/tags/cloudflare/</link><description>Recent content from 吾思 梦阁</description><generator>Hugo</generator><language>zh-cn</language><managingEditor>wusitech@qq.com (WuSi)</managingEditor><webMaster>wusitech@qq.com (WuSi)</webMaster><copyright>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</copyright><lastBuildDate>Thu, 15 Oct 2026 18:00:00 +0800</lastBuildDate><atom:link href="https://wstek.win/tags/cloudflare/index.xml" rel="self" type="application/rss+xml"/><item><title>如何实现评论区构建通过 CF Pages Function + GitHub 仓库</title><link>https://wstek.win/posts/mysite-comment/</link><pubDate>Thu, 15 Oct 2026 18:00:00 +0800</pubDate><author>wusitech@qq.com (WuSi)</author><guid>https://wstek.win/posts/mysite-comment/</guid><description>
<![CDATA[<h1>如何实现评论区构建通过 CF Pages Function + GitHub 仓库</h1><p>作者：WuSi（wusitech@qq.com）</p>
        
          <h2 id="0x00-背景">
<a class="header-anchor" href="#0x00-%e8%83%8c%e6%99%af"></a>
0x00 背景
</h2><p>静态博客没有后端，评论基本只有两条路：挂第三方，或者自己想办法。</p>
<p>第三方用着省事，但问题也不少：有的开始收费，有的停止维护，有的国内访问时快时慢。最主要的是数据不在自己手里，服务一关评论就没了。</p>
<p>所以这次换了个做法：<strong>评论文件放自己的仓库，写评论交给一个 Serverless 函数去提交。</strong></p>
<h2 id="0x10-整体结构">
<a class="header-anchor" href="#0x10-%e6%95%b4%e4%bd%93%e7%bb%93%e6%9e%84"></a>
0x10 整体结构
</h2><pre class="mermaid">
  flowchart LR
    A[浏览器] -->|读评论| B[静态 JSON 文件]
    A -->|写评论| C[Cloudflare Pages Function]
    C -->|服务端提交| D[GitHub 仓库]
    D -->|触发构建| E[静态站点更新]
</pre><h3 id="四个环节">
<a class="header-anchor" href="#%e5%9b%9b%e4%b8%aa%e7%8e%af%e8%8a%82"></a>
四个环节
</h3><ol>
<li>读：评论就是一个 JSON 文件，浏览器当静态资源取</li>
<li>写：表单提交到 <code>/api/comment</code>，这是 Cloudflare Pages 的 Function</li>
<li>存：函数拿 GitHub 令牌调用 Contents API，改文件并提交</li>
<li>生效：仓库变更触发站点重新构建</li>
</ol>
<p>没有数据库，没有常驻服务器。</p>
<h2 id="0x20-评论存在哪">
<a class="header-anchor" href="#0x20-%e8%af%84%e8%ae%ba%e5%ad%98%e5%9c%a8%e5%93%aa"></a>
0x20 评论存在哪
</h2><p>按页面拆文件：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">static/comments/
</span></span><span class="line"><span class="cl">├── posts/
</span></span><span class="line"><span class="cl">│   ├── stm32f4-interrupt.json
</span></span><span class="line"><span class="cl">│   └── ubuntu_install.json
</span></span><span class="line"><span class="cl">├── about.json
</span></span><span class="line"><span class="cl">└── friend.json
</span></span></code></pre></div><p>文件里是个数组，一条评论长这样：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;c_xxxxx&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;test&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;body&#34;</span><span class="p">:</span> <span class="s2">&#34;test123456&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;ts&#34;</span><span class="p">:</span> <span class="mi">1792304863141</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;hidden&#34;</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;author&#34;</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;replyTo&#34;</span><span class="p">:</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="两个设计">
<a class="header-anchor" href="#%e4%b8%a4%e4%b8%aa%e8%ae%be%e8%ae%a1"></a>
两个设计
</h3><p><strong>扁平存储。</strong> 不管回复多深，全部平铺在一个数组里，靠 <code>replyTo</code> 记父评论的 id。加评论就是往数组末尾追加，不用改结构。</p>
        
        <hr><p>本文2026-10-15首发于<a href='https://wstek.win/'>吾思 梦阁</a>，最后修改于2026-10-15</p>]]></description><category>网站</category></item></channel></rss>