<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Hugo - 标签 - Simon's Blog</title><link>https://blog.leeissonba.com/tags/hugo/</link><description>Hugo - 标签 - Simon's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>leeissonba@gmail.com (Simon)</managingEditor><webMaster>leeissonba@gmail.com (Simon)</webMaster><copyright>Simon</copyright><lastBuildDate>Mon, 13 Jul 2026 09:44:50 +0800</lastBuildDate><atom:link href="https://blog.leeissonba.com/tags/hugo/" rel="self" type="application/rss+xml"/><item><title>Hugo + LoveIt 博客优化复盘：从搭建到可复现配置</title><link>https://blog.leeissonba.com/hugo-loveit-blog-optimization-notes/</link><pubDate>Mon, 13 Jul 2026 09:44:50 +0800</pubDate><author>leeissonba@gmail.com (Simon)</author><guid>https://blog.leeissonba.com/hugo-loveit-blog-optimization-notes/</guid><description><![CDATA[<div class="featured-image">
                <img src="https://blog.leeissonba.com/images/posts/hugo-loveit-blog-optimization-notes/featured.jpg" alt="Hugo &#43; LoveIt 博客优化复盘：从搭建到可复现配置" referrerpolicy="no-referrer">
            </div><p>汇总本站自搭建以来的优化与落地步骤，便于对照仓库复现。</p>
<ul>
<li>站点：https://blog.leeissonba.com/</li>
<li>主题：<a href="https://github.com/dillonzq/LoveIt" target="_blank" rel="noopener noreffer ">LoveIt</a> · 部署：Cloudflare Workers 静态资源</li>
<li>仓库：https://github.com/simonlee-hello/MyBlog</li>
</ul>
<h2 id="1-背景与目标">1. 背景与目标</h2>
<p>个人博客基于 Hugo Extended + LoveIt，需要同时满足：</p>
<ul>
<li>中文为默认语言，英文可切换阅读</li>
<li>从 Obsidian / Typora 写稿，尽量自动补 front matter、配图、英文版并发布</li>
<li>部署到 Cloudflare，绑定自定义域名</li>
<li>评论、前台阅读量、后台访客分析各自就位</li>
<li>代码块 / 视频等排版不翻车</li>
</ul>
<p>各节给出对应路径与配置要点，可直接对照仓库当前状态。</p>
<hr>
<h2 id="2-项目骨架与本地命令">2. 项目骨架与本地命令</h2>
<p>本章约定仓库布局、本地命令与忽略规则，是后续覆盖模板、样式与部署的前提。</p>
<h3 id="21-关键目录">2.1 关键目录</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-text">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">.
</span></span><span class="line"><span class="cl">├── archetypes/          # 新建文章模板
</span></span><span class="line"><span class="cl">├── assets/css/          # _custom.scss 覆盖主题样式
</span></span><span class="line"><span class="cl">├── content/posts/       # 文章（中文 .md / 英文 .en.md）
</span></span><span class="line"><span class="cl">├── drafts/              # 本地草稿（已 gitignore，不进仓库）
</span></span><span class="line"><span class="cl">├── layouts/             # 覆盖主题模板（勿改 themes/LoveIt）
</span></span><span class="line"><span class="cl">├── static/              # 图片、视频、favicon
</span></span><span class="line"><span class="cl">├── themes/LoveIt/       # Git submodule
</span></span><span class="line"><span class="cl">├── .cursor/skills/      # hugo-blog-publish / loveit-theme
</span></span><span class="line"><span class="cl">├── build.sh / wrangler.jsonc / package.json  # Cloudflare 构建
</span></span><span class="line"><span class="cl">├── hugo.toml
</span></span><span class="line"><span class="cl">└── Makefile</span></span></code></pre></div></div>
<h3 id="22-常用命令">2.2 常用命令</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">make dev      <span class="c1"># hugo server -D</span>
</span></span><span class="line"><span class="cl">make build    <span class="c1"># HUGO_ENV=production hugo --minify</span>
</span></span><span class="line"><span class="cl">make clean</span></span></code></pre></div></div>
<div class="details admonition note open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-pen-to-square" aria-hidden="true"></i>注意<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content">LoveIt 的评论、CDN、部分分析脚本只在 <code>hugo.Environment == production</code> 时启用。本地验证评论请运行：<code>HUGO_ENV=production hugo server</code></div>
    </div>
