社交平台上的文字,我不太敢当成自己的东西。发布时间、字体、能不能被搜到,都由平台说了算;哪天它改个协议或者干脆关门,你写的东西跟着一起走。我想要的其实很简单:文字放在自己硬盘上,格式自己说了算,什么时候想改就改。
这个站就是这么来的。下面把过程记下来,顺带记下踩过的坑,它们比选型结论有用。
三条硬要求
一是公式要能写。我平时写的东西里数学符号不少,编辑器里看到什么,网页上就该是什么。
二是内容必须是纯文本。Markdown 文件,存在自己硬盘上。哪天想换引擎或者换主题,不该动到正文一个字。
三是维护成本接近零。不要数据库,不要服务器,不要每个月登录某个后台去续费。
换过两个引擎
先从静态站点生成器里挑。候选当中 Astro 的演示站最好看,我差点就选了它。后来试公式的时候出了点事。
同一段文字里出现成对的 $(不是公式,就是普通的美元符号),Astro 不报错,直接把它当公式渲染:网页上原本该是符号的位置,变成了一片红字。Hugo 则构建失败,还告诉你出错在第几行第几列。
差别看着很小,但对我这种写完就不想再看第二遍的人来说,报错比悄悄渲染错好太多。
(顺带一句:正文里真要用美元符号,写成 \$20,这样两边都不会误解。)
最后定了 Hugo,另外两条理由:
- 数学是它的内置能力,不用装插件。构建时就把公式渲染成静态 HTML,页面不加载 JavaScript 也能显示。
- 它是一个 exe,没有 npm 或者 pip 依赖树。装完就完事,不用担心三年后某个包升了版本把它带崩。
数学引擎用 KaTeX,版本 0.18.4,样式和字体都放在站点自己的目录里。主题默认是从 CDN 拉这些文件,我把这一行删掉了:公式渲染依赖外部 CDN,本身就跟「文字要留得住」相冲突。
有个坑值得说:KaTeX 不是 MathJax。\dv、\pdv 这些 physics 包的命令,以及 \label、\eqref 交叉引用,它都不支持,会把命令原样显示成红色。Typora 用的是 MathJax,所以在 Typora 里渲染正常的公式,站上不一定行。写完随手看一眼,比事后返工划算。
主题:能换的东西别纠结
主题选了 Stack。它是 SCSS 写的,所以 Hugo 必须是 extended 版,普通版跑不起来,构建会直接报错。
主题只影响外观,正文一个字都不动,所以它是个随时可以反悔的选择。想清楚这点以后,我十分钟就定了。
托管:不备案的那条路
域名是 whatcannotbesaid.com,托管走 Cloudflare Pages 的免费档:连上 GitHub 仓库,每次推送自动构建,全球 CDN,证书自动签发,不花钱也不用备案。
接入过程中有三件事得分开做,少一件都不通:托管方接管 DNS、注册商把 NS 改成托管方给的地址、托管项目里把这个域名加为自定义域。多数人卡在第三步,因为前两步做完之后,域名看上去已经「解析好了」。
另外一条:域名刚注册完别急着绑。国内注册商要过实名审核,状态显示 client hold 加 server hold 的时候,绑了也白绑,等一两个工作日。
评论:把草稿藏起来
评论用 giscus,内容存在 GitHub Discussions 里,没有广告也没有第三方追踪。它有个硬要求:承载讨论的仓库必须是公开的。
问题是我写东西有草稿阶段。draft: true 只挡渲染,不挡仓库:草稿一旦提交进公开仓库,半成品段落和每一次修改的历史全都可读。这跟「网站公开」就等于「草稿公开」,是两件容易混为一谈的事。
所以最后开了一个空的公开仓库专门放评论,文章源码仓库保持私有。读者看得到成文,看不到我改到第三遍还留着的那两段废话。
三个真踩到的坑
批处理文件里不能写 UTF-8 中文。 发布脚本是个 .cmd,双击就跑。第一次双击直接报错,说某句里的中文「不是内部或外部命令」。原因是 cmd 按当前代码页逐字节读批处理文件,UTF-8 的中文字节里混着控制字符,把命令行从中间切断。存成 GBK、提交信息改成纯英文,才算稳。
新域名在代理里会掉进直连。 站上线之后,浏览器打不开自己的站,别人的站都正常。第一反应是站点有问题,其实是本机代理:分流规则集里没有这个新域名,它落到了末尾的兜底规则去直连,而 Cloudflare 的 IP 在国内直连会被重置,TLS 握手一个字节都过不去。
判据在外部:用境外抓取服务取一次页面,能返回正文,就说明站和证书都没问题,问题在本地分流。修法是给这个域名加一条精准规则让它走代理组,而不是改动兜底组,后者影响面太大。
主题自带 .git 会把仓库变成空壳。 下载下来的主题目录里带着它自己的 .git。外层直接 git add 的话,仓库会把它记成一个没有 .gitmodules 的半子模块:托管方拉代码时拿不到主题文件,构建必挂。删掉主题的 .git,把上游地址和版本号记进一个文本文件,主题就成了仓库里的普通文件。
现在的流程
在 Typora 里写完,双击一个脚本,等十几秒,站就更新了。
公式、表格、代码块、中文混排都验过一遍。随手放一个:
搭站这件事到这儿就完了,剩下的是往里写东西。