Vagrant虚拟机中无法运行Node.js 18.18.0及以上版本的npm命令
我之前也碰到过几乎一模一样的问题!折腾了好一阵才找到根源,跟你分享下我的解决思路和办法:
首先,你遇到的这些ENOTSUP错误,本质上是Vagrant默认的共享文件夹(比如VirtualBox的vboxsf)和Node.js 18.18+版本的文件系统操作不兼容导致的。Node.js从18.18.0开始调整了部分文件IO相关的逻辑,而vboxsf这类共享文件系统不支持它用到的某些socket操作,就触发了报错。
下面是几个可行的解决办法:
改用rsync同步文件夹(推荐)
rsync是把本地文件直接复制到虚拟机内部,而非实时挂载,完全规避了文件系统兼容性问题。你只需要修改Vagrantfile,把默认的共享文件夹配置改成:config.vm.synced_folder "./", "/vagrant", type: "rsync", rsync__auto: true其中
rsync__auto: true会自动同步本地文件的变更到虚拟机里。修改后执行vagrant reload重启虚拟机,再进入虚拟机重新执行npm命令就正常了。尝试NFS共享文件夹
如果需要实时双向同步(本地改了虚拟机立刻生效,反之亦然),可以用NFS类型的共享。修改Vagrantfile:config.vm.synced_folder "./", "/vagrant", type: "nfs"注意NFS在Linux/macOS主机上比较好配置,Windows主机可能需要额外安装NFS服务端,步骤会麻烦一些。执行
vagrant reload时可能需要输入主机的管理员密码来配置NFS。临时降级Node.js版本
如果暂时不想改Vagrant配置,可以先把Node.js降级到18.17.x版本(比如用nvm:nvm install 18.17.1 && nvm use 18.17.1),这个版本还没引入导致兼容性问题的文件IO变更,能暂时解决问题,等Vagrant或VirtualBox更新后再升级。清理缓存后重试(治标不治本)
你可以先尝试删除虚拟机里项目目录下的node_modules和package-lock.json,然后重新执行npm install,不过这个方法大概率只能临时缓解,后续操作可能还会触发同样的错误,因为核心的挂载问题没解决。
备注:内容来源于stack exchange,提问作者BadIdeaException