</div>
<h3 id="23-gitignore">2.3 <code>.gitignore</code></h3>
<p><code>public/</code>、<code>resources/</code>、<code>.hugo_build.lock</code>、<code>.cache/</code>、<code>drafts/</code> 已忽略。</p>
<ul>
<li><strong>不影响发布</strong>：Cloudflare 构建时在 CI 里重新 <code>hugo build</code> 生成 <code>public/</code>，不依赖仓库里的产物。</li>
<li><code>drafts/</code> 只留在本机，审稿通过后再发布到 <code>content/posts/</code>。</li>
</ul>
<hr>
<h2 id="3-hugo-弃用-api-修复">3. Hugo 弃用 API 修复</h2>
<p>新版 Hugo 对 <code>.Site.LanguageCode</code>、<code>.Language.LanguageName</code>、<code>.Sites</code>、配置项 <code>languageCode</code> 等发出弃用警告。</p>
<p><strong>原则</strong>：不改 submodule 内主题源码，在项目 <code>layouts/</code> 覆盖对应模板。</p>
<table>
	<thead>
			<tr>
					<th>覆盖文件</th>
					<th>调整要点</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>layouts/baseof.html</code></td>
					<td><code>lang</code> 用 <code>.Site.Language.Locale</code></td>
			</tr>
			<tr>
					<td><code>layouts/_partials/header.html</code></td>
					<td>语言切换用 <code>hugo.Sites</code>、<code>.Language.Label</code></td>
			</tr>
			<tr>
					<td><code>layouts/_partials/head/seo.html</code></td>
					<td>Locale 同上</td>
			</tr>
			<tr>
					<td><code>layouts/_partials/init.html</code></td>
					<td>去掉开发环境多余 warn；生产环境再挂 comment / analytics</td>
			</tr>
			<tr>
					<td><code>layouts/home.rss.xml</code> 等 RSS</td>
					<td>Locale 同上</td>
			</tr>
	</tbody>
</table>
<p>配置侧：语言块使用 <code>locale</code>（本站中文为 <code>zh-CN</code>，英文为 <code>en</code>），不再依赖已弃用的 <code>languageCode</code> 写法。</p>
<hr>
<h2 id="4-中文默认与双语内容约定">4. 中文默认与双语内容约定</h2>
<p>默认语言与文件命名必须一致，否则语言切换后文章列表会空。</p>
<h3 id="41-站点语言">4.1 站点语言</h3>
<p><code>hugo.toml</code>：</p>
<ul>
<li><code>defaultContentLanguage = &quot;zh-cn&quot;</code></li>
<li><code>[languages.zh-cn]</code> weight 更小（优先）</li>
<li><code>[languages.en]</code> 为英文站</li>
</ul>
<h3 id="42-文件命名重要">4.2 文件命名（重要）</h3>
<p>默认语言是中文时：</p>
<table>
	<thead>
			<tr>
					<th>语言</th>
					<th>路径</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>中文</td>
					<td><code>content/posts/{slug}.md</code>（<strong>不要</strong>用 <code>.zh-cn.md</code>）</td>
			</tr>
			<tr>
					<td>英文</td>
					<td><code>content/posts/{slug}.en.md</code></td>
			</tr>
	</tbody>
</table>
<p>About 页同理：<code>content/about/index.md</code> + <code>index.en.md</code>。</p>
<p>若把英文写在无后缀的 <code>.md</code>、中文写成 <code>.zh-cn.md</code>，切换到 <code>/en/</code> 时会看不到英文文章——这是早期踩过的坑。</p>
<h3 id="43-社交媒体">4.3 社交媒体</h3>
<p><code>[params.home.profile] social = true</code>，并配置 <code>[params.social]</code>（如 GitHub、Email、RSS）。首页 Profile 才会显示社交图标。</p>
<hr>
<h2 id="5-内容写作与发布工作流">5. 内容写作与发布工作流</h2>
<p>从草稿到上线的约定：front matter、配图、媒体路径，以及 Cursor skill 如何协助发布。</p>
<h3 id="51-发布流程最小集">5.1 发布流程（最小集）</h3>
<ol>
<li>在 Obsidian / Typora / <code>drafts/</code> 写中文 Markdown</li>
<li>用 Cursor skill <strong><code>hugo-blog-publish</code></strong> 发布（默认：补 front matter、配图、译英文、<code>hugo build</code>、commit + push）</li>
<li>若指定仅本地验证则跳过 push；若指定仅中文则不生成 <code>.en.md</code></li>
</ol>
<h3 id="52-front-matter-约定">5.2 front matter 约定</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-yaml">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">date</span><span class="p">:</span><span class="w"> </span><span class="ld">2026-07-13T12:00:00</span><span class="m">+08</span><span class="p">:</span><span class="m">00</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">draft</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">categories</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">featuredImage</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/images/posts/{slug}/featured.jpg&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">featuredImagePreview</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/images/posts/{slug}/featured.jpg&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">---</span></span></span></code></pre></div></div>
<ul>
<li>第一段后插入 <code>&lt;!--more--&gt;</code> 作为摘要分隔</li>
<li>中英文共用同一套配图 / 媒体路径</li>
</ul>
<h3 id="53-媒体路径">5.3 媒体路径</h3>
<table>
	<thead>
			<tr>
					<th>类型</th>
					<th>目录</th>
					<th>正文引用</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>配图 / 插图</td>
					<td><code>static/images/posts/{slug}/</code></td>
					<td><code>/images/posts/{slug}/...</code></td>
			</tr>
			<tr>
					<td>视频</td>
					<td><code>static/videos/posts/{slug}/</code></td>
					<td><code>/videos/posts/{slug}/...</code></td>
			</tr>
	</tbody>
