Nodes / MDX交互 · 公式 · 可视化

架构图与系统流向:Maplen 是如何运转的

从 4N 正交体系到静态优先流水线,用 Mermaid 图表全景解析我为 Maplen 搭建的底层逻辑

专栏 · Maplen

在写技术实践手记时,我经常需要表达复杂的系统结构、通信协议和业务流向。

但我非常抗拒在文章里插入大量由外部绘图工具截取的位图图片。那些图片不仅体积沉重,而且无法根据「褐页」与「暖墨」双主题自动调色;更致命的是,图片里的文字无法搜索,一旦架构微调就必须重新截图替换。

因此,我将 Mermaid 深度集成到了 Maplen 的 Markdown / MDX 渲染管线中。所有的流程图、序列图与状态机都直接以文本代码的形式存在,受 Git 统一版本控制,并在构建与主题切换时实时矢量渲染。

这篇手记通过四个直观的架构视图,为你展示 Maplen 整个站点的骨架与运转机理。


一、4N 与 Columns 的正交内容模型

Maplen 最核心的内容哲学,在于解开文章类别与主题探索之间的死结。

  • 4N 决定单篇文章的表达语气:无论是直抒胸臆的经历复盘(Narrative),对光影佳作的触动(Nebula),对复杂问题的理性思辨(Notes),还是亲手构筑代码与电路的实践(Nodes);
  • Columns(专栏) 则打破分类的边界,沿着时间、项目或主题的脉络,将散落在不同栏目中的文章串联成一条完整的认知线索。
架构图
正在绘制图表…
图 1:Maplen 4N 栏目与 Columns 专栏的正交矩阵模型。

这种正交设计让写作获得了极大的自由:一个持续半年的硬件项目,可以同时包含架构图解(Nodes)、人机关系随笔(Notes)、科幻电影共鸣(Nebula)和结项纪事(Narrative),它们共同编织成了专栏的骨肉。


二、静态优先:从源文本到发布产物

Maplen 没有复杂的后端服务、数据库或管理后台。所有文章都保存在项目仓库中,通过 Astro 的 Content Layer 进行强类型校验与预编译。

架构图
正在绘制图表…
图 2:Maplen 静态优先的输入-管线-输出三阶垂向结构模型。

整个管线遵循清晰的 输入 · 转换 · 交付 三栏式分工,设计原则是:能在构建期完成的事情,绝不留到浏览器去算。

输入层(Input)核心转换管线(Pipeline)交付物矩阵(Output)
Markdown (.md)
承载沉浸长篇叙事
Zod Schema 校验
严格校验 frontmatter 标题、标签、日期约束
纯净 HTML 页面
极速秒开,双主题预载零闪白
MDX (.mdx)
引入局部图表与仿真
Remark + Rehype
KaTeX 公式预渲染、Wiki 双向链接解析
按需水合 Islands
滚动到视口触发微量 React 运行时
Wiki 概念词条
数字花园词条定义
Shiki 高亮引擎
双主题色彩映射、代码 Diff 与焦点行
RSS / llms.txt
面向人类订阅与 AI Agent 的全景分发
  • 数学公式通过 KaTeX 预渲染为静态 MathML / HTML,彻底消除了客户端 MathJax 闪烁问题;
  • 代码块由 Shiki 在服务端直接完成语法高亮与行号着色,开箱即支持双主题与代码 Diff;
  • 生成物除了标准的静态网页,还包括全站与各分栏的 RSS、Sitemap 以及面向现代 AI 工具的 llms.txt。

三、渐进水合:静态首屏与交互岛屿

技术文章有时需要动态实验——比如后面会展示的阻尼振子模拟与交互式函数图像。但我绝不希望为了局部的交互功能,让整站变成一个体积庞大的单页应用(SPA)。

我采用了 Astro 的 React Islands 架构,并配置了 client:visible 懒加载策略:

架构图
正在绘制图表…
图 3:客户端按需水合的时序流程图。

首屏加载时,页面纯净得只有骨架 HTML 和样式文件,加载速度以毫秒计。只有当读者真正把页面滚动到交互图表附近时,浏览器才会异步拉取对应的微型 React 运行时与组件代码,完成原地水合。


四、生命周期:一篇文章在 Maplen 的演进

文章不是一次性的快餐消费品。在我的设想中,Maplen 里的每一篇文字都像园子里的植物,会随着时间持续生长。

架构图
正在绘制图表…
图 4:思考与创作在 Maplen 内部的生命周期状态机。

一个灵感可能最初只是 Notes 里的几句片段;随着亲手编码验证,它演变成 Nodes 里的实践手记;当多个相关探索汇聚,便自然升华为一个 Columns 专栏;再通过 [[wikilinks]] 与其他概念词条相互引证,最终织就一张能够长期生长的知识之网。


五、在 Markdown 中编写图表

在实际写作中,我只需要在 Markdown/MDX 文件中书写标准的 Mermaid 代码块,或者调用封装好的 <Mermaid /> 组件:

export const flow = `
flowchart TB
  A["源文本"] --> B["Astro 构建"]
  B --> C["静态 HTML"]
`;

<Mermaid
  chart={flow}
  caption="图 1:内容管线。"
/>

代码即图表,图表即思考。这正是让写作回归纯粹与坚固的技术方式。