import pkg from 'some-cjs'; const fn = pkg.default ?? pkg; console.log(Object.keys(pkg));
项目切成新的模块格式后,原来直接 require 拿到的函数改成默认导入,调用时报 dayjs is not a function,把导入结果打印出来却是个带 default 属性的对象。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,运行时对 CommonJS 的默认导出做了一层包装,整体挂在 default 上,打包工具又各做一次互操作处理,两边行为不同就多套了一层,取值位置也跟着变。
「ESM 导入 CJS default」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
处理上按这个顺序:先把导入的结果打印出来,先看清楚实际结构;按实际层级去取默认属性,或者改成命名导入;固定打包工具的互操作选项,不让两边混着用。
改完只确认一件事:调用不再报不是函数,导入对象的结构和预期一致,重启后也正常。