</table>
<p>视频推荐：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-html">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">video</span> <span class="na">controls</span> <span class="na">playsinline</span> <span class="na">preload</span><span class="o">=</span><span class="s">&#34;metadata&#34;</span> <span class="na">src</span><span class="o">=</span><span class="s">&#34;/videos/posts/{slug}/demo.mp4&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">video</span><span class="p">&gt;</span></span></span></code></pre></div></div>
<p>外链图、Bilibili / YouTube 不强制下载进仓库；B 站可用 LoveIt <code>bilibili</code> shortcode。</p>
<h3 id="54-loveit-写作技巧-skill">5.4 LoveIt 写作技巧 skill</h3>
<p>另有 <strong><code>loveit-theme</code></strong> skill（与 publish 联动）：admonition、image、mermaid、math、Giscus、访问量等速查。发布时会按需把提示改成 <code>admonition</code>、B 站链接改成 shortcode 等。</p>
<p>官方文档见 <a href="https://hugoloveit.com" target="_blank" rel="noopener noreffer ">LoveIt</a>。</p>
<hr>
<h2 id="6-排版修复代码与视频">6. 排版修复：代码与视频</h2>
<p>线上曾出现：超长代码行撑破代码框；<code>&lt;video&gt;</code> 宽度与正文不一致。在 <code>assets/css/_custom.scss</code> 中处理：</p>
<ul>
<li>代码块：<code>max-width: 100%</code>、<code>overflow-x: auto</code>、必要时 <code>pre-wrap</code></li>
<li><code>video</code>：<code>width/max-width: 100%</code>、<code>display: block</code>、<code>height: auto</code></li>
</ul>
<p>正文侧仍建议对极长命令行适度断行，观感更好。</p>
<hr>
<h2 id="7-部署到-cloudflare-workers">7. 部署到 Cloudflare Workers</h2>
<p>静态站点按 <a href="https://gohugo.io/host-and-deploy/host-on-cloudflare/" target="_blank" rel="noopener noreffer ">Hugo 官方 Cloudflare 文档</a> 接入；本站使用 Workers 静态资源模式。</p>
<h3 id="71-仓库内文件">7.1 仓库内文件</h3>
<table>
	<thead>
			<tr>
					<th>文件</th>
					<th>作用</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>wrangler.jsonc</code></td>
					<td>Worker 名（如 <code>simons-blog</code>）、<code>assets.directory = ./public</code></td>
			</tr>
			<tr>
					<td><code>build.sh</code></td>
					<td>安装 Hugo Extended、更新 submodule、<code>HUGO_ENV=production hugo build</code></td>
			</tr>
			<tr>
					<td><code>package.json</code></td>
					<td>便于构建缓存</td>
			</tr>
	</tbody>
