问题背景
在Windows 环境下 nvm 的安装与使用篇章中我们学会了如何使用nvm
方便快速的切换node
的版本,但是却发现在写node
脚本的时候,总是会出现:Error: Cannot find module 'xxxxxx'
的报错情况。即使模块已经全局安装过了依旧还是找不到。这是什么原因又该怎么办呢?
问题原因
想要找到原因就需要用到一个非常关键的一个命令:
1 | 打印本地目录前缀 |
如果没有
-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 版本的路径。
至此,我们的问题大致可以确认我们的问题所在:由于使用NVM
对node
进行管理,我们切换了指定的node
版本导致原来的NODE_PATH
环境变量发生了变化,所以导致在全局使用的时候找不到相应的npm
包。
解决办法
既然是因为NODE_PATH
的问题,那么我们重新配置一下NODE_PATH
即可。
配置完成,即可重新打开命令窗口验证问题是否还存在。
可以看到module.paths
中已经包含了C:\Program Files\nodejs\node_modules
目录了。此时再通过require
引用全局npm
包也不再报Error: Cannot find module 'xxxxxx'
的错误了。