<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>王彦坤</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://wangyankun.github.io/</id>
  <link href="https://wangyankun.github.io/" rel="alternate"/>
  <link href="https://wangyankun.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, 王彦坤</rights>
  <subtitle>记录想法，写写日记</subtitle>
  <title>王彦坤的博客</title>
  <updated>2026-05-05T12:43:40.381Z</updated>
  <entry>
    <author>
      <name>王彦坤</name>
    </author>
    <category term="项目总结" scheme="https://wangyankun.github.io/categories/%E9%A1%B9%E7%9B%AE%E6%80%BB%E7%BB%93/"/>
    <category term="个人博客" scheme="https://wangyankun.github.io/tags/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/"/>
    <content>
      <![CDATA[<blockquote><p><strong>项目周期</strong>: 2026-04-27 ~ 2026-05-05<br><strong>技术栈</strong>: Hexo + NexT 主题 + GitHub Pages + GitHub Actions<br><strong>仓库</strong>: <a href="https://github.com/WangYankun/WangYankun.github.io">https://github.com/WangYankun/WangYankun.github.io</a><br><strong>线上地址</strong>: <a href="https://wangyankun.github.io/">https://wangyankun.github.io</a><br><strong>项目状态</strong>: ✅ 已完成</p></blockquote><hr><h2 id="一、项目概述"><a href="#一、项目概述" class="headerlink" title="一、项目概述"></a>一、项目概述</h2><p>搭建个人博客「坤的博客」，实现以下目标：</p><ul><li>📝 Hexo 静态博客框架，NexT 主题（Muse 风格）</li><li>🚀 GitHub Actions 自动构建部署（GitHub Pages）</li><li>💬 Giscus 评论系统（基于 GitHub Discussions）</li><li>📱 响应式设计，适配移动端</li><li>🔍 本地搜索、RSS 订阅、代码高亮</li><li>📊 后台 CMS 支持手机&#x2F;电脑端写作发布</li><li>🇨🇳 适配国内网络环境（系统字体、百度统计等）</li></ul><hr><h2 id="二、完整搭建步骤"><a href="#二、完整搭建步骤" class="headerlink" title="二、完整搭建步骤"></a>二、完整搭建步骤</h2><span id="more"></span><h3 id="2-1-本地环境准备"><a href="#2-1-本地环境准备" class="headerlink" title="2.1 本地环境准备"></a>2.1 本地环境准备</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 安装 Node.js（建议 v22+）</span></span><br><span class="line">node -v  <span class="comment"># 确认版本 &gt;= 22</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 安装 Hexo CLI</span></span><br><span class="line">npm install -g hexo-cli</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 初始化博客（如果从零开始）</span></span><br><span class="line">hexo init blog-build</span><br><span class="line"><span class="built_in">cd</span> blog-build</span><br><span class="line">npm install</span><br></pre></td></tr></table></figure><h3 id="2-2-主题安装"><a href="#2-2-主题安装" class="headerlink" title="2.2 主题安装"></a>2.2 主题安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 NexT 主题（推荐最新稳定版）</span></span><br><span class="line">npm install hexo-theme-next</span><br></pre></td></tr></table></figure><p>在 <code>_config.yml</code> 中启用：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">theme:</span> <span class="string">next</span></span><br></pre></td></tr></table></figure><h3 id="2-3-GitHub-仓库配置（双分支方案）"><a href="#2-3-GitHub-仓库配置（双分支方案）" class="headerlink" title="2.3 GitHub 仓库配置（双分支方案）"></a>2.3 GitHub 仓库配置（双分支方案）</h3><p><strong>仓库结构：</strong></p><ul><li><strong>source 分支</strong> — 博客源码（_config.yml、主题配置、scripts、文章草稿等）</li><li><strong>main 分支</strong> — 文章（source&#x2F;_posts、source&#x2F;uploads）+ CMS 发布的内容</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 初始化 git</span></span><br><span class="line">git init</span><br><span class="line">git checkout -b <span class="built_in">source</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置远程仓库</span></span><br><span class="line">git remote add origin https://github.com/WangYankun/Wangyankun.github.io.git</span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;Initial blog setup&quot;</span></span><br><span class="line">git push -u origin <span class="built_in">source</span></span><br></pre></td></tr></table></figure><h3 id="2-4-GitHub-Actions-工作流"><a href="#2-4-GitHub-Actions-工作流" class="headerlink" title="2.4 GitHub Actions 工作流"></a>2.4 GitHub Actions 工作流</h3><p>创建 <code>.github/workflows/deploy.yml</code>（放在 source 分支）：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">Blog</span> <span class="string">to</span> <span class="string">GitHub</span> <span class="string">Pages</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span> [<span class="string">source</span>, <span class="string">main</span>]</span><br><span class="line">  <span class="attr">workflow_dispatch:</span></span><br><span class="line"></span><br><span class="line"><span class="attr">permissions:</span></span><br><span class="line">  <span class="attr">contents:</span> <span class="string">read</span></span><br><span class="line">  <span class="attr">pages:</span> <span class="string">write</span></span><br><span class="line">  <span class="attr">id-token:</span> <span class="string">write</span></span><br><span class="line"></span><br><span class="line"><span class="attr">concurrency:</span></span><br><span class="line">  <span class="attr">group:</span> <span class="string">&quot;pages&quot;</span></span><br><span class="line">  <span class="attr">cancel-in-progress:</span> <span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span> <span class="string">source</span> <span class="string">branch</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">ref:</span> <span class="string">source</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span> <span class="string">main</span> <span class="string">for</span> <span class="string">posts</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">ref:</span> <span class="string">main</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">_main</span></span><br><span class="line">          <span class="attr">sparse-checkout:</span> <span class="string">|</span></span><br><span class="line"><span class="string">            source/_posts</span></span><br><span class="line"><span class="string">            source/uploads</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Merge</span> <span class="string">posts</span> <span class="string">from</span> <span class="string">main</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          rm -rf source/_posts source/uploads</span></span><br><span class="line"><span class="string">          mkdir -p source</span></span><br><span class="line"><span class="string">          cp -r _main/source/_posts source/ 2&gt;/dev/null || true</span></span><br><span class="line"><span class="string">          cp -r _main/source/uploads source/ 2&gt;/dev/null || true</span></span><br><span class="line"><span class="string">          rm -rf _main</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">Node.js</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">&#x27;22&#x27;</span></span><br><span class="line">          <span class="attr">cache:</span> <span class="string">&#x27;npm&#x27;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">Dependencies</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          npm ci</span></span><br><span class="line"><span class="string">          npm install hexo-generator-feed hexo-deployer-git hexo-generator-search --save</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npx</span> <span class="string">hexo</span> <span class="string">generate</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Upload</span> <span class="string">artifact</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/upload-pages-artifact@v3</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">./public</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">deploy:</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="attr">name:</span> <span class="string">github-pages</span></span><br><span class="line">      <span class="attr">url:</span> <span class="string">$&#123;&#123;</span> <span class="string">steps.deployment.outputs.page_url</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">needs:</span> <span class="string">build</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">to</span> <span class="string">GitHub</span> <span class="string">Pages</span></span><br><span class="line">        <span class="attr">id:</span> <span class="string">deployment</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/deploy-pages@v4</span></span><br></pre></td></tr></table></figure><p><strong>GitHub Pages 设置：</strong></p><ul><li>Settings → Pages → Source → <strong>GitHub Actions</strong></li></ul><h3 id="2-5-NexT-主题配置（-config-next-yml）"><a href="#2-5-NexT-主题配置（-config-next-yml）" class="headerlink" title="2.5 NexT 主题配置（_config.next.yml）"></a>2.5 NexT 主题配置（_config.next.yml）</h3><p>核心配置项：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 主题风格</span></span><br><span class="line"><span class="attr">scheme:</span> <span class="string">Muse</span></span><br><span class="line"><span class="attr">darkmode:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 字体（使用系统字体，适配国内网络）</span></span><br><span class="line"><span class="attr">font:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">global:</span></span><br><span class="line">    <span class="attr">external:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">family:</span> <span class="string">-apple-system,</span> <span class="string">BlinkMacSystemFont,</span> <span class="string">&quot;Segoe UI&quot;</span><span class="string">,</span> <span class="string">&quot;PingFang SC&quot;</span><span class="string">,</span> <span class="string">&quot;Hiragino Sans GB&quot;</span><span class="string">,</span> <span class="string">&quot;Microsoft YaHei&quot;</span><span class="string">,</span> <span class="string">sans-serif</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 代码块</span></span><br><span class="line"><span class="attr">codeblock:</span></span><br><span class="line">  <span class="attr">theme:</span></span><br><span class="line">    <span class="attr">light:</span> <span class="string">default</span></span><br><span class="line">    <span class="attr">dark:</span> <span class="string">atom-one-dark</span></span><br><span class="line">  <span class="attr">style:</span> <span class="string">flat</span></span><br><span class="line">  <span class="attr">copy_button:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">show_result:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 搜索</span></span><br><span class="line"><span class="attr">local_search:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">trigger:</span> <span class="string">auto</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># RSS</span></span><br><span class="line"><span class="attr">feed:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">type:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">atom</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">rss2</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 社交链接</span></span><br><span class="line"><span class="attr">social:</span></span><br><span class="line">  <span class="attr">GitHub:</span> <span class="string">https://github.com/WangYankun</span> <span class="string">||</span> <span class="string">fab</span> <span class="string">fa-github</span></span><br><span class="line">  <span class="attr">E-Mail:</span> <span class="string">mailto:yourname@example.com</span> <span class="string">||</span> <span class="string">fa</span> <span class="string">fa-envelope</span></span><br><span class="line">  <span class="attr">RSS:</span> <span class="string">/atom.xml</span> <span class="string">||</span> <span class="string">fa</span> <span class="string">fa-rss</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 自定义样式</span></span><br><span class="line"><span class="attr">custom_file_path:</span></span><br><span class="line">  <span class="attr">style:</span> <span class="string">source/_data/styles.styl</span></span><br></pre></td></tr></table></figure><h3 id="2-6-Giscus-评论系统集成"><a href="#2-6-Giscus-评论系统集成" class="headerlink" title="2.6 Giscus 评论系统集成"></a>2.6 Giscus 评论系统集成</h3><h4 id="步骤-1：创建-Discussion-仓库"><a href="#步骤-1：创建-Discussion-仓库" class="headerlink" title="步骤 1：创建 Discussion 仓库"></a>步骤 1：创建 Discussion 仓库</h4><p>在 GitHub 创建 <code>WangYankun/blog-comments</code> 仓库（必须公开），开启 Discussions 功能。</p><h4 id="步骤-2：获取配置参数"><a href="#步骤-2：获取配置参数" class="headerlink" title="步骤 2：获取配置参数"></a>步骤 2：获取配置参数</h4><p>访问 <a href="https://giscus.app/zh-CN%EF%BC%8C%E6%8C%89%E6%8F%90%E7%A4%BA%E8%8E%B7%E5%8F%96%EF%BC%9A">https://giscus.app/zh-CN，按提示获取：</a></p><ul><li><code>repo</code>: <code>WangYankun/blog-comments</code></li><li><code>repo_id</code>: （自动生成）</li><li><code>category</code>: <code>Announcements</code></li><li><code>category_id</code>: （自动生成）</li></ul><h4 id="步骤-3：添加-giscus-注入脚本"><a href="#步骤-3：添加-giscus-注入脚本" class="headerlink" title="步骤 3：添加 giscus 注入脚本"></a>步骤 3：添加 giscus 注入脚本</h4><p>创建 <code>scripts/giscus-inject.js</code>：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* global hexo */</span></span><br><span class="line"><span class="meta">&#x27;use strict&#x27;</span>;</span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">filter</span>.<span class="title function_">register</span>(<span class="string">&#x27;theme_inject&#x27;</span>, <span class="keyword">function</span>(<span class="params">injects</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> giscusConfig = hexo.<span class="property">theme</span>.<span class="property">config</span>.<span class="property">giscus</span>;</span><br><span class="line">  <span class="keyword">if</span> (giscusConfig &amp;&amp; giscusConfig.<span class="property">enable</span>) &#123;</span><br><span class="line">    injects.<span class="property">comment</span>.<span class="title function_">raw</span>(<span class="string">&#x27;giscus&#x27;</span>, <span class="string">`</span></span><br><span class="line"><span class="string">      &lt;div class=&quot;comments giscus-container&quot;&gt;</span></span><br><span class="line"><span class="string">        &lt;script src=&quot;https://giscus.app/client.js&quot;</span></span><br><span class="line"><span class="string">          data-repo=&quot;<span class="subst">$&#123;giscusConfig.repo&#125;</span>&quot;</span></span><br><span class="line"><span class="string">          data-repo-id=&quot;<span class="subst">$&#123;giscusConfig.repo_id&#125;</span>&quot;</span></span><br><span class="line"><span class="string">          data-category=&quot;<span class="subst">$&#123;giscusConfig.category&#125;</span>&quot;</span></span><br><span class="line"><span class="string">          data-category-id=&quot;<span class="subst">$&#123;giscusConfig.category_id&#125;</span>&quot;</span></span><br><span class="line"><span class="string">          data-mapping=&quot;<span class="subst">$&#123;giscusConfig.mapping&#125;</span>&quot;</span></span><br><span class="line"><span class="string">          data-strict=&quot;<span class="subst">$&#123;giscusConfig.strict&#125;</span>&quot;</span></span><br><span class="line"><span class="string">          data-reactions-enabled=&quot;<span class="subst">$&#123;giscusConfig.reactions_enabled&#125;</span>&quot;</span></span><br><span class="line"><span class="string">          data-emit-metadata=&quot;<span class="subst">$&#123;giscusConfig.emit_metadata&#125;</span>&quot;</span></span><br><span class="line"><span class="string">          data-input-position=&quot;<span class="subst">$&#123;giscusConfig.input_position&#125;</span>&quot;</span></span><br><span class="line"><span class="string">          data-theme=&quot;preferred_color_scheme&quot;</span></span><br><span class="line"><span class="string">          data-lang=&quot;<span class="subst">$&#123;giscusConfig.lang&#125;</span>&quot;</span></span><br><span class="line"><span class="string">          data-loading=&quot;<span class="subst">$&#123;giscusConfig.loading&#125;</span>&quot;</span></span><br><span class="line"><span class="string">          crossorigin=&quot;anonymous&quot;</span></span><br><span class="line"><span class="string">          async&gt;</span></span><br><span class="line"><span class="string">        &lt;/script&gt;</span></span><br><span class="line"><span class="string">      &lt;/div&gt;</span></span><br><span class="line"><span class="string">    `</span>, &#123;&#125;, &#123; <span class="attr">cache</span>: <span class="literal">true</span> &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (!hexo.<span class="property">theme</span>.<span class="property">config</span>.<span class="property">comments</span>.<span class="property">active</span>) &#123;</span><br><span class="line">      hexo.<span class="property">theme</span>.<span class="property">config</span>.<span class="property">comments</span>.<span class="property">active</span> = <span class="string">&#x27;giscus&#x27;</span>;</span><br><span class="line">      hexo.<span class="property">theme</span>.<span class="property">config</span>.<span class="property">comments</span>.<span class="property">activeClass</span> = <span class="string">&#x27;giscus&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h4 id="步骤-4：在-config-next-yml-中添加-giscus-配置"><a href="#步骤-4：在-config-next-yml-中添加-giscus-配置" class="headerlink" title="步骤 4：在 _config.next.yml 中添加 giscus 配置"></a>步骤 4：在 <code>_config.next.yml</code> 中添加 giscus 配置</h4><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">giscus:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">repo:</span> <span class="string">WangYankun/blog-comments</span></span><br><span class="line">  <span class="attr">repo_id:</span> <span class="string">R_kgDOSOAn3A</span>        <span class="comment"># 替换为你的 repo_id</span></span><br><span class="line">  <span class="attr">category:</span> <span class="string">Announcements</span></span><br><span class="line">  <span class="attr">category_id:</span> <span class="string">DIC_kwDOSOAn3M4C7zhm</span>  <span class="comment"># 替换为你的 category_id</span></span><br><span class="line">  <span class="attr">mapping:</span> <span class="string">pathname</span></span><br><span class="line">  <span class="attr">strict:</span> <span class="number">0</span></span><br><span class="line">  <span class="attr">reactions_enabled:</span> <span class="number">1</span></span><br><span class="line">  <span class="attr">emit_metadata:</span> <span class="number">0</span></span><br><span class="line">  <span class="attr">input_position:</span> <span class="string">bottom</span></span><br><span class="line">  <span class="attr">theme:</span></span><br><span class="line">    <span class="attr">light:</span> <span class="string">light</span></span><br><span class="line">    <span class="attr">dark:</span> <span class="string">dark_dimmed</span></span><br><span class="line">  <span class="attr">lang:</span> <span class="string">zh-CN</span></span><br><span class="line">  <span class="attr">loading:</span> <span class="string">lazy</span></span><br></pre></td></tr></table></figure><h4 id="步骤-5：部署"><a href="#步骤-5：部署" class="headerlink" title="步骤 5：部署"></a>步骤 5：部署</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> blog-build</span><br><span class="line"></span><br><span class="line"><span class="comment"># 生成</span></span><br><span class="line">npx hexo clean &amp;&amp; npx hexo generate</span><br><span class="line"></span><br><span class="line"><span class="comment"># 提交源码到 source 分支（不要使用 hexo d！）</span></span><br><span class="line">git add _config.next.yml scripts/giscus-inject.js</span><br><span class="line">git commit -m <span class="string">&quot;feat: add giscus comment support&quot;</span></span><br><span class="line">git push origin <span class="built_in">source</span></span><br></pre></td></tr></table></figure><h3 id="2-7-日常发布流程"><a href="#2-7-日常发布流程" class="headerlink" title="2.7 日常发布流程"></a>2.7 日常发布流程</h3><h4 id="方式一：本地写文章"><a href="#方式一：本地写文章" class="headerlink" title="方式一：本地写文章"></a>方式一：本地写文章</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建新文章</span></span><br><span class="line">npx hexo new post <span class="string">&quot;文章标题&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 编辑 source/_posts/文章标题.md</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 本地预览</span></span><br><span class="line">npx hexo server</span><br><span class="line"></span><br><span class="line"><span class="comment"># 提交到 source 分支</span></span><br><span class="line">git add <span class="built_in">source</span>/_posts/文章标题.md</span><br><span class="line">git commit -m <span class="string">&quot;feat: 发布文章「文章标题」&quot;</span></span><br><span class="line">git push origin <span class="built_in">source</span></span><br></pre></td></tr></table></figure><h4 id="方式二：通过管理后台发布"><a href="#方式二：通过管理后台发布" class="headerlink" title="方式二：通过管理后台发布"></a>方式二：通过管理后台发布</h4><ol><li>本地启动 CMS：<code>npx hexo server</code></li><li>访问 <code>http://localhost:4000/admin</code></li><li>编辑&#x2F;发布文章</li><li>提交变更到 source 分支并推送</li><li><strong>同时推送 main 分支</strong>（触发 GitHub Actions 构建）</li></ol><h4 id="方式三：手机端写作（未来规划）"><a href="#方式三：手机端写作（未来规划）" class="headerlink" title="方式三：手机端写作（未来规划）"></a>方式三：手机端写作（未来规划）</h4><p>通过管理后台 + MinIO 文件同步，实现移动端 CMS 写作。</p><hr><h2 id="三、踩坑记录"><a href="#三、踩坑记录" class="headerlink" title="三、踩坑记录"></a>三、踩坑记录</h2><h3 id="🕳️-坑-1：NexT-主题不支持-giscus"><a href="#🕳️-坑-1：NexT-主题不支持-giscus" class="headerlink" title="🕳️ 坑 1：NexT 主题不支持 giscus"></a>🕳️ 坑 1：NexT 主题不支持 giscus</h3><p><strong>现象</strong>: 在 <code>_config.next.yml</code> 配置了 giscus，但文章页没有评论区。</p><p><strong>原因</strong>: NexT 8.x 版本<strong>没有内置 giscus 支持</strong>。配置项写了也不会渲染。</p><p><strong>解决</strong>: 通过 NexT 的 <code>theme_inject</code> 机制，编写自定义脚本 <code>scripts/giscus-inject.js</code>，手动注入 giscus 脚本。</p><h3 id="🕳️-坑-2：hexo-d-推错了分支"><a href="#🕳️-坑-2：hexo-d-推错了分支" class="headerlink" title="🕳️ 坑 2：hexo d 推错了分支"></a>🕳️ 坑 2：hexo d 推错了分支</h3><p><strong>现象</strong>: 博客首页 404。</p><p><strong>原因</strong>: <code>hexo d</code> 把完整的 <code>public/</code> 静态文件推到了 main 分支。但 GitHub Actions 工作流期望 main 分支只包含 <code>source/_posts</code> 和 <code>source/uploads</code>。预构建文件覆盖了原有结构，导致 Actions 构建出来的页面为空。</p><p><strong>解决</strong>: </p><ol><li>在 GitHub 上 revert 那个 commit，恢复 main 分支</li><li><strong>以后不要用 <code>hexo d</code></strong> — 改用 GitHub Actions 自动部署</li><li>只 push 源码到 source 分支，Actions 自动构建</li></ol><h3 id="🕳️-坑-3：-config-yml-的-deploy-占位符"><a href="#🕳️-坑-3：-config-yml-的-deploy-占位符" class="headerlink" title="🕳️ 坑 3：_config.yml 的 deploy 占位符"></a>🕳️ 坑 3：_config.yml 的 deploy 占位符</h3><p><strong>现象</strong>: <code>hexo d</code> 推到了 <code>username/username.github.io</code> 而不是自己的仓库。</p><p><strong>原因</strong>: 初始配置是占位符：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">repo:</span> <span class="string">https://github.com/username/username.github.io.git</span></span><br></pre></td></tr></table></figure><p><strong>解决</strong>: 改为自己的仓库地址：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">repo:</span> <span class="string">https://github.com/WangYankun/Wangyankun.github.io.git</span></span><br></pre></td></tr></table></figure><h3 id="🕳️-坑-4：-config-yml-的-url-占位符"><a href="#🕳️-坑-4：-config-yml-的-url-占位符" class="headerlink" title="🕳️ 坑 4：_config.yml 的 url 占位符"></a>🕳️ 坑 4：_config.yml 的 url 占位符</h3><p><strong>现象</strong>: 生成的 HTML 中链接指向 <code>https://username.github.io</code>。</p><p><strong>解决</strong>: 改为自己的地址：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">url:</span> <span class="string">https://Wangyankun.github.io</span></span><br></pre></td></tr></table></figure><h3 id="🕳️-坑-5：评论提交失败-—-CORS-loopback-address-space"><a href="#🕳️-坑-5：评论提交失败-—-CORS-loopback-address-space" class="headerlink" title="🕳️ 坑 5：评论提交失败 — CORS &#x2F; loopback address space"></a>🕳️ 坑 5：评论提交失败 — CORS &#x2F; loopback address space</h3><p><strong>现象</strong>: 评论区显示正常，点击提交时报 <code>ERR_FAILED</code>，console 报 CORS 错误。</p><p><strong>原因</strong>: 本地开启了网络加速&#x2F;代理工具，导致 GitHub API 请求被路由到 loopback 地址，Chrome 的安全策略拦截了该请求。</p><p><strong>解决</strong>: 关闭网络加速工具后再访问。</p><h3 id="🕳️-坑-6：首页看不到评论区"><a href="#🕳️-坑-6：首页看不到评论区" class="headerlink" title="🕳️ 坑 6：首页看不到评论区"></a>🕳️ 坑 6：首页看不到评论区</h3><p><strong>现象</strong>: 以为 giscus 没生效，因为首页没有评论区。</p><p><strong>原因</strong>: NexT 主题的评论组件<strong>只在文章页显示</strong>，首页不显示。这是正常行为。</p><p><strong>解决</strong>: 进入具体文章页面查看评论区。</p><h3 id="🕳️-坑-7：push-到-source-分支不触发-Actions"><a href="#🕳️-坑-7：push-到-source-分支不触发-Actions" class="headerlink" title="🕳️ 坑 7：push 到 source 分支不触发 Actions"></a>🕳️ 坑 7：push 到 source 分支不触发 Actions</h3><p><strong>现象</strong>: push 到 source 分支后，GitHub Actions 没有自动运行。</p><p><strong>原因</strong>: 工作流配置了 <code>branches: [source, main]</code> 但实际部署需要两个分支都有更新（source 需要 main 的文章）。</p><p><strong>解决</strong>: push 到 main 分支（如管理后台发布文章）会触发 Actions。如果只改了 source 分支的配置，也需要 push 一下 main 触发。</p><hr><h2 id="四、关键文件清单"><a href="#四、关键文件清单" class="headerlink" title="四、关键文件清单"></a>四、关键文件清单</h2><table><thead><tr><th>文件</th><th>位置</th><th>作用</th></tr></thead><tbody><tr><td><code>_config.yml</code></td><td>项目根目录</td><td>Hexo 核心配置</td></tr><tr><td><code>_config.next.yml</code></td><td>项目根目录</td><td>NexT 主题配置</td></tr><tr><td><code>scripts/giscus-inject.js</code></td><td>项目根目录</td><td>Giscus 评论注入脚本</td></tr><tr><td><code>source/_data/styles.styl</code></td><td>自定义样式</td><td>自定义 CSS</td></tr><tr><td><code>.github/workflows/deploy.yml</code></td><td>source 分支</td><td>GitHub Actions 工作流</td></tr><tr><td><code>source/_posts/</code></td><td>source 分支</td><td>文章（本地写作）</td></tr><tr><td><code>source/_posts/</code></td><td>main 分支</td><td>文章（CMS 发布 + Actions 合并）</td></tr><tr><td><code>source/uploads/</code></td><td>main 分支</td><td>上传的图片</td></tr></tbody></table><hr><h2 id="五、经验总结"><a href="#五、经验总结" class="headerlink" title="五、经验总结"></a>五、经验总结</h2><ol><li><strong>理解工作流再操作</strong> — 在搞清楚 GitHub Actions 的构建逻辑之前，不要盲目执行 <code>hexo d</code></li><li><strong>双分支架构的好处</strong> — source 分支管代码，main 分支管文章，职责清晰。但需要严格遵守操作规范</li><li><strong>NexT 的 inject 机制</strong> — 对于不支持的功能，可以通过 <code>scripts/*.js</code> 注入自定义代码</li><li><strong>网络工具的影响</strong> — 开发&#x2F;测试时注意关闭代理，避免引入难以排查的网络问题</li><li><strong>配置项占位符</strong> — 初始化配置中的 <code>username</code>、占位符等，第一时间替换为真实值</li></ol>]]>
    </content>
    <id>https://wangyankun.github.io/2026/05/05/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E9%A1%B9%E7%9B%AE%E6%80%BB%E7%BB%93/</id>
    <link href="https://wangyankun.github.io/2026/05/05/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E9%A1%B9%E7%9B%AE%E6%80%BB%E7%BB%93/"/>
    <published>2026-05-05T12:14:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p><strong>项目周期</strong>: 2026-04-27 ~ 2026-05-05<br><strong>技术栈</strong>: Hexo + NexT 主题 + GitHub Pages + GitHub Actions<br><strong>仓库</strong>: <a href="https://github.com/WangYankun/WangYankun.github.io">https://github.com/WangYankun/WangYankun.github.io</a><br><strong>线上地址</strong>: <a href="https://wangyankun.github.io/">https://wangyankun.github.io</a><br><strong>项目状态</strong>: ✅ 已完成</p>
</blockquote>
<hr>
<h2 id="一、项目概述"><a href="#一、项目概述" class="headerlink" title="一、项目概述"></a>一、项目概述</h2><p>搭建个人博客「坤的博客」，实现以下目标：</p>
<ul>
<li>📝 Hexo 静态博客框架，NexT 主题（Muse 风格）</li>
<li>🚀 GitHub Actions 自动构建部署（GitHub Pages）</li>
<li>💬 Giscus 评论系统（基于 GitHub Discussions）</li>
<li>📱 响应式设计，适配移动端</li>
<li>🔍 本地搜索、RSS 订阅、代码高亮</li>
<li>📊 后台 CMS 支持手机&#x2F;电脑端写作发布</li>
<li>🇨🇳 适配国内网络环境（系统字体、百度统计等）</li>
</ul>
<hr>
<h2 id="二、完整搭建步骤"><a href="#二、完整搭建步骤" class="headerlink" title="二、完整搭建步骤"></a>二、完整搭建步骤</h2>]]>
    </summary>
    <title>个人博客搭建项目总结</title>
    <updated>2026-05-05T12:43:40.381Z</updated>
  </entry>
  <entry>
    <author>
      <name>王彦坤</name>
    </author>
    <category term="测试" scheme="https://wangyankun.github.io/categories/%E6%B5%8B%E8%AF%95/"/>
    <category term="测试" scheme="https://wangyankun.github.io/tags/%E6%B5%8B%E8%AF%95/"/>
    <content>
      <![CDATA[<h1 id="为什么要支持手机？"><a href="#为什么要支持手机？" class="headerlink" title="为什么要支持手机？"></a>为什么要支持手机？</h1><p>既然是个人博客，就是要记录日常的点点滴滴，而手机正是这样一个最好用的入口</p><h1 id="用什么格式写文章？"><a href="#用什么格式写文章？" class="headerlink" title="用什么格式写文章？"></a>用什么格式写文章？</h1><p>测试下来，还是<code>markdown</code> 最好用，因为手机最大的短板是无法选中调格式，md 很好的解决了这个问题</p><h1 id="评论功能是否必须？"><a href="#评论功能是否必须？" class="headerlink" title="评论功能是否必须？"></a>评论功能是否必须？</h1><p>我觉得还是有必要的，至少有一个与外界交流的窗口</p><h1 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h1><p>算了，不折腾了，评论功能一直搞不定。HiClaw 真垃圾。。</p>]]>
    </content>
    <id>https://wangyankun.github.io/2026/05/04/%E8%BF%99%E6%98%AF%E6%88%91%E7%94%A8%E6%89%8B%E6%9C%BA%E5%8F%91%E7%9A%84%E5%8D%9A%E5%AE%A2/</id>
    <link href="https://wangyankun.github.io/2026/05/04/%E8%BF%99%E6%98%AF%E6%88%91%E7%94%A8%E6%89%8B%E6%9C%BA%E5%8F%91%E7%9A%84%E5%8D%9A%E5%AE%A2/"/>
    <published>2026-05-04T14:29:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="为什么要支持手机？"><a href="#为什么要支持手机？" class="headerlink" title="为什么要支持手机？"></a>为什么要支持手机？</h1><p>既然是个人博客，就是要记录日常的点点滴滴，而手机正是这样一个最好用的入口</p>