</table>
<p>Cloudflare 控制台中的项目名应与 <code>wrangler.jsonc</code> 的 <code>name</code> 保持一致。</p>
<h3 id="72-dashboard-注意点">7.2 Dashboard 注意点</h3>
<ul>
<li>纯静态 Worker：<strong>不要</strong>在「变量和密钥」（运行时）里配 <code>HUGO_BASEURL</code></li>
<li>构建相关变量应放在 <strong>Build variables</strong>，或直接写死 <code>hugo.toml</code> 的 <code>baseURL</code>（本站已用 <code>https://blog.leeissonba.com</code>）</li>
<li>自定义域名在 Workers → Domains 绑定即可</li>
</ul>
<h3 id="73-submodule">7.3 submodule</h3>
<p>主题是 submodule，Cloudflare 构建脚本里需 <code>git submodule update --init --recursive</code>，本地 clone 也要带 submodule。</p>
<hr>
<h2 id="8-评论giscus">8. 评论：Giscus</h2>
<p>曾评估 Valine（LeanCloud），最终改用 <a href="https://giscus.app/" target="_blank" rel="noopener noreffer ">Giscus</a>（基于 GitHub Discussions）。</p>
<h3 id="81-前置">8.1 前置</h3>
<ol>
<li>仓库 <strong>Public</strong></li>
<li>开启 <strong>Discussions</strong></li>
<li>安装 <a href="https://github.com/apps/giscus" target="_blank" rel="noopener noreffer ">giscus GitHub App</a> 并授权本仓库</li>
</ol>
<h3 id="82-本站配置hugotoml">8.2 本站配置（<code>hugo.toml</code>）</h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-toml">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">params</span><span class="p">.</span><span class="nx">page</span><span class="p">.</span><span class="nx">comment</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="nx">enable</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="nx">params</span><span class="p">.</span><span class="nx">page</span><span class="p">.</span><span class="nx">comment</span><span class="p">.</span><span class="nx">giscus</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nx">enable</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">    <span class="nx">repo</span> <span class="p">=</span> <span class="s2">&#34;simonlee-hello/MyBlog&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">repoId</span> <span class="p">=</span> <span class="s2">&#34;R_kgDOTVNnWg&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">category</span> <span class="p">=</span> <span class="s2">&#34;Announcements&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">categoryId</span> <span class="p">=</span> <span class="s2">&#34;DIC_kwDOTVNnWs4DBC6N&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">mapping</span> <span class="p">=</span> <span class="s2">&#34;pathname&#34;</span></span></span></code></pre></div></div>
<p><code>repoId</code> / <code>categoryId</code> 是 GitHub GraphQL 公开节点 ID，会出现在页面源码中，<strong>不属于密钥</strong>，可随站点配置公开。</p>
<p>单篇关闭：<code>comment: false</code>。<br>
仅 production 构建加载；本地需 <code>HUGO_ENV=production</code>。</p>
<p>评论数据在仓库 Discussions 中管理。</p>
<hr>
<h2 id="9-访问统计两套分工">9. 访问统计：两套分工</h2>
<table>
	<thead>
			<tr>
					<th>用途</th>
					<th>方案</th>
					<th>说明</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>站长后台分析</td>
					<td>Cloudflare Web Analytics</td>
					<td>本站域名挂在主域 <code>leeissonba.com</code> 下，子域 <code>blog.*</code> 流量已出现在同一报表，过滤 Host 即可</td>
			</tr>
			<tr>
					<td>前台展示数字</td>
					<td>自托管 Worker + D1（<code>services/web-analytics</code>）</td>
					<td>页脚全站 PV/UV + 文章 meta 阅读量；数据归自己</td>
			</tr>
	</tbody>
