<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>LoveIt - 标签 - 秦时月</title><link>https://www.qinshiyue.icu/tags/loveit/</link><description>LoveIt - 标签 - 秦时月</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>qinshiyue615@gmail.com (秦时月)</managingEditor><webMaster>qinshiyue615@gmail.com (秦时月)</webMaster><lastBuildDate>Wed, 08 Apr 2026 22:30:00 +0800</lastBuildDate><atom:link href="https://www.qinshiyue.icu/tags/loveit/" rel="self" type="application/rss+xml"/><item><title>Vercel 部署 Hugo + LoveIt 主题踩坑记录</title><link>https://www.qinshiyue.icu/p/vercel-%E9%83%A8%E7%BD%B2-hugo--loveit-%E4%B8%BB%E9%A2%98%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/</link><pubDate>Wed, 08 Apr 2026 22:30:00 +0800</pubDate><author>qinshiyue615@gmail.com (秦时月)</author><guid>https://www.qinshiyue.icu/p/vercel-%E9%83%A8%E7%BD%B2-hugo--loveit-%E4%B8%BB%E9%A2%98%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/</guid><description><![CDATA[<blockquote>
<p><em><strong>本文全文由<code>codex</code>生成</strong></em></p>
</blockquote>
<p>最近把博客主题从 <code>Stack</code> 迁到了 <code>LoveIt</code>。本地预览一直是正常的，但一推到 Vercel 上，首页却直接变成了一份 RSS XML，后面又连续冒出了几层新的构建报错。</p>
<p>这篇文章就是把这次部署过程中遇到的问题、判断思路和最终修复方式完整整理下来。它不一定是最通用的教程，但如果你也在用 <code>Hugo + Vercel + 主题子模块</code> 这一套，应该会省掉不少时间。</p>
<h2 id="问题是怎么开始的">问题是怎么开始的</h2>
<p>最开始的现象其实很怪：</p>
<ul>
<li>本地 <code>hugo server</code> 一切正常</li>
<li>Vercel 显示部署成功</li>
<li>但访问真实网站时，首页不是 HTML，而是一份 XML</li>
</ul>
<p>最初看到这个页面的时候，我第一反应是：</p>
<ol>
<li>是不是 Hugo 把首页构建错了</li>
<li>是不是 <code>index.html</code> 没有生成</li>
<li>是不是 Vercel 根本没有正确发布 Hugo 的输出目录</li>
</ol>
<p>后来排查下来，第三个方向是对的。</p>
<h2 id="第一个坑仓库里混着旧静态产物">第一个坑：仓库里混着旧静态产物</h2>
<p>仓库根目录里还留着两套之前生成过的静态站内容：</p>
<ul>
<li><code>isablerander/</code></li>
<li><code>isablerange/</code></li>
</ul>
<p>而且它们不只是本地目录，而是<strong>真的被 Git 跟踪着</strong>。</p>
<p>这会导致一个很麻烦的问题：<br>
如果部署平台的根目录、输出目录或者构建逻辑稍微有一点偏差，它就有可能直接把这些旧静态文件当成整站发布出去。</p>
<p>这也是为什么线上首页会直接出现 XML。不是当前站点真的只构建出了 XML，而是部署链路很可能拿错了东西。</p>
<h3 id="解决方法">解决方法</h3>
<p>先做了两件事：</p>
<ol>
<li>在仓库根目录加了 <code>.vercelignore</code></li>
<li>最后把 <code>isablerander/</code> 和 <code>isablerange/</code> 整体从 Git 中移除</li>
</ol>
<p><code>.vercelignore</code> 至少能先阻止这些目录继续被 Vercel 拿去部署；彻底从 Git 里删掉，则是从根上消除隐患。</p>
<h2 id="第二个坑vercel-实际上没有正确拿到主题">第二个坑：Vercel 实际上没有正确拿到主题</h2>
<p>把旧静态产物隔离掉之后，新的构建日志开始出现另一类报错：</p>
<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">found no layout file for &#34;html&#34; for kind &#34;home&#34;
</span></span><span class="line"><span class="cl">found no layout file for &#34;html&#34; for layout &#34;about&#34; for kind &#34;page&#34;
</span></span><span class="line"><span class="cl">found no layout file for &#34;html&#34; for kind &#34;taxonomy&#34;</span></span></code></pre></div></div>
<p>这类错误说明的不是“文章有问题”，而是：</p>
<p><strong>Hugo 在构建时找不到主题模板。</strong></p>
<p>进一步看仓库，发现 <code>themes/LoveIt</code> 虽然在本地存在，但 <code>.gitmodules</code> 里居然没有对应的子模块映射。<br>
也就是说，本地能跑，是因为我机器上已经有这个目录；而 Vercel 从远端克隆仓库时，并不知道它该去哪里拉这个主题。</p>
<h3 id="解决方法-1">解决方法</h3>
<p>把 <code>themes/LoveIt</code> 的子模块信息补回 <code>.gitmodules</code>：</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">submodule</span> <span class="s2">&#34;themes/LoveIt&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">	<span class="nx">path</span> <span class="p">=</span> <span class="nx">themes</span><span class="err">/</span><span class="nx">LoveIt</span>
</span></span><span class="line"><span class="cl">	<span class="nx">url</span> <span class="p">=</span> <span class="nx">https</span><span class="err">://</span><span class="nx">github</span><span class="p">.</span><span class="nx">com</span><span class="err">/</span><span class="nx">dillonzq</span><span class="err">/</span><span class="nx">LoveIt</span><span class="p">.</span><span class="nx">git</span></span></span></code></pre></div></div>
<p>同时，把 Vercel 的构建命令改成先初始化子模块：</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">git submodule update --init --recursive <span class="o">&amp;&amp;</span> hugo --gc --minify</span></span></code></pre></div></div>
<p>到这一步，Vercel 才真正开始拿到 <code>LoveIt</code> 的模板文件。</p>
<h2 id="第三个坑vercel-默认-hugo-版本太旧">第三个坑：Vercel 默认 Hugo 版本太旧</h2>
<p>主题拉下来之后，新的错误又出现了：</p>
<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">partial &#34;init.html&#34; not found</span></span></code></pre></div></div>
<p>继续顺着查，发现 Vercel 当时用的是比较老的 Hugo 版本，而本地已经在用更新的版本。<br>
<code>LoveIt</code> 当前主题内部使用了较新的模板组织方式，老版本 Hugo 在 partial 查找上兼容得不够好，于是就开始出现一连串“本地正常、线上找不到模板”的情况。</p>
<h3 id="解决方法-2">解决方法</h3>
<p>把 Vercel 上的 Hugo 版本切到 <code>0.152.0</code>。</p>
<p>我这次是直接在 Vercel 那边调整版本，构建日志里最后能看到：</p>
<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">Installing Hugo version 0.152.0</span></span></code></pre></div></div>
<p>版本切上来以后，前面那层模板找不到的问题基本就过去了。</p>
<h2 id="第四个坑为兼容旧版本加的补丁反过来把新版本绕坏了">第四个坑：为兼容旧版本加的补丁，反过来把新版本绕坏了</h2>
<p>在还没确认 Hugo 版本之前，我为了兼容老版本，临时补了一些 partial 文件。<br>
结果切到新版本 Hugo 之后，其中有两个补丁反而成了新的错误来源：</p>
<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">no such template &#34;_internal/opengraph.html&#34;</span></span></code></pre></div></div>
<p>这类问题的本质是：<br>
在不同版本的 Hugo 里，内置模板的调用方式和可用入口并不完全一样。为了兼容旧版随手补上的模板，到了新版环境里反而不成立了。</p>
<h3 id="解决方法-3">解决方法</h3>
<p>很简单，删掉那两个多余的兼容覆盖，让新版 Hugo 走它自己的内置实现。</p>
<p>这个问题反而提醒我一件事：<br>
排障时“先补一层兼容”是有效策略，但一旦底层版本变化了，就要及时回头清理这些临时补丁，否则很容易进入下一轮误导。</p>
<h2 id="第五个坑sass-编译器和-css-函数不完全兼容">第五个坑：Sass 编译器和 CSS 函数不完全兼容</h2>
<p>等前面的部署链路打通之后，最后一个报错出现在样式编译阶段：</p>
<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">TOCSS: failed to transform &#34;/css/style.scss&#34;
</span></span><span class="line"><span class="cl">Incompatible units: &#39;rem&#39; and &#39;%&#39;</span></span></code></pre></div></div>
<p>这个错误看起来像是某个 <code>calc()</code> 写错了，但实际定位下来，是我在自定义样式里写了：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-scss">
        <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-scss" data-lang="scss"><span class="line"><span class="cl"><span class="na">width</span><span class="o">:</span> <span class="nf">min</span><span class="p">(</span><span class="mi">100</span><span class="kt">%</span><span class="o">,</span> <span class="mi">16</span><span class="kt">rem</span><span class="p">);</span></span></span></code></pre></div></div>
