<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>技术 on 汉德君的博客</title><link>https://www.handejun.com/categories/%E6%8A%80%E6%9C%AF/</link><description>Recent content in 技术 on 汉德君的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 15 Nov 2026 11:30:00 +0800</lastBuildDate><atom:link href="https://www.handejun.com/categories/%E6%8A%80%E6%9C%AF/index.xml" rel="self" type="application/rss+xml"/><item><title>用 Hugo + Cloudflare Pages 搭建这个博客</title><link>https://www.handejun.com/posts/hugo-cloudflare-pages/</link><pubDate>Sun, 15 Nov 2026 11:30:00 +0800</pubDate><guid>https://www.handejun.com/posts/hugo-cloudflare-pages/</guid><description>从零到上线：Hugo 的目录结构、PaperMod 主题的常用配置，以及如何用 Cloudflare Pages 免费部署并绑定自己的域名。</description><content:encoded><![CDATA[<p>这个博客由 <a href="https://gohugo.io/">Hugo</a> 生成、托管在 <a href="https://pages.cloudflare.com/">Cloudflare Pages</a>。整站是纯静态文件，构建在云端完成，写作和部署的体验都很轻。</p>
<p>下面是我实际使用的流程，供同样想搭个人站点的朋友参考。</p>
<h2 id="为什么选这套组合">为什么选这套组合</h2>
<ul>
<li><strong>Hugo</strong>：单个二进制文件，构建毫秒级，不需要 Node 生态也能跑；</li>
<li><strong>PaperMod</strong>：简洁、支持深色模式、自带站内搜索与目录，中文排版也不错；</li>
<li><strong>Cloudflare Pages</strong>：连上 Git 仓库后自动构建，免费额度对个人博客绰绰有余，还自带全球 CDN 与 HTTPS。</li>
</ul>
<h2 id="目录结构">目录结构</h2>
<p>初始化之后的站点结构大致是这样：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">blog/
</span></span><span class="line"><span class="cl">├── hugo.toml            # 站点配置
</span></span><span class="line"><span class="cl">├── archetypes/          # 新文章模板
</span></span><span class="line"><span class="cl">├── assets/
</span></span><span class="line"><span class="cl">│   └── css/extended/    # 自定义样式
</span></span><span class="line"><span class="cl">├── content/
</span></span><span class="line"><span class="cl">│   ├── posts/           # 文章
</span></span><span class="line"><span class="cl">│   ├── about.md         # 关于页
</span></span><span class="line"><span class="cl">│   ├── archives.md      # 归档页
</span></span><span class="line"><span class="cl">│   └── search.md        # 搜索页
</span></span><span class="line"><span class="cl">├── static/              # 原样拷贝到站点根目录的文件
</span></span><span class="line"><span class="cl">└── themes/PaperMod/     # 主题（直接放在仓库里，无需 submodule）
</span></span></code></pre></div><h2 id="本地写作与预览">本地写作与预览</h2>
<p>新建一篇文章：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hugo new content posts/my-new-post.md
</span></span></code></pre></div><p>启动本地预览（包含草稿）：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hugo server -D
</span></span></code></pre></div><p>打开 <code>http://localhost:1313</code> 就能看到效果，改动会实时刷新。</p>
<h2 id="部署到-cloudflare-pages">部署到 Cloudflare Pages</h2>
<h3 id="1-把代码推到-github">1. 把代码推到 GitHub</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git init
</span></span><span class="line"><span class="cl">git add .
</span></span><span class="line"><span class="cl">git commit -m <span class="s2">&#34;chore: init hugo blog&#34;</span>
</span></span><span class="line"><span class="cl">git branch -M main
</span></span><span class="line"><span class="cl">git remote add origin https://github.com/&lt;你的用户名&gt;/&lt;仓库名&gt;.git
</span></span><span class="line"><span class="cl">git push -u origin main
</span></span></code></pre></div><h3 id="2-在-cloudflare-pages-创建项目">2. 在 Cloudflare Pages 创建项目</h3>
<p>进入 Cloudflare 控制台的 <strong>Workers &amp; Pages → Create → Pages → Connect to Git</strong>，选中刚才的仓库，构建配置填：</p>
<table>
	<thead>
			<tr>
					<th>配置项</th>
					<th>值</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Framework preset</td>
					<td>Hugo</td>
			</tr>
			<tr>
					<td>Build command</td>
					<td><code>hugo --gc --minify</code></td>
			</tr>
			<tr>
					<td>Build output directory</td>
					<td><code>public</code></td>
			</tr>
			<tr>
					<td>环境变量</td>
					<td><code>HUGO_VERSION</code> = <code>0.170.0</code></td>
			</tr>
	</tbody>
</table>
<p>保存后，每次 <code>git push</code> 都会自动构建并发布。</p>
<blockquote>
<p>PaperMod 当前版本要求 Hugo ≥ 0.158。<code>HUGO_VERSION</code> 不要留空，否则 Cloudflare 可能使用旧版本导致构建失败。</p>
</blockquote>
<h3 id="3-绑定自己的域名">3. 绑定自己的域名</h3>
<p>在项目的 <strong>Custom domains</strong> 里添加域名，按提示在 DNS 服务商处加一条 <code>CNAME</code> 记录即可。HTTPS 证书会自动签发和续期。</p>
<h3 id="4-修正-baseurl">4. 修正 baseURL</h3>
<p>部署成功后，把 <code>hugo.toml</code> 里的 <code>baseURL</code> 改成正式域名，再推送一次：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="nx">baseURL</span> <span class="p">=</span> <span class="s2">&#34;https://blog.yourdomain.com/&#34;</span>
</span></span></code></pre></div><p>这样 RSS、站点地图和社交卡片的绝对链接才会正确。</p>
<h2 id="命令行部署可选">命令行部署（可选）</h2>
<p>不想连 Git 也可以直接上传构建产物：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hugo --gc --minify
</span></span><span class="line"><span class="cl">npx wrangler pages deploy public --project-name wang-blog
</span></span></code></pre></div><h2 id="日常写作流程">日常写作流程</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">hugo new content posts/xxx.md   <span class="c1"># 1. 新建</span>
</span></span><span class="line"><span class="cl">hugo server -D                  <span class="c1"># 2. 本地预览</span>
</span></span><span class="line"><span class="cl">git add . <span class="o">&amp;&amp;</span> git commit -m <span class="s2">&#34;post: xxx&#34;</span>
</span></span><span class="line"><span class="cl">git push                        <span class="c1"># 3. 自动部署</span>
</span></span></code></pre></div><p>就这三步。工具越简单，越容易坚持下去。</p>
]]></content:encoded></item></channel></rss>