<]]>
    </summary>
    <title>这是我用手机发的博客</title>
    <updated>2026-05-05T12:43:40.381Z</updated>
  </entry>
  <entry>
    <author>
      <name>王彦坤</name>
    </author>
    <category term="测试" scheme="https://wangyankun.github.io/categories/%E6%B5%8B%E8%AF%95/"/>
    <category term="测试" scheme="https://wangyankun.github.io/tags/%E6%B5%8B%E8%AF%95/"/>
    <content>
      <![CDATA[<h2 id="你好，世界！"><a href="#你好，世界！" class="headerlink" title="你好，世界！"></a>你好，世界！</h2><p>这是我的个人博客的第一篇文章。</p><p>搭建这个博客的初衷很简单 —— 想要一个属于自己的地方，记录想法、分享笔记、写写日记。</p><h2 id="为什么选择-Hexo？"><a href="#为什么选择-Hexo？" class="headerlink" title="为什么选择 Hexo？"></a><a href="chrome://new-tab-page/#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9-Hexo%EF%BC%9F"></a>为什么选择 Hexo？</h2><p>在选择博客框架的时候，我考虑了几个方案：</p><ol><li><p><strong>WordPress</strong></p><p> — 功能强大，但太重了</p></li><li><p><strong>Hugo</strong></p><p> — 构建速度快，但主题生态不如 Hexo</p></li><li><p><strong>Hexo</strong></p><p> — Node.js 生态，主题丰富，中文社区活跃 ✅</p></li></ol><p>最终选择了 Hexo + NexT 主题，配合 GitHub Pages 免费部署。</p><h2 id="博客特性"><a href="#博客特性" class="headerlink" title="博客特性"></a><a href="chrome://new-tab-page/#%E5%8D%9A%E5%AE%A2%E7%89%B9%E6%80%A7"></a>博客特性</h2><ul><li>✅ 响应式设计，手机&#x2F;平板&#x2F;电脑都能看</li><li>✅ 深色模式支持</li><li>✅ 评论系统（Giscus）</li><li>✅ RSS 订阅</li><li>✅ 代码高亮</li><li>✅ 站内搜索</li></ul><h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a><a href="chrome://new-tab-page/#%E5%86%99%E5%9C%A8%E6%9C%80%E5%90%8E"></a>写在最后</h2><p>以后会在这里记录一些想法和技术笔记，欢迎大家常来逛逛。</p><p><em>2026年4月27日，于博客诞生之日</em></p>]]>
    </content>
    <id>https://wangyankun.github.io/2026/05/04/%E6%B5%8B%E8%AF%95%EF%BC%9A%E9%80%9A%E8%BF%87%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E5%8F%91%E5%B8%83%E7%AC%AC%E4%B8%80%E7%AF%87%E5%8D%9A%E5%AE%A2/</id>
    <link href="https://wangyankun.github.io/2026/05/04/%E6%B5%8B%E8%AF%95%EF%BC%9A%E9%80%9A%E8%BF%87%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E5%8F%91%E5%B8%83%E7%AC%AC%E4%B8%80%E7%AF%87%E5%8D%9A%E5%AE%A2/"/>
    <published>2026-05-04T09:33:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="你好，世界！"><a href="#你好，世界！" class="headerlink" title="你好，世界！"></a>你好，世界！</h2><p>这是我的个人博客的第一篇文章。</p>
<p>搭建这个博客的初衷很简单 —— 想要一个属于自己的地方，记录想]]>
    </summary>
    <title>我的第一篇博客</title>
    <updated>2026-05-05T12:43:40.381Z</updated>
  </entry>
</feed>
