热重载(HMR)是指在不重启整个进程的前提下,修改插件源码后让其原地替换、缓存与连接保持不动。Cordis 的可逆副作用与纤程状态机共同支撑了这一能力。
Cordis 自己实现了 Node 环境下的热重载:监听文件变化后,备份模块缓存,清空缓存,重新导入模块,重新注册插件。这一套"备份—清空—重导入"的组合拳跨 Node 22、23、24 三个大版本兼容。开发插件的人保存一下代码,插件即可原地换新,已建立的连接和缓存纹丝不动。
每个插件运行在一个 Fiber 中,运行时为每个 Fiber 维护一个"纪元"(epoch),本质是该插件所有依赖的指纹。依赖发生变化时指纹随之改变,插件被调度重载:先同步清空副作用列表,再逆序调用 dispose,中间用一把 inertia 锁保证重载与卸载不会并发打架。只有依赖真正发生变化的插件会被重启,其余插件保持不动。
这套机制在 Koishi 生态中已被验证多年:管理员从控制台停用一个插件,它对系统的影响会原地撤回,其他插件接着干活;开发者改完插件代码一保存,被修改的插件重新挂载,缓存和连接不受影响。品玩的实测中,DeepSeek Harness 装卸二十余个插件,全程未重启一次。