Skip to content

content/docs 有 18 条链接在站上是 404,但 check-doc-links 按设计放行(1 条相对链接跑出 docs collection + 17 条 /spec /protocol /api /examples 绝对链接) #3490

Description

@yinlianghui

#3479 / PR #3489(把 scripts/check-doc-links.mjs 扩到相对链接)过程中顺手发现,记在这里由 PM 定级。不在 #3479 的完成范围内:#3479 的口径是 lychee 实测的 16 个目标 / 33 处引用,那批已在 PR #3489 修完并且门禁绿了;下面这 18 条 lychee 与扩展后的 checker 都判绿,因为两者都只做「文件系统能否解析」,而这 18 条的问题是「站点路由不存在」。

根:门禁只在 docs collection 内解析

check-doc-links.mjs 现在校验两类 href —— 相对 href(按源文件目录解析)与绝对 /docs/...(按路由解析)。其余绝对 href 一律放行,因为从 content/docs 无从判断 apps/site 的路由表。这是当时的有意取舍,不是疏漏;但代价是下面两类实际 404 无人拦。

A. 1 条相对链接跑出了 collection

content/docs/guide/data-source.md:202

[adapter README](../../../packages/data-objectstack/README.md#cross-object-atomic-batch-batchtransaction)

文件在磁盘上真实存在,所以 lychee --offline 和扩展后的 checker 都判绿。但站点侧解析不了:fumadocs 的 source.resolveHref 只能在 docs collection 的页面索引里查,packages/** 不在其中,于是 href 原样落到浏览器。

构建产物实证(apps/site/.next/server/app/docs/guide/data-source.html):

href="../../../packages/data-objectstack/README.md#cross-object-atomic-batch-batchtransaction"

页面 URL 是 /docs/guide/data-source,浏览器相对解析后落到 /packages/data-objectstack/README.md —— 站上无此路由,404。

B. 17 条非 /docs 绝对链接指向不存在的路由

apps/site/app/ 下的路由段只有:(home)docsplaygroundogllms.mdxapi/search(route handler)。没有 specprotocolexamples;next.config.mjs 只有一条 /docs/:path*.mdx 重写,仓库里也没有 vercel.json。所以下列全部 404:

文件 href
guide/component-registry.md /spec/component-package.md/spec/component.md/api/core/api/react
guide/schema-rendering.md /spec/schema-rendering/spec/architecture/protocol/overview/api/core/api/react
guide/expressions.md /protocol/overview/protocol/form/protocol/view/api/core
guide/fields.md /protocol
guide/plugins.md /spec/component-package.md
guide/objectos-integration.mdx /examples/crm/examples/kitchen-sink

构建产物实证:.next/server/app/docs/guide/plugins.html 里是 href="/spec/component-package.md",.../expressions.html 里是 href="/protocol/overview" 等 —— 原样输出。

(同一批里的 3 条 /img/guide/dashboard-filters/*.png的:apps/site/public/img/guide/dashboard-filters/ 下三个文件都在。)

顺带一提,/spec/component-package.md 还带着 .md 后缀 —— 即便将来真有 /spec 路由,这个写法也仍是错的。

可能的处理方向(由 PM/维护者定,本 issue 不预设)

  1. 只修内容:把这 18 条改指真实存在的目标(/docs/... 页面、或 GitHub 上的 packages/**/README.md 绝对 URL —— plugins/*.mdx 里的 "Package README" 已经是这个写法),门禁不动。
  2. 顺带补门禁:让 check-doc-links.mjs 也能判非 /docs 绝对 href。需要一份站点路由的真值来源(枚举 apps/site/app 的路由段 + public/ 静态资源),这会让脚本从「只读 content/docs」变成「也读 apps/site」,是个设计取舍;同时可考虑拒绝跑出 collection 的相对链接(A 类)。
  3. 两者都做。

方向 2 是防止再次积攒的唯一办法(#3479 的教训正是「没门禁就会攒」),但它把脚本的职责扩大了一圈,值得单独定。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingpm:queue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions