Node:找不到全局安装的模块

常见问题

Posted by 何浪 on 2022-04-05

问题背景

Windows 环境下 nvm 的安装与使用篇章中我们学会了如何使用nvm方便快速的切换node的版本,但是却发现在写node脚本的时候,总是会出现:Error: Cannot find module 'xxxxxx'的报错情况。即使模块已经全局安装过了依旧还是找不到。这是什么原因又该怎么办呢?

问题原因

想要找到原因就需要用到一个非常关键的一个命令:

1
2
# 打印本地目录前缀
npm prefix [-g]

如果没有-g参数,返回的是包含package.json文件或node_modules目录的最近的父目录。如果既没有package.json也没有node_modules那么就返回当前文件所在的目录。

如果带有-g参数,它就是全局目录前缀。

对于我们当前遇到的问题就可以使用带-g的命令先找到我们的npm包全局到底是安装在了哪里。如上图所示,我当前机器上面的全局npm包是安装在C:\Program Files\nodejs下面。

知道在哪里安装着,下面就看看当前可查找的包都有哪些,可以通过node环境下执行module.paths查看是否包含该目录:

从上图可以看出,当前module.paths的目录虽然包含有C:\\Program Files\\nodejs\\lib\\node,但是不包含C:\Program Files\nodejs\node_modules。所以找不到相应的全局包是正常现象。那么,为什么会出现这种情况呢?

我们通过文件管理器打开这个目录看看是什么情况。

可以看到这里的nodejs目录是一个快捷方式。打开文件属性查看,其真实目标为nvm下面对应的 node 版本的路径。

至此,我们的问题大致可以确认我们的问题所在:由于使用NVMnode进行管理,我们切换了指定的node版本导致原来的NODE_PATH环境变量发生了变化,所以导致在全局使用的时候找不到相应的npm包。

解决办法

既然是因为NODE_PATH的问题,那么我们重新配置一下NODE_PATH即可。

配置完成,即可重新打开命令窗口验证问题是否还存在。

可以看到module.paths中已经包含了C:\Program Files\nodejs\node_modules目录了。此时再通过require引用全局npm包也不再报Error: Cannot find module 'xxxxxx'的错误了。