</table>
<p>Cloudflare Web Analytics <strong>不能</strong>把数字渲染到页面上（无公开前台接口）。曾用过不蒜子/Vercount，第三方计数会丢数重置，已弃用。</p>
<p>本站前台方案基于 <a href="https://github.com/yestool/analytics_with_cloudflare" target="_blank" rel="noopener noreffer ">analytics_with_cloudflare</a>，并按 <a href="https://bytejog.com/posts/hugo/hugo_analytics/" target="_blank" rel="noopener noreffer ">Hugo 自托管访问量实践</a> 补上全站 <code>spv</code> / <code>suv</code>。对照仓库即可复现。</p>
<h3 id="91-架构">9.1 架构</h3>
<ul>
<li><strong>独立 Worker</strong> <code>web-analytics</code>（与博客静态站 <code>myblog</code> / <code>simons-blog</code> <strong>分开</strong>）</li>
<li><strong>D1</strong> 库 <code>web_analytics</code> 存访问记录</li>
<li>浏览器 POST <code>/api/visit</code>：写入一条访客，并按需返回单页 <code>pv</code>、全站 <code>spv</code> / <code>suv</code></li>
<li>Hugo 仅在 <strong>production</strong> 加载脚本（与 Giscus 一致）</li>
</ul>
<h3 id="92-部署计数-apicloudflare">9.2 部署计数 API（Cloudflare）</h3>
<p>在仓库子目录操作（勿与根目录 Hugo 的 <code>wrangler.jsonc</code> 搞混）：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> services/web-analytics
</span></span><span class="line"><span class="cl">npm install
</span></span><span class="line"><span class="cl">npx wrangler login
</span></span><span class="line"><span class="cl">npx wrangler d1 create web_analytics
</span></span><span class="line"><span class="cl"><span class="c1"># 将返回的 database_id 写入本目录 wrangler.jsonc</span>
</span></span><span class="line"><span class="cl">npm run initSql
</span></span><span class="line"><span class="cl">npm run deploy</span></span></code></pre></div></div>
<p>注意：</p>
<ul>
<li><code>npm run deploy</code> 已带 <code>--config wrangler.jsonc</code>。若误用仓库根配置，会去跑 Hugo 的 <code>build.sh</code> 并报错</li>
<li>Dashboard → Workers → <code>web-analytics</code> → 添加自定义域，例如 <code>analytics.leeissonba.com</code>（<code>workers.dev</code> 在部分地区不可用）</li>
<li>冒烟：<code>POST https://analytics.你的域名/api/visit</code>，body 含 <code>hostname</code>、<code>url</code>、<code>spv: true</code> 等，应返回 <code>{&quot;ret&quot;:&quot;OK&quot;,&quot;data&quot;:{...}}</code></li>
</ul>
<h3 id="93-hugo-前台接入">9.3 Hugo 前台接入</h3>
<p>关键文件：</p>
<table>
	<thead>
			<tr>
					<th>路径</th>
					<th>作用</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>services/web-analytics/</code></td>
					<td>Worker + D1 源码与 <code>wrangler.jsonc</code></td>
			</tr>
			<tr>
					<td><code>assets/js/analytics.js</code></td>
					<td>请求 API，回填 <code>#page_pv</code> / <code>#site_pv</code> / <code>#site_uv</code></td>
			</tr>
			<tr>
					<td><code>layouts/_partials/plugin/web-analytics.html</code></td>
					<td>仅 production 注入 fingerprint 脚本</td>
			</tr>
			<tr>
					<td><code>layouts/_partials/footer.html</code></td>
					<td>全站 PV/UV 占位 + 加载脚本（全站一次）</td>
			</tr>
			<tr>
					<td><code>layouts/posts/single.html</code></td>
					<td>文章 meta「阅读量」<code>#page_pv</code></td>
			</tr>
			<tr>
					<td><code>hugo.toml</code> → <code>[params.webAnalytics]</code></td>
					<td>开关与 <code>baseURL</code></td>
			</tr>
	</tbody>
