docmd 0.8.0 版本带来了一次具有里程碑意义的架构升级 —— 引入了原生的多线程 Worker 池,支持并行处理页面,极大地缩短了大型文档网站的构建时间,并推出了强大的全新插件 Worker API。

✨ 亮点功能

⚡ 多线程构建架构

docmd 现在通过高度优化的 WorkerPool 并行构建您的文档。通过将构建流水线中最繁重的部分(Markdown AST 解析和处理器钩子)移至独立的后台线程中,docmd 现在可以充分利用所有可用的 CPU 核心。

对于大型工作区(例如拥有超过 1000 个页面的项目),这将带来巨大的性能提升,大幅缩短冷启动构建时间,并使热重载(hot-reload)开发体验变得更加流畅。系统会智能地限制线程池的规模(即 os.cpus().length - 1),以确保您的主系统在繁重的构建过程中依然保持响应。

🔌 插件 Worker API

我们不仅让 docmd 支持多线程,还让整个生态系统都能轻松利用它。

插件现在可以将自身繁重的计算任务或同步操作交由 docmd 的 Worker 池处理,而无需自行管理线程的创建与生命周期。我们在 ActionContextPageContext 以及 PostBuildContext 中注入了一个全新的 runWorkerTask API。

export default {
  plugin: { name: 'my-plugin', version: '1.0.0', capabilities: ['post-build'] },
  
  async onPostBuild(ctx) {
    // 将重型操作(如解析 Git 历史记录)发送到后台线程处理
    const result = await ctx.runWorkerTask(
      '/absolute/path/to/my-worker-script.js', 
      'parseGitHistory', 
      [ctx.outputDir]
    );
  }
}

🧩 共享模块化核心

我们正式提取了一个新的底层包 @docmd/utils,这是一个零依赖的共享实用工具库。该包集中了文件系统封装、路径规范化、哈希生成机制以及核心的 WorkerPool,从而避免了循环依赖,并允许插件直接从 docmd 生态系统中引入可靠的实用工具。

📝 完整更新日志

🚀 引擎与架构

  • Worker-Parser 流水线:核心 Markdown 处理器现在在后台线程中动态重构。文件被并发读取,并分批交由 Worker 处理。
  • AST 缓存引擎:引入了基于 MD5 的缓存层来拦截未修改的文件。如果文件的原始内容哈希值与上次构建相比没有改变,将直接跳过 AST 解析。
  • 持久化开发 Worker:在运行 docmd dev 期间,Worker 池会在文件保存时保持持久化运行。这消除了 Node.js Worker 常见的 200-500 毫秒线程启动延迟,实现了近乎瞬时的增量重建。
  • Worker CPU 节流:线程池会根据系统架构精确计算线程数量,并保留一个 CPU 核心,以防止 I/O 饥饿和操作系统卡顿。

🔌 插件系统

  • runWorkerTask API:直接在插件上下文(onBeforeRenderonPostBuildactionsevents)中公开,用于在后台执行通用脚本。
  • Git 插件持久化缓存:Git 插件现在利用了强大的持久化磁盘缓存 (.docmd/cache/git-history.json),并通过文件修改时间 (mtimeMs) 进行失效验证。这完全消除了在后续构建中多余的 git log shell 子进程,将大型仓库(800+ 页面)的构建时间从约 18 秒缩短至仅约 3.5 秒。
  • 解耦的 API 导入:插件现在可以直接从 @docmd/utils 导入 fsUtilsWorkerPoolgetGitRoot

⚙️ 基础设施与工具

  • 集中式的 Git 上下文:内部的 Git 分支检测和仓库根目录解析(getGitRoot)已被提取到安全的工具边界内。
  • JSON 可序列化配置:通过确保解析后的配置对象完全可转换为 JSON 格式,进一步向零配置架构过渡,使其能够安全地传输到 Worker 线程中。

⚠️ 破坏性变更

  • 核心模块导入:如果您的自定义插件之前依赖于 @docmd/core/src/utils/fs-utils 等深层相对路径导入,您必须将这些导入更新为 @docmd/utils
  • Worker 执行上下文:挂载在 markdownSetup 中的插件必须确保其扩展是完全可序列化的,因为 markdown-it 处理器现在跨线程边界实例化。

升级指南

运行 npm install docmd@latest 进行升级,然后:

  1. 测试您的自定义插件:如果您维护了一个操作 AST 或需要大量 CPU 时间的自定义 docmd 插件,请尝试使用全新的 runWorkerTask,这能让构建循环保持极速。
  2. 移除手动核心导入:将 import { fsUtils } from '@docmd/core/dist/utils/fs-utils' 替换为 import { fsUtils } from '@docmd/utils'

获取完整演练,请参阅快速入门 - 安装