Node 从 18 升到 22 后启动报 was compiled against a different Node.js version,NODE_MODULE_VERSION 108 与 127 不匹配。删掉 node_modules 重装还是一样。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
node -p "process.versions.modules" npm rebuild npm cache clean --force && npm install
原生模块编译时把 ABI 版本号写进二进制,运行时对不上就直接拒绝加载。npm 装的是预编译好的包,缓存里还是旧 ABI 的产物,重装不会触发重新编译。这一点先确认清楚,后面就不用反复试。
「NODE_MODULE_VERSION」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
具体做法是,删掉 node_modules 和 lock 文件后重新安装 让预编译包按新版本下载;没有对应预编译包就本地装编译链 跑 npm rebuild;确认 Python 和 MSVC 构建工具在位 node-gyp 要用;容器里固定 Node 大版本 别让基础镜像悄悄升级。
改完照着核一遍,node -p 打印 127 启动日志里不再出现 NODE_MODULE_VERSION 相关报错。