<p>按现在的浏览器标准，这只是一个普通的 CSS 函数；<br>
但 Vercel 那边的 Sass 编译链把 <code>min()</code> 当成了 Sass 的数学函数，于是试图拿 <code>100%</code> 和 <code>16rem</code> 去比较大小，最后直接炸掉。</p>
<h3 id="解决方法-4">解决方法</h3>
<p>把它改成更稳妥的写法：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-scss">
        <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-scss" data-lang="scss"><span class="line"><span class="cl"><span class="na">width</span><span class="o">:</span> <span class="mi">100</span><span class="kt">%</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="na">max-width</span><span class="o">:</span> <span class="mi">16</span><span class="kt">rem</span><span class="p">;</span></span></span></code></pre></div></div>
<p>功能完全一样，但不会触发 Sass 对 <code>min()</code> 的错误解析。</p>
<p>这一层修完之后，站点终于顺利构建通过。</p>
<h2 id="最后稳定下来的部署配置">最后稳定下来的部署配置</h2>
<p>这次排完之后，仓库里最终保留的关键配置大概是下面这些：</p>
<h3 id="verceljson"><code>vercel.json</code></h3>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-json">
        <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-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;buildCommand&#34;</span><span class="p">:</span> <span class="s2">&#34;git submodule update --init --recursive &amp;&amp; hugo --gc --minify&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;outputDirectory&#34;</span><span class="p">:</span> <span class="s2">&#34;public&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
