agmd 1.0 重磅升级------Rust 重写,性能起飞
距离发布第一个版本是四年前了,上个版本agmd v0.4.0 node版本也已经过去半年了, 这段时间我也没闲着,憋了个大招出来,希望能帮到有项目重构和文档生成需求的朋友们~_~
前言
本期所要讲的不是新插件,而是对原 agmd 的彻底重构 ------从 Node.js 全面迁移到 Rust ,版本号直接从 0.4 跃升至 1.0.1!
这次升级主要有:
🚀 Rust 重写 ------ 零 Node.js 依赖,单二进制文件直接运行
⚡ 性能大幅提升 ------ 大工程扫描速度明显加快,内存占用更低
📦 双形态分发 ------ 既是 CLI 工具,也是 Rust 库,还能通过 npm 安装
🖥️ 多平台预编译 ------ Windows、Linux x64、Linux ARM64 开箱即用
✅ 测试用例翻倍 ------ 从 26 个增加到 36+ 个,新增端到端集成测试
🎯 所有原有功能保留 ------ 界面菜单、路径转换、路由分析、工程拆分、kebab-case 命名统一,一个都不少
另外本次重构依然保留了全程界面命令选择操作,对非 Rust 开发者友好,装完 npm 包直接就能用。
制作动机
年前我做第一版 agmd 的时候,用的是 Node.js + commander,功能虽然齐了,但随着工程体量变大,问题越来越明显:
速度:扫描一个大型前端 monorepo,Node.js 遍历文件系统 + 正则解析,慢的时候能喝口水。
今年不是又换了工作嘛(对,又换了🤣),新公司项目代码量直接上一个量级,老插件跑起来有点吃力了。再加上我一直想深入学习 Rust,索性一不做二不休------用 Rust 把整套逻辑重写一遍。
说干就干,从第一行 Rust 代码到稳定发版,中间经历了无数次 "这 borrow checker 又报错了" 的夜晚,commit 数也从原来的 265 次累积到了现在。但结果是值得的:现在扫描同样规模的工程,速度快了不止一倍,而且编译成一个单文件,扔到哪儿都能跑。
功能介绍
🚀 Rust 重写,零依赖单二进制
以前装 agmd 需要 Node.js 环境。现在如果你用 npm 安装,postinstall 脚本会自动下载对应平台的预编译二进制(Windows .exe、Linux x64、Linux ARM64);如果你本身就是 Rust 开发者,也可以直接 cargo install。
核心运行时从 Node.js 换成了 Rust + Tokio,文件遍历、正则解析、路径计算全部原生执行,大工程感受特别明显。
📦 同时提供 Rust 库 API
这次不只是 CLI 工具,src/lib.rs 还暴露了两个异步 API:
get_file_nodes_api------ 扫描目录返回FileNode树get_md_api------ 直接生成 Markdown 文档
如果你想在自己的 Rust 项目里集成目录扫描和文档生成能力,直接调用就行。
⚡ 原有功能全部保留,体验更稳
以下功能在 Rust 版中全部原汁原味保留,而且因为 Rust 的类型系统和错误处理,出 bug 的概率更低了:
⛵ 绝对路径 ↔ 相对路径互转
@/unuse/components/user-rulerts 一键转成 ../../unuse/components/user-rulerts.vue,反之亦然。方便在 "书写时用别名、提交前/查看时转相对路径" 的 workflow 中使用。
♨️ 批量补全后缀
自动给 import 补上 .vue、.js、.ts 后缀,甚至能补全 index.vue / index.js。VS Code 里点进去就能跳转,不用猜后缀。
👏 按路由标记分类 + 自动拆分工程
微服务/qiankun 项目越堆越大,需要拆工程的时候,插件内置对 router 目录的自动分析,帮你把 "只有工程 A 用到"、"只有工程 B 用到"、"两边都用" 的文件标记出来,拆分的时候心里有底。
☝️ 一键文件名规范化(kebab-case / CamelCase)
工程命名五花八门?一键把驼峰改成短横线连接(或反向),搞完后整个工程看上去都舒服了。Windows 下大小写不敏感文件系统也做了特殊处理,不会翻车。
✅ 测试用例从 26 个增加到 36+ 个
重构不是简单翻译代码,而是重新梳理了边界情况。现在的测试覆盖了:
- 文件系统扫描与解析
- import 路径替换(同级、兄弟、深层、
@别名互转、仅补全后缀) - 路由正则解析
- Markdown 统计与格式化
- 新增:端到端集成测试(临时目录构造真实工程,完整跑一遍扫描→替换→输出)
- 新增:重命名路径的嵌套目录和 Windows 大小写处理测试
如果你打算二开扩展功能,这些测试用例依然是最好的安全网。
🖥️ 交叉编译 + npm 多平台分发
项目配置了 aarch64-unknown-linux-gnu、x86_64-pc-windows-gnu、x86_64-unknown-linux-gnu 等交叉编译目标。发布时把预编译二进制丢进 bin/ 目录,npm 包会自动根据当前平台选择正确的可执行文件。
Rust 开发者也可以直接用 cargo build --release 打出自己平台的版本。
写在最后
这个插件从 Node.js 0.2 版走到今天 Rust 1.0 版,中间 commit 数已经过了 300+,都是自己来来回回修改、一点点敲出来的。Rust 的重写尤其磨人,borrow checker 和生命周期让我掉了不少头发,但看到大工程扫描时那丝滑的输出,一切都值了。
我也希望把这些成果公布出来,有需要学习源码的,可以进到我的 git 地址 去克隆查看。开源不易,如果对你有帮助,还请不吝啬一个小小的 star,你的支持是我开源的动力!