</table>
<p>配置示例：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-toml">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">params</span><span class="p">.</span><span class="nx">webAnalytics</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="nx">enable</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">  <span class="nx">baseURL</span> <span class="p">=</span> <span class="s2">&#34;https://analytics.leeissonba.com&#34;</span>  <span class="c"># 与自定义域一致</span></span></span></code></pre></div></div>
<p>页脚占位示例：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-html">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">本站总访问量 <span class="p">&lt;</span><span class="nt">span</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;site_pv&#34;</span><span class="p">&gt;</span>-<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span> 次 | 访客 <span class="p">&lt;</span><span class="nt">span</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;site_uv&#34;</span><span class="p">&gt;</span>-<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span> 人</span></span></code></pre></div></div>
<p>文章 meta 占位示例：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-html">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl">阅读 <span class="p">&lt;</span><span class="nt">span</span> <span class="na">id</span><span class="o">=</span><span class="s">&#34;page_pv&#34;</span><span class="p">&gt;</span>-<span class="p">&lt;/</span><span class="nt">span</span><span class="p">&gt;</span></span></span></code></pre></div></div>
<p>实现注意：</p>
<ul>
<li>脚本<strong>只在 footer 加载一次</strong>，避免重复计数</li>
<li>去掉上游 demo 里对 <code>document.head.innerHTML</code> 的注入（会重建 head，易弄坏主题脚本）</li>
<li>本地验证：<code>HUGO_ENV=production hugo server</code>；普通 <code>hugo server</code> 不加载、不计数</li>
<li>推送博客仓库后，等静态站重建，线上才会出现数字</li>
</ul>
<h3 id="94-验收">9.4 验收</h3>
<ol>
<li>打开任意文章：meta 阅读量有数字；刷新应递增</li>
<li>页脚全站人次 / 访客有数字</li>
<li>Cloudflare 里看 <strong><code>web-analytics</code></strong> Worker 的请求量（不是博客静态站 <code>myblog</code> 的 0 请求）</li>
</ol>
<hr>
<h2 id="10-配置开关速查">10. 配置开关速查</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-toml">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c"># 评论</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">params</span><span class="p">.</span><span class="nx">page</span><span class="p">.</span><span class="nx">comment</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="nx">enable</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 前台访问量（自托管 Worker + D1）</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">params</span><span class="p">.</span><span class="nx">webAnalytics</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="nx">enable</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">  <span class="nx">baseURL</span> <span class="p">=</span> <span class="s2">&#34;https://analytics.leeissonba.com&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 首页社交图标</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">params</span><span class="p">.</span><span class="nx">home</span><span class="p">.</span><span class="nx">profile</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="nx">social</span> <span class="p">=</span> <span class="kc">true</span></span></span></code></pre></div></div>
<p>主题相关覆盖一律放在项目 <code>layouts/</code>、<code>assets/</code>，升级 LoveIt submodule 时冲突面更小。</p>
<hr>
<h2 id="11-复现检查清单">11. 复现检查清单</h2>
<p>从零对齐本站时，建议按序确认：</p>
<ol>
<li><i class="far fa-square" aria-hidden="true"></i> Hugo Extended + <code>git submodule update --init</code></li>
<li><i class="far fa-square" aria-hidden="true"></i> <code>hugo.toml</code>：<code>baseURL</code>、默认语言、社交、Giscus、<code>webAnalytics</code></li>
<li><i class="far fa-square" aria-hidden="true"></i> Cloudflare 博客项目名与根目录 <code>wrangler.jsonc</code> 的 <code>name</code> 一致</li>
<li><i class="far fa-square" aria-hidden="true"></i> <code>layouts/</code> 弃用 API 覆盖 + footer / posts/single / web-analytics partial</li>
<li><i class="far fa-square" aria-hidden="true"></i> <code>assets/css/_custom.scss</code> 代码与视频样式；<code>assets/js/analytics.js</code> 已就位</li>
<li><i class="far fa-square" aria-hidden="true"></i> Cloudflare 博客：连接仓库、构建脚本、自定义域名、<code>HUGO_ENV=production</code></li>
<li><i class="far fa-square" aria-hidden="true"></i> Giscus App 已安装；Discussions 已开</li>
<li><i class="far fa-square" aria-hidden="true"></i> （可选）Web Analytics 过滤 <code>blog.</code> 子域</li>
<li><i class="far fa-square" aria-hidden="true"></i> 部署 <code>services/web-analytics</code>：D1 + Worker + 自定义域，与 <code>baseURL</code> 一致</li>
<li><i class="far fa-square" aria-hidden="true"></i> 发布用 Cursor skills：<code>hugo-blog-publish</code> + <code>loveit-theme</code></li>
<li><i class="far fa-square" aria-hidden="true"></i> 试发一篇：中英文、<code>featuredImage</code>、本地媒体路径、<code>&lt;!--more--&gt;</code>；生产环境核对阅读量</li>
</ol>
<hr>
<h2 id="12-参考资料">12. 参考资料</h2>
<ul>
<li><a href="https://hugoloveit.com" target="_blank" rel="noopener noreffer ">LoveIt 主题文档</a></li>
<li><a href="https://gohugo.io/host-and-deploy/host-on-cloudflare/" target="_blank" rel="noopener noreffer ">Host on Cloudflare（Hugo）</a></li>
<li><a href="https://giscus.app/" target="_blank" rel="noopener noreffer ">Giscus</a></li>
<li><a href="https://github.com/yestool/analytics_with_cloudflare" target="_blank" rel="noopener noreffer ">analytics_with_cloudflare</a></li>
<li><a href="https://bytejog.com/posts/hugo/hugo_analytics/" target="_blank" rel="noopener noreffer ">Hugo 自托管访问量（Worker + D1）</a></li>
<li>本仓库：<code>services/web-analytics/README.md</code></li>
<li>Cloudflare Dashboard → Analytics &amp; Logs → Web Analytics</li>
</ul>]]></description></item></channel></rss>