<h3 id="vercel-项目设置">Vercel 项目设置</h3>
<ul>
<li>Framework Preset: <code>Hugo</code></li>
<li>Hugo version: <code>0.152.0</code></li>
<li>Build Command: <code>git submodule update --init --recursive &amp;&amp; hugo --gc --minify</code></li>
<li>Output Directory: <code>public</code></li>
<li>Root Directory: 仓库根目录</li>
</ul>
<h3 id="仓库层面的清理">仓库层面的清理</h3>
<ul>
<li>不再提交旧的静态构建目录</li>
<li>用 <code>.vercelignore</code> 排除本地生成和无关目录</li>
<li>主题子模块信息保持完整</li>
</ul>
<h2 id="这次排障里真正有用的判断顺序">这次排障里真正有用的判断顺序</h2>
<p>回头看，这次真正有效的排障顺序其实是这样的：</p>
<ol>
<li>先分清“是 Hugo 没构建出来”，还是“Vercel 发布错了目录”</li>
<li>再确认“本地主题存在”不等于“远端构建时也能拿到主题”</li>
<li>再确认“本地 Hugo 版本能跑”不等于“部署平台的 Hugo 版本也能跑”</li>
<li>最后再去看样式、函数兼容性这种更细节的问题</li>
</ol>
<p>如果一开始就盯着页面长得不对、或者盯着 RSS XML 本身，很容易在表象里绕很久。<br>
真正的关键，还是把“仓库内容”“构建环境”“部署输出”这三层拆开看。</p>
<h2 id="写在最后">写在最后</h2>
<p>这次迁移的过程比我预想中折腾得多一些。<br>
但从另一个角度看，主题迁移这种事，本来就不太可能只是改个 <code>theme</code> 字段然后一切如常。真正麻烦的部分，往往都藏在部署链路、主题依赖和历史遗留文件里。</p>
<p>把这些问题一个个拆开之后，反而会对自己的博客结构更熟悉一些。<br>
至少现在再看这个仓库，哪些是内容，哪些是模板，哪些只是过去留下的构建产物，终于比之前清楚了很多。</p>
]]></description></item></channel></rss>