You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docusaurus是否支持全局可用的站点数据寄存器?

如何在Docusaurus中实现类似Jekyll register API的稳定链接功能

核心结论

Docusaurus目前没有原生的全局可访问数据寄存器(对应Jekyll的site.data、context.registers这类哈希结构),你提到的社区需求确实尚未进入开发阶段。

针对稳定链接需求的替代方案

你的核心需求是通过ID生成不受路径/标题变化影响的链接,以下是几种可行的实现方式:

1. 自定义插件+全局数据注入

编写自定义Docusaurus插件,在构建生命周期中收集页面/对象的ID与路径映射:

  • 在插件的contentLoaded阶段,遍历所有文档/页面数据,提取frontmatter中定义的ID(比如--- id: doc-123 ---)和对应的页面路径、标题
  • 将映射数据存入插件的globalData,或通过siteConfig.customFields暴露
  • 在MDX文档或自定义组件中,通过useDocusaurusContext获取全局数据,根据ID生成链接

示例插件核心代码片段:

module.exports = function (context, options) {
  return {
    name: 'id-link-plugin',
    async contentLoaded({ content, actions }) {
      const { setGlobalData } = actions;
      // 收集docs的ID-路径映射
      const idMap = content.docs.map(doc => ({
        id: doc.frontMatter.id,
        path: doc.path,
        title: doc.frontMatter.title
      })).filter(item => item.id);
      setGlobalData({ idMap });
    }
  };
};

在MDX中使用:

import { useDocusaurusContext } from '@docusaurus/core';

function LinkById({ id }) {
  const { siteConfig, globalData } = useDocusaurusContext();
  const target = globalData['id-link-plugin'].idMap.find(item => item.id === id);
  if (!target) return <span>Invalid ID</span>;
  return <a href={target.path}>{target.title}</a>;
}

<LinkById id="doc-123" />

2. 自定义MDX链接组件

直接封装一个MDX组件,利用Docusaurus内置的文档数据实现ID匹配:

  • 借助@docusaurus/plugin-content-docs提供的useDocs钩子,获取所有文档元数据
  • 在组件内部根据传入的ID匹配对应的文档,生成链接

示例组件:

import { useDocs } from '@docusaurus/plugin-content-docs/client';

export default function LinkById({ id, children }) {
  const { docs } = useDocs();
  const doc = docs.find(d => d.frontMatter.id === id);
  if (!doc) {
    return <span className="text-red-500">Unknown document ID: {id}</span>;
  }
  return <a href={doc.path}>{children || doc.title}</a>;
}

之后在MDX中直接引入使用即可:

<LinkById id="doc-123">查看文档</LinkById>

3. 预生成ID映射文件

通过脚本在构建前扫描所有文档,生成静态的ID-路径映射文件:

  • 写Node.js脚本遍历docs目录,提取每个文档的ID和路径,生成id-map.json并存入static目录
  • 在MDX或组件中直接导入该JSON文件,根据ID查找路径生成链接

补充说明

如果需要更复杂的全局数据传递场景,Docusaurus的插件系统支持通过pluginContext在插件间共享数据,或利用globalData实现跨插件的数据访问,虽然不是Jekyll那样的全局寄存器,但可以满足大部分数据共享需求。

内容的提问来源于stack exchange,提问作者Рауль Каримов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:31:26