<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Oink on OINK 文档主题</title>
		<link>https://oink.pgsty.com/zh/tags/oink/</link>
		<description>Recent content in Oink on OINK 文档主题</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Sun, 09 Aug 2026 18:58:31 +0800</lastBuildDate>
		
			<atom:link href="https://oink.pgsty.com/zh/tags/oink/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>OINK 实施日记：从复制外壳到统一主题</title>
				<link>https://oink.pgsty.com/zh/blog/2026/oink-implementation-diary/</link>
				<pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate>
				<guid>https://oink.pgsty.com/zh/blog/2026/oink-implementation-diary/</guid>
				<description>&lt;p&gt;OINK 始于一个令人不安的事实：多个生产文档站之所以看起来相互关联，是因为它们确实源于同一套实现；但公共实现却以复制文件的形式散落在各处。呈现效果足够一致，维护模型却并非如此。&lt;/p&gt;&#xA;&lt;p&gt;这篇日记记录项目如何从重复站点覆盖项走向一款直接演化的统一主题。它关注决策与证据，而不是逐条复述提交历史。&lt;/p&gt;&#xA;&lt;h2 id=&#34;locking-the-contract&#34;&gt;锁定产品契约&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#locking-the-contract&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;第一项真正有价值的工作是做减法。选择实现方式之前，我们先写清产品必须是什么：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;从 Docsy 直接演化而来的独立主题；&lt;/li&gt;&#xA;&lt;li&gt;唯一标准外壳，而不是可切换皮肤；&lt;/li&gt;&#xA;&lt;li&gt;Hugo Extended 是消费端唯一构建依赖；&lt;/li&gt;&#xA;&lt;li&gt;所有主题自带浏览器资源默认本地优先；&lt;/li&gt;&#xA;&lt;li&gt;多语言行为从 Hugo 推导，而不是从 PGSTY 域名推导；&lt;/li&gt;&#xA;&lt;li&gt;可复用组件进入主题，业务语义留在站点；&lt;/li&gt;&#xA;&lt;li&gt;保留 Docsy 历史、许可证与可追踪的上游关系。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这排除了一个看似诱人、实际代价高昂的捷径：增加 &lt;code&gt;params.oink.enabled&lt;/code&gt;&#xA;并保留旧外壳。模式开关会让每次布局调整、无障碍修复与测试都支持两套产品。直接演化则让目标设计成为唯一设计。&lt;/p&gt;&#xA;&lt;h2 id=&#34;replacing-the-shell&#34;&gt;替换页面外壳&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#replacing-the-shell&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;文档、博客与 API 参考布局围绕一组小型共享 partial 重新构建。新的外壳包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;全局导航与响应式次级导航；&lt;/li&gt;&#xA;&lt;li&gt;可调整宽度、可折叠的侧栏；&lt;/li&gt;&#xA;&lt;li&gt;本地搜索与快捷链接；&lt;/li&gt;&#xA;&lt;li&gt;语言与颜色模式控件；&lt;/li&gt;&#xA;&lt;li&gt;面包屑、目录（TOC）、页面元数据与反馈；&lt;/li&gt;&#xA;&lt;li&gt;一致的页脚与打印布局。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;真正困难的不是画出导航栏，而是在删除复制的 &lt;code&gt;baseof.html&lt;/code&gt;&#xA;时保留 Docsy 既有扩展点。范围明确的 hook 仍然存在；复制整个站点外壳不再是正常的定制路径。&lt;/p&gt;&#xA;&lt;h2 id=&#34;removing-the-consumer-toolchain&#34;&gt;移除消费端工具链&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#removing-the-consumer-toolchain&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;原有依赖链假设 Bootstrap 与 Font&#xA;Awesome 来自 npm，部分路径还会调用 PostCSS。OINK 把必需源码与编译产物移入主题，并让 SCSS 留在 Hugo 自身的 Asset&#xA;Pipeline 中。&lt;/p&gt;&#xA;&lt;p&gt;测试不只检查 &lt;code&gt;hugo&lt;/code&gt;&#xA;是否成功。fixture 中的陷阱会在消费端构建尝试运行 Node.js、npm、PostCSS 或 Autoprefixer，或模板调用&#xA;&lt;code&gt;resources.GetRemote&lt;/code&gt; 时立即失败。LTR 与 RTL 页面遵守同一约束。&lt;/p&gt;</description>
			</item>
			<item>
				<title>OINK 实现预览正式亮相</title>
				<link>https://oink.pgsty.com/zh/blog/2026/oink-announcement/</link>
				<pubDate>Sat, 08 Aug 2026 00:00:00 +0000</pubDate>
				<guid>https://oink.pgsty.com/zh/blog/2026/oink-announcement/</guid>
				<description>&lt;p&gt;今天，我们发布 OINK 实现预览：它从 Docsy 直接演化而来，提供唯一标准产品外壳、仅依赖 Hugo 的消费端构建、本地优先浏览器依赖、通用多语言框架，以及一组从 PGSTY 文档站提炼出的可复用内容组件。&lt;/p&gt;&#xA;&lt;p&gt;这是实现与文档里程碑，不是已经公开的版本化发行。最终公开品牌、模块与软件包身份、首个版本，以及生产 Cloudflare&#xA;Pages 部署，仍是必须显式关闭的发布关卡。&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-oink-exists&#34;&gt;为什么需要 OINK？&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#why-oink-exists&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;多个成熟文档站分别复制了相同的 Docsy 布局、导航、搜索代码、SCSS、JavaScript 与短代码。一个公共修复必须在多个仓库重复实施；与此同时，每个站点都携带前端工具链与隐含网络依赖，让网络隔离构建变得异常复杂。&lt;/p&gt;&#xA;&lt;p&gt;OINK 将真正可复用的部分合并到主题中。产品矩阵、门户、价格页和其他业务专用行为仍留在各自站点；共享主题负责文档外壳、浏览器运行时、多语言路由、无障碍行为与内容组件契约。&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-changes&#34;&gt;有哪些变化？&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-changes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;one-product-instead-of-a-mode&#34;&gt;产品本身，而不是一种模式&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#one-product-instead-of-a-mode&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;OINK 不是可选皮肤。项目没有 &lt;code&gt;oink.enabled&lt;/code&gt; 开关、&lt;code&gt;params.oink.*&lt;/code&gt;&#xA;命名空间，也没有“上游版与品牌版”并行的模板树。&lt;code&gt;theme/&lt;/code&gt; 中的实现就是产品。&lt;/p&gt;&#xA;&lt;p&gt;这项决策避免维护两套视觉系统与两套测试矩阵。Hugo 原生设置与兼容的 Docsy 参数继续保持原有含义。&lt;/p&gt;&#xA;&lt;h3 id=&#34;hugo-only-consumer-builds&#34;&gt;消费端仅依赖 Hugo 构建&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#hugo-only-consumer-builds&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;完整消费站点只需运行：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hugo --gc --minify&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bootstrap、Font&#xA;Awesome、字体、搜索、图表、API 文档运行时与 OINK 组件都已随主题提交。Node.js、npm、PostCSS、Autoprefixer 与 CDN 下载不属于消费端要求。&lt;/p&gt;&#xA;&lt;p&gt;仓库维护者仍会使用 Node 工具运行测试和更新 vendor 资源；这套维护工具链有意置于公开站点构建契约之外。&lt;/p&gt;&#xA;&lt;h3 id=&#34;local-first-browser-behavior&#34;&gt;本地优先的浏览器行为&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#local-first-browser-behavior&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;默认 starter 会从生成后的站点提供页面外壳、字体、图标、搜索、Mermaid、KaTeX、Markmap、Swagger&#xA;UI、Redoc、Asciinema、ECharts 与 Infographic 依赖。可选运行时按页面选取，并且每页最多加载一次。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
