<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>教程 on David Wang</title><link>https://davidwang.space/categories/%E6%95%99%E7%A8%8B/</link><description>Recent content in 教程 on David Wang</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 20 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://davidwang.space/categories/%E6%95%99%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>RE：从零开始的博客</title><link>https://davidwang.space/p/re-blog-from-zero/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://davidwang.space/p/re-blog-from-zero/</guid><description>&lt;img src="https://davidwang.space/p/re-blog-from-zero/cover.jpg" alt="Featured image of post RE：从零开始的博客" /&gt;&lt;p&gt;折腾了两天，博客总算能看了。本来没想写这篇，但中间踩的坑实在太多，有几个还特别邪门，不记下来下次还得再踩一遍。&lt;/p&gt;&#10;&lt;p&gt;技术栈没什么好纠结的：Hugo + Stack 主题 + GitHub Pages。理由就一句话，免费、够快、能挂自己的域名。主题用 Hugo Module 方式加载，好处是升级方便，坏处是本地构建得装 Go——这个后面再骂。&lt;/p&gt;&#10;&lt;p&gt;开头很顺。starter 模板的 GitHub Actions 已经配好了，push 到 master 自动构建部署。中文化也就是改几个文件：locale 设成 zh-cn、hasCJKLanguage 打开，标题副标题菜单改改，换上自己的头像和背景图。真正开始折磨人的是下面几件事。&lt;/p&gt;&#10;&lt;h2 id="头像只在首页显示"&gt;头像只在首页显示&#10;&lt;/h2&gt;&lt;p&gt;这个坑卡我最久。&lt;/p&gt;&#10;&lt;p&gt;现象特别怪：首页头像好好的，一进归档页、搜索页就裂了。我第一反应是路径写错了，翻来覆去查了好几遍，都没问题。&lt;/p&gt;&#10;&lt;p&gt;后来才搞明白，问题出在 &lt;code&gt;static/&lt;/code&gt; 和 &lt;code&gt;assets/&lt;/code&gt; 的区别上。我把头像放在了 &lt;code&gt;static/img/avatar.jpg&lt;/code&gt;，但 Stack 主题渲染头像用的是 &lt;code&gt;resources.Get&lt;/code&gt;，这玩意只认 &lt;code&gt;assets/&lt;/code&gt; 目录。读不到的时候，主题就退回我写的原始路径 &lt;code&gt;img/avatar.jpg&lt;/code&gt;——注意，前面没有斜杠。&lt;/p&gt;&#10;&lt;p&gt;于是首页因为恰好就在根目录，&lt;code&gt;img/avatar.jpg&lt;/code&gt; 能解析对；子页面就变成了 &lt;code&gt;/archives/img/avatar.jpg&lt;/code&gt; 这种鬼路径。最后把头像从 &lt;code&gt;static/&lt;/code&gt; 挪到 &lt;code&gt;assets/&lt;/code&gt;，问题当场没了。&lt;/p&gt;&#10;&lt;p&gt;说实话当时挺想骂人的。&lt;code&gt;static/&lt;/code&gt; 和 &lt;code&gt;assets/&lt;/code&gt; 表面看都是放资源的，结果一个是原样拷贝，一个走资源处理管线，完全两码事。这种坑不看源码根本想不到。&lt;/p&gt;&#10;&lt;h2 id="域名和那个假-ip"&gt;域名，和那个假 IP&#10;&lt;/h2&gt;&lt;p&gt;绑域名本身不难。阿里云加几条解析记录，根域名用 A 记录指向 GitHub Pages 的四个 IP（&lt;code&gt;185.199.108~111.153&lt;/code&gt;），&lt;code&gt;www&lt;/code&gt; 用 CNAME。GitHub 那边设一下自定义域名，HTTPS 证书它自己就签好了。&lt;/p&gt;&#10;&lt;p&gt;难的是验证。我加完解析，本地 &lt;code&gt;nslookup&lt;/code&gt; 一查，出来的 IP 是 &lt;code&gt;198.18.0.14&lt;/code&gt;。这明显不对啊。我以为是阿里云那边没生效，来回查记录、改配置，折腾大半天。&lt;/p&gt;&#10;&lt;p&gt;最后发现是我自己电脑上的代理（Watt Toolkit）搞的鬼，它的 fake-IP 模式把本地所有 DNS 查询都劫持了。换公共 DoH 一查，解析其实早就生效了。合着我白折腾了一下午。&lt;/p&gt;&#10;&lt;h2 id="音乐播放器"&gt;音乐播放器&#10;&lt;/h2&gt;&lt;p&gt;这次最大的一块。需求就是右下角一个悬浮播放器，播本地音乐，能切歌、调进度、调音量、三种循环模式，刷新后状态还在。&lt;/p&gt;&#10;&lt;p&gt;实现上没引任何框架，原生 JS 加 SCSS，通过 Hugo 的模板覆盖机制塞进去，主题源码一行没动。加歌就靠一个 Python 脚本扫目录生成歌单 JSON，这样 CI 那边不用额外装 Python。&lt;/p&gt;&#10;&lt;p&gt;中间也踩了几个小坑，顺手记一下：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;往页面注入歌单 JSON 时，我先用了 &lt;code&gt;jsonify | safeHTML&lt;/code&gt;，结果输出被二次转义成 &lt;code&gt;&amp;quot;[{\&amp;quot;title\&amp;quot;:...}]&amp;quot;&lt;/code&gt; 这种鬼样子。查了半天才明白 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 里是 JS 上下文，得用 &lt;code&gt;safeJS&lt;/code&gt; 才不会被包成字符串。&lt;/li&gt;&#10;&lt;li&gt;构建报 &lt;code&gt;.Site.Data&lt;/code&gt; 弃用警告，Hugo 新版让改成 &lt;code&gt;hugo.Data&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;加了个邮箱入口，结果主题的图标集里压根没有 &lt;code&gt;mail.svg&lt;/code&gt;，直接构建失败，还得自己补个图标。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="本地构建要-go"&gt;本地构建要 Go&#10;&lt;/h2&gt;&lt;p&gt;这个和播放器没关系，但挺坑的。因为主题是 Module 方式加载，本地 &lt;code&gt;hugo&lt;/code&gt; 构建要调 &lt;code&gt;go&lt;/code&gt; 去拉模块。我机器上 Go 是装了，但装在 &lt;code&gt;C:\Users\DW\go-sdk\go\bin&lt;/code&gt;，不在 PATH 里，而且直连 Go 官方代理还会卡住。&lt;/p&gt;&#10;&lt;p&gt;每次构建前都得先跑这么一段：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$env:PATH&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;C:\Users\DW\go-sdk\go\bin;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;$env:PATH&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$env:GOPROXY&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://goproxy.cn,direct&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hugo&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;-D&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;第一次撞上那个报错的时候，我还以为 Hugo 坏了。&lt;/p&gt;&#10;&lt;h2 id="现在能用了"&gt;现在能用了&#10;&lt;/h2&gt;&lt;p&gt;第一首歌放的是《Numb》，播放器跑得动，域名也是自己的了。&lt;/p&gt;&#10;&lt;p&gt;接下来才是最难的部分：持续写。这个我不立 flag 了，能写几篇算几篇。&lt;/p&gt;&#10;</description></item></channel></rss>