<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>工程 on OINK 文档主题</title><link>https://pgsty.github.io/oink.pgsty.com/zh/tags/%E5%B7%A5%E7%A8%8B/</link><description>Recent content in 工程 on OINK 文档主题</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sun, 09 Aug 2026 12:21:22 +0800</lastBuildDate><atom:link href="https://pgsty.github.io/oink.pgsty.com/zh/tags/%E5%B7%A5%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>OINK 实施日记：从复制外壳到统一主题</title><link>https://pgsty.github.io/oink.pgsty.com/zh/blog/2026/oink-implementation-diary/</link><pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate><guid>https://pgsty.github.io/oink.pgsty.com/zh/blog/2026/oink-implementation-diary/</guid><description>&lt;p&gt;OINK 始于一个令人不安的事实：多个生产文档站之所以看起来相互关联，是因为它们确实源于同一套实现；但公共实现却以复制文件的形式散落在各处。呈现效果足够一致，维护模型却并非如此。&lt;/p&gt;
&lt;p&gt;这篇日记记录项目如何从重复站点覆盖项走向一款直接演化的统一主题。它关注决策与证据，而不是逐条复述提交历史。&lt;/p&gt;
&lt;h2 id="locking-the-contract"&gt;锁定产品契约&lt;a class="td-heading-self-link" href="#locking-the-contract" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;第一项真正有价值的工作是做减法。选择实现方式之前，我们先写清产品必须是什么：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从 Docsy 直接演化而来的独立主题；&lt;/li&gt;
&lt;li&gt;唯一标准外壳，而不是可切换皮肤；&lt;/li&gt;
&lt;li&gt;Hugo Extended 是消费端唯一构建依赖；&lt;/li&gt;
&lt;li&gt;所有主题自带浏览器资源默认本地优先；&lt;/li&gt;
&lt;li&gt;多语言行为从 Hugo 推导，而不是从 PGSTY 域名推导；&lt;/li&gt;
&lt;li&gt;可复用组件进入主题，业务语义留在站点；&lt;/li&gt;
&lt;li&gt;保留 Docsy 历史、许可证与可追踪的上游关系。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这排除了一个看似诱人、实际代价高昂的捷径：增加 &lt;code&gt;params.oink.enabled&lt;/code&gt;
并保留旧外壳。模式开关会让每次布局调整、无障碍修复与测试都支持两套产品。直接演化则让目标设计成为唯一设计。&lt;/p&gt;
&lt;h2 id="replacing-the-shell"&gt;替换页面外壳&lt;a class="td-heading-self-link" href="#replacing-the-shell" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;文档、博客与 API 参考布局围绕一组小型共享 partial 重新构建。新的外壳包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全局导航与响应式次级导航；&lt;/li&gt;
&lt;li&gt;可调整宽度、可折叠的侧栏；&lt;/li&gt;
&lt;li&gt;本地搜索与快捷链接；&lt;/li&gt;
&lt;li&gt;语言与颜色模式控件；&lt;/li&gt;
&lt;li&gt;面包屑、目录（TOC）、页面元数据与反馈；&lt;/li&gt;
&lt;li&gt;一致的页脚与打印布局。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;真正困难的不是画出导航栏，而是在删除复制的 &lt;code&gt;baseof.html&lt;/code&gt;
时保留 Docsy 既有扩展点。范围明确的 hook 仍然存在；复制整个站点外壳不再是正常的定制路径。&lt;/p&gt;
&lt;h2 id="removing-the-consumer-toolchain"&gt;移除消费端工具链&lt;a class="td-heading-self-link" href="#removing-the-consumer-toolchain" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;原有依赖链假设 Bootstrap 与 Font
Awesome 来自 npm，部分路径还会调用 PostCSS。OINK 把必需源码与编译产物移入主题，并让 SCSS 留在 Hugo 自身的 Asset
Pipeline 中。&lt;/p&gt;
&lt;p&gt;测试不只检查 &lt;code&gt;hugo&lt;/code&gt;
是否成功。fixture 中的陷阱会在消费端构建尝试运行 Node.js、npm、PostCSS 或 Autoprefixer，或模板调用
&lt;code&gt;resources.GetRemote&lt;/code&gt; 时立即失败。LTR 与 RTL 页面遵守同一约束。&lt;/p&gt;</description></item></channel></rss>