DEBUG.WIKI
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →
腾讯云;让你的想法跑起来;轻量服务器 · 建站 / Docker / API;查看产品 →
阿里云;从建站到云上业务;云服务器 · 数据库 · 对象存储;查看产品 →

Bun 新建文件后 require.resolve 仍报找不到模块

Bun 1.4.3、1.4.4 的长驻进程可能复用相对模块查找的旧目录信息。区分生成时序与解析缓存,对明确的本地文件采用绝对路径并重建守护进程基线。

插件文件已经生成,路径也能直接打开,Bun 长驻进程却一直报 Cannot find module './inference.cjs'。重启守护进程后恢复,下一次生成新文件又失败时,应检查第一次解析是否发生在文件创建之前。

Bun 1.4.3、1.4.4 在 macOS 存在这条具体路径:require.resolve() 使用 paths 查找相对文件,首次找不到后,后续查找仍沿用旧目录信息。它会影响动态生成本地插件的工具;不能据此把所有模块不存在错误都判断成缓存缺陷。

文件存在,不表示当前进程重新看过目录

容易触发的调用形状如下,root 是项目已经确定的绝对目录:

const path = require('node:path');

const resolvePlugin = () => require.resolve('./inference.cjs', {
  paths: [path.join(root, '.nx/installation'), root],
});

若首次调用时 inference.cjs 尚未生成,后面即使完成写入,同一进程仍可能抛出 MODULE_NOT_FOUND。先记录首次解析、生成完成和再次解析的先后顺序,并在执行守护进程的同一文件系统中核对完整路径。容器挂载、工作目录错误和文件还没有写完,也能造成类似表象。

这不是已经加载的模块导出没有刷新。删除 require.cache 中的条目,不能保证清除解析器保存的目录信息;找不到的文件也未必有一个可删除的已加载模块条目。

本地生成文件可以直接解析绝对路径

当插件约定就是项目根目录下的这个文件,可在文件写入完成后使用明确路径:

const path = require('node:path');

const pluginFile = path.join(root, 'inference.cjs');
const resolved = require.resolve(pluginFile);

该场景下绝对路径解析可以找到新文件。Bun 还提供 Bun.resolveSync('./inference.cjs', root);选择哪种接口,要与工具原本需要的解析语义一致。若工具随后真正加载插件,仍需沿用它的加载、隔离与错误处理流程,不能把“解析到路径”当作插件已经成功运行。

不要把所有裸包名都拼到项目根目录。require.resolve('some-package', { paths }) 的包搜索、exports 条件和候选目录,与一个位置已确定的本地生成文件不是同一契约。第三方工具内部固定使用原调用时,应优先采用工具支持的插件路径配置,或按其正常流程重启守护进程;不要直接改安装目录里的解析器。

重启后保留原来的生成顺序复查

临时重启能让长驻进程重新读取目录,但如果插件生成本来就与首次加载并发,重启只是偶然改变时序。应先让生成步骤完成,再开始插件解析,避免读取半成品。重启前保留守护进程日志和必要状态,使用工具原有的停止与启动命令。

验收要覆盖“启动时文件已存在”和“进程启动后才生成文件”两条路径,并检查同一次运行里第二次解析是否看到新文件。随后再确认插件真正被加载、配置生效,且错误的插件路径仍会正常报错。

Bun 1.4.3 与 1.4.4 的上述场景可以按此排查。若准备改用更新版本,仍需覆盖进程启动后生成文件的顺序;不能只凭版本号更高就撤掉局部处理。若改用绝对路径后仍失败,回到实际文件位置、权限、包导出和插件加载错误继续排查。