资讯动态

Dendron 发布站点首页链接处理指南:publishSite 测试文档与源码实现全解

发布时间:2026/10/15 17:50:54 来源:尧图企业网站定制
知识管理知识库【免费下载链接】dendronThe personal knowledge management (PKM) tool that grows as you do!项目地址https://gitcode.com/gh_mirrors/de/dendron点击查看免费下载导读本文围绕 Dendron 测试工作区中的 dendron.ref.publishSite.md 展开它是专门用于验证「发布站点Publishing Site中首页链接是否正确渲染」的测试笔记。通过阅读本文你将掌握Dendron 中首页Home Page / Site Index的判定方式、绝对链接Absolute Link与相对链接Relative Link在发布时分别如何转换、笔记引用Note Reference的绝对/相对两种语法差异以及它们在统一渲染管线unified中的底层实现原理。文章将把该测试文档与仓库源码逐一对照帮助你理解为何这四种写法在发布后的站点上都会指向站点首页并能在自己的发布配置中正确复用这些写法。一、关联文档全貌一份验证首页链接的测试笔记test-workspace/vault/dendron.ref.publishSite.md 位于 Dendron 的测试工作区test-workspace中其 frontmatter 声明了笔记元数据--- id: fe865974-9741-41bf-afb8-f25ca5a604d5 title: publishSite desc: updated: 1614629174763 created: 1614629107657 ---笔记正文刻意保持极简只包含两个小节、四种指向「首页home page」的写法用于验证发布场景下的链接转换行为abs link to home page绝对链接到首页[[Dendron|dendron://vault/dendron]]带 vault 前缀的 wiki 链接[[Dendron|dendron]]普通 wiki 链接带别名note ref to home page笔记引用到首页![[dendron://vault/dendron]]绝对引用![[dendron]]相对引用这里的「首页」对应笔记 test-workspace/vault/dendron.md——它是dendron层级hierarchy的域根笔记domain note标题为Dendron正文是 Welcome to Dendron! This guide will help get you started with your knowledge base.。需要说明的是这是一份面向渲染管线的测试笔记它的价值不在「内容详尽」而在于用四种最典型的目标写法锁定发布管线中一个极易出错的行为——首页链接的重写rewrite与渲染。下文将结合源码解释这四种写法各自的语法含义以及它们在发布管线中是如何殊途同归的。二、首页的判定Site Index 与 siteHierarchies要理解「链接指向首页」这件事先要明确 Dendron 如何定义站点首页。2.1 siteIndex 配置项在发布配置类型 packages/common-all/src/types/configs/publishing/publishing.ts 中DendronPublishingConfig定义了siteIndex与siteHierarchies两个关键字段export type DendronPublishingConfig { // ... siteIndex?: string; // 站点首页对应的笔记 fname siteHierarchies: string[]; // 需要发布的层级hierarchy列表 // ... };而 SiteUtils.getSiteUrlPathForNote 在生成 URL 时会先判断当前笔记是否就是索引笔记const isIndex: boolean _.isUndefined(note) ? false : SiteUtils.isIndexNote({ indexNote: config.publishing?.siteIndex, note, }); if (isIndex) { return /; }也就是说当笔记 fname 等于siteIndex时其 URL 会被特殊处理为根路径/而不是普通的/notes/dendron.html这类带层级路径的地址。2.2 isIndexNote 的判定规则SiteUtils.isIndexNote 的实现如下static isIndexNote({ indexNote, note, }: { indexNote?: string; note: NotePropsMeta; }): boolean { return indexNote ? note.fname indexNote : DNodeUtils.isRoot(note); }逻辑非常清晰若配置了siteIndex则当笔记的fname与siteIndex完全相等时即为首页若未配置siteIndex则退回到判断是否为root笔记。此外 test-workspace/other-files/config.ts 提供了一个更宽松的回退逻辑static getSiteIndex(sconfig: DendronPublishingConfig) { let { siteIndex, siteHierarchies } sconfig; return siteIndex || siteHierarchies[0]; }即未显式配置siteIndex时直接取siteHierarchies的第一个层级作为首页。这也是为什么dendron层级在很多工作区里天然承担首页角色的原因。2.3 测试工作区中的实际配置在 test-workspace/dendron.yml 的publishing段中可以看到相关配置publishing: siteHierarchies: - dendron - bar - foo - tags - task siteRootDir: docs enablePrettyLinks: true # ...这里没有显式siteIndex按照getSiteIndex的规则siteHierarchies的第一个成员dendron即站点首页。因此 test-workspace/vault/dendron.md 正是本测试笔记中的目标「首页」。三、四种首页写法逐一拆解3.1 绝对链接[[Dendron|dendron://vault/dendron]]这是带 vault 限定前缀的 wiki 链接语法为[[别名|dendron://vault/笔记名]]。它显式声明目标笔记位于名为vault的库中即使存在多 vault 同名笔记也能精确定位。别名Alias为Dendron因此链接展示文字为Dendron。3.2 绝对链接[[Dendron|dendron]]这是不带 vault 前缀的 wiki 链接语法为[[别名|笔记名]]。别名同样是Dendron目标笔记为dendron。在单 vault 或默认 vault 场景下它等效于上一种写法。3.3 绝对引用![[dendron://vault/dendron]]![[...]]是 Dendron 的笔记引用Note Reference / Note Ref语法!前缀表示将目标笔记内容内联inline嵌入当前页面。这里使用的是带 vault 前缀的绝对引用。3.4 相对引用![[dendron]]不带!之外任何限定的相对引用表示引用「当前上下文」中 fname 为dendron的笔记内容。它是 Note Ref 最常见的日常写法。小结这四种写法覆盖了 wiki 链接与 Note Ref 两大语法族各自又包含「带/不带 vault 前缀」两种形式恰好构成一个 2×2 的测试矩阵用来验证发布时首页链接的所有可能输入形态。四、发布渲染管线的底层实现这些链接最终如何变成发布站点上的首页链接答案在unified包的渲染管线中。4.1 管线的组装utilsv5packages/unified/src/utilsv5.ts 中的_procRemark负责按顺序装配 remark 插件。其中对本次主题至关重要的两处wikiLinks解析器负责把[[...]]语法解析为WIKI_LINK类型的 AST 节点proc proc.use(wikiLinks, data.wikiLinksOpts);在 HTML 发布目标下注册dendronPub主渲染插件proc proc.use(dendronPub, { insertTitle, transformNoPublish: opts.flavor ProcFlavor.PUBLISHING, ...data.publishOpts, });4.2 首页链接重写的关键插件publishSite仓库中真正与本文主题同名的是 packages/unified/src/remark/publishSite.ts 中的publishSite插件。它定义了PublishSiteOptstype PluginOpts { noteIndex: NoteProps; };其核心逻辑非常直白function transformer(tree: Node, _file: VFile) { if (dest ! DendronASTDest.HTML) { return; } visit(tree, (node, _idx, _parent) { if (node.type DendronASTTypes.WIKI_LINK) { const cnode node as WikiLinkNoteV4; const value cnode.value; const href PublishUtils.getSiteUrl(config); if (value opts.noteIndex.fname) { node.data!.hProperties { href }; } } }); return tree; }它的行为可以概括为仅在 HTML 发布目标DendronASTDest.HTML下生效不干扰预览、导出等其他场景遍历所有WIKI_LINK节点当链接的value与索引笔记noteIndex的fname相等时将该链接的href直接改写为PublishUtils.getSiteUrl(config)返回的站点 URL——即站点根地址。也就是说所有指向首页笔记的 wiki 链接在发布时都会被统一重写为站点首页 URL与链接书写成绝对带 vault 前缀还是相对形式无关——这正是测试文档中两类「abs link」写法预期的行为。4.3 站点 URL 的解析PublishUtils.getSiteUrl首页链接最终指向哪里由 packages/unified/src/utils.ts 中的PublishUtils.getSiteUrl决定static getSiteUrl (config: DendronConfig) { const publishingConfig ConfigUtils.getPublishing(config); if (getStage() ! dev) { const siteUrl process.env[SITE_URL] || publishingConfig.siteUrl; return siteUrl; } else { return ( http:// path.posix.join(localhost:${process.env.ELEV_PORT || 8080}) ); } };关键细节非 dev 阶段优先取环境变量SITE_URL否则取publishing.siteUrl配置dev 阶段返回本地http://localhost:8080端口可用ELEV_PORT环境变量覆盖。这解释了发布与本地预览下首页链接行为不同的原因。对应配置项siteUrl的定义见 packages/common-all/src/constants/configs/publishing.tsURL of the site without trailing slash不带尾部斜杠的站点 URL。五、Note Ref 的渲染路径dendronPub 与 noteRefsV25.1 dendronPub 主插件中的 Note Ref 处理测试文档中的![[...]]引用由 packages/unified/src/remark/dendronPub.ts 负责转换。当遍历到REF_LINK_V2类型的节点时if (node.type DendronASTTypes.REF_LINK_V2) { // If the target is Dendron, no processing of refs is needed if (dest DendronASTDest.MD_DENDRON) return; const ndata node.data as NoteRefDataV4; const copts: NoteRefsOptsV2 { wikiLinkOpts: opts?.wikiLinkOpts, }; const procOpts MDUtilsV5.getProcOpts(proc); const { data: noteRefHAST } convertNoteRefToHAST({ link: ndata.link, proc, compilerOpts: copts, procOpts, }); if (noteRefHAST) { parent.children replacedUnrenderedRefWithConvertedData( noteRefHAST, parent.children ); } }引用会被转换为 HASTHTML 抽象语法树并内联到父节点的 children 中。由于 Note Ref 在发布时本质上是「把目标笔记内容嵌入当前页面」因此它并不会产生一个独立的a链接——这与 wiki 链接的行为不同也是测试文档将 Note Ref 单独列为一节的深层原因「引用到首页」在发布后的语义是「首页内容出现在当前页面中」。5.2 渲染顺序的约定在 packages/unified/src/utilsv5.ts 中有一行关键注释与逻辑// NOTE: order matters. this needs to appear before dendronPub if (data.dest DendronASTDest.HTML) { if ( _.isUndefined(data.wikiLinksOpts?.convertLinks) || data.wikiLinksOpts?.convertLinks ) { proc proc.use(hierarchies).use(backlinks); } }hierarchies与backlinks插件必须先于dendronPub注册wikiLinks解析器则更早。整个插件的注册顺序直接影响链接转换的先后这是阅读本测试文档时值得记住的实现约束。六、从测试笔记到发布配置实操建议6.1 在 dendron.yml 中确保首页配置正确参考 test-workspace/dendron.yml发布时你需要关注publishing: siteUrl: https://your-site.com # 发布站点的根地址不带尾部斜杠 siteIndex: dendron # 可选显式指定首页笔记 siteHierarchies: - dendron # 若未设 siteIndex第一项即首页 siteRootDir: docs enablePrettyLinks: true配置要点配置项作用备注siteUrl站点根 URL不带尾部斜杠发布时首页链接指向它siteIndex首页笔记 fname可选缺省时取siteHierarchies[0]siteHierarchies参与发布的层级列表首页所在层级建议放在首位siteRootDir发布产物输出目录相对工作区根目录enablePrettyLinks是否生成无.html后缀的链接见 SiteUtils.getSiteUrlPathForNote 中对usePrettyLinks的分支处理6.2 编写指向首页的链接与引用根据 test-workspace/vault/dendron.ref.publishSite.md 的四种写法可直接在你的笔记中这样写### 链接到首页推荐写法 [[Dendron|dendron]] # 普通 wiki 链接 [[Dendron|dendron://vault/dendron]] # 带 vault 前缀多 vault 场景更精确 ### 在页面中嵌入首页内容 ![[dendron]] # 相对引用 ![[dendron://vault/dendron]] # 绝对引用行为差异提醒[[...]]在发布后会被 publishSite 插件 重写为指向siteUrl的首页链接一个可点击的a![[...]]在发布后会把dendron.md的正文内容内联进当前页面不会生成指向首页的a链接。6.3 验证发布结果发布后建议检查生成的siteRootDir本测试工作区为docs下的首页产物确认点击[[Dendron|dendron]]渲染出的链接地址是否等于siteUrl![[dendron]]所在页面是否出现了dendron.md的正文Welcome to Dendron!...本地 dev 预览时对应getStage() dev分支首页链接是否指向http://localhost:8080。若行为与预期不符优先检查siteIndex/siteHierarchies配置以及SITE_URL、ELEV_PORT环境变量是否干扰了getSiteUrl的取值。七、总结一条链接两条管线回顾全文dendron.ref.publishSite.md 看似只有四行链接实际锚定了 Dendron 发布系统的两个核心行为Wiki 链接[[...]]由wikiLinks解析器生成 ASTpublishSite插件在 HTML 目标下将「等于索引笔记 fname 的链接」重写为getSiteUrl返回的首页地址索引笔记的判定由siteIndex/siteHierarchies决定。Note Ref![[...]]由dendronPub插件调用convertNoteRefToHAST将目标笔记内容内联嵌入当前页面语义是「内容嵌入」而非「链接跳转」。配套源码路径速查测试笔记test-workspace/vault/dendron.ref.publishSite.md首页笔记test-workspace/vault/dendron.md发布配置test-workspace/dendron.yml首页链接重写插件packages/unified/src/remark/publishSite.ts主渲染插件packages/unified/src/remark/dendronPub.ts管线组装packages/unified/src/utilsv5.tsURL 与索引判定packages/unified/src/SiteUtils.ts、packages/unified/src/utils.ts配置类型定义packages/common-all/src/types/configs/publishing/publishing.ts理解这条「链接 → 首页」的完整链路你就能在自己的 Dendron 发布站点中精准控制首页的入口表现也能够在排查「首页链接 404」类问题时快速定位是配置问题、插件顺序问题还是链接写法问题。赞分享知识管理知识库【免费下载链接】dendronThe personal knowledge management (PKM) tool that grows as you do!项目地址https://gitcode.com/gh_mirrors/de/dendron点击查看免费下载相关推荐Flowbite 构建工具链实战从源码构建文档站点与发布 NPM 包Flowbite 构建工具链实战从源码构建文档站点与发布 NPM 包 Flowbite 是一个基于 Tailwind CSS 的开源 UI 组件库其仓库本身UI组件前端Kornia 文档站点 SEO 与链接治理搜索标题、描述、canonical 教程链接与旧页面重定向的实现解析Kornia 文档站点 SEO 与链接治理搜索标题、描述、canonical 教程链接与旧页面重定向的实现解析 本文以 Kornia 仓库变更记录 chang计算机视觉人工智能深度学习图像处理gatsby-dev-cli 完全指南把 Gatsby monorepo 源码热链接到你的测试站点gatsby dev cli 完全指南把 Gatsby monorepo 源码热链接到你的测试站点 本篇指南围绕 Gatsby 官方 monorepo 中 g前端静态站点Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