发行说明 - 0.8.0
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 池处理,而无需自行管理线程的创建与生命周期。我们在 ActionContext、PageContext 以及 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 饥饿和操作系统卡顿。
🔌 插件系统
runWorkerTaskAPI:直接在插件上下文(onBeforeRender、onPostBuild、actions、events)中公开,用于在后台执行通用脚本。- Git 插件持久化缓存:Git 插件现在利用了强大的持久化磁盘缓存 (
.docmd/cache/git-history.json),并通过文件修改时间 (mtimeMs) 进行失效验证。这完全消除了在后续构建中多余的git logshell 子进程,将大型仓库(800+ 页面)的构建时间从约 18 秒缩短至仅约 3.5 秒。 - 解耦的 API 导入:插件现在可以直接从
@docmd/utils导入fsUtils、WorkerPool和getGitRoot。
⚙️ 基础设施与工具
- 集中式的 Git 上下文:内部的 Git 分支检测和仓库根目录解析(
getGitRoot)已被提取到安全的工具边界内。 - JSON 可序列化配置:通过确保解析后的配置对象完全可转换为 JSON 格式,进一步向零配置架构过渡,使其能够安全地传输到 Worker 线程中。
⚠️ 破坏性变更
- 核心模块导入:如果您的自定义插件之前依赖于
@docmd/core/src/utils/fs-utils等深层相对路径导入,您必须将这些导入更新为@docmd/utils。 - Worker 执行上下文:挂载在
markdownSetup中的插件必须确保其扩展是完全可序列化的,因为 markdown-it 处理器现在跨线程边界实例化。
升级指南
运行 npm install docmd@latest 进行升级,然后:
- 测试您的自定义插件:如果您维护了一个操作 AST 或需要大量 CPU 时间的自定义 docmd 插件,请尝试使用全新的
runWorkerTask,这能让构建循环保持极速。 - 移除手动核心导入:将
import { fsUtils } from '@docmd/core/dist/utils/fs-utils'替换为import { fsUtils } from '@docmd/utils'。
获取完整演练,请参阅快速入门 - 安装。