npm安装模块后require提示Cannot find module问题求助
看起来你已经确认新模块的文件存在于node_modules里,那咱们可以从几个常见的排查方向入手:
核对模块名称的准确性
别小看拼写和大小写!Linux/macOS系统是区分文件名大小写的,如果你require的是Xxxxx但实际安装的模块叫xxxxx,就会报错。另外,有些模块的npm包名可能带组织前缀(比如@scope/xxxxx),别漏了前缀。直接打开新模块文件夹里的package.json,看name字段,确保require的字符串和它完全一致。确认模块是安装在项目本地而非全局
如果你用了npm install -g xxxxx把模块装到全局了,项目里的require是找不到它的。Node.js默认只会从当前脚本所在目录的上级node_modules里找模块,所以一定要在项目根目录(也就是project文件夹下)执行npm install xxxxx,别加-g参数。检查Node.js的模块查找路径
你可以在报错的那个文件里加一行代码,看看Node.js到底在哪些路径里找模块:console.log(module.paths);输出里应该包含你的
project/node_modules路径。如果没有,那可能是你执行脚本的目录不对,或者你的代码文件所在层级有问题——比如代码在client子文件夹里,Node.js会先找client/node_modules,再往上找project/node_modules,如果这中间有路径权限或者符号链接的问题,也会导致找不到。清除缓存并重装依赖
npm缓存偶尔会抽风,试试这一套操作:npm cache clean --force rm -rf node_modules rm package-lock.json npm install把旧的依赖和锁文件都删掉,重新安装所有模块,包括你新安装的那个,大概率能解决一些隐性的缓存问题。
检查模块的入口文件是否有效
打开新模块的package.json,看main字段——这个字段指定了模块被require时的入口文件。如果main指向的文件不存在(比如写的是index.js但实际文件夹里只有lib/index.js),那Node.js也会报找不到模块的错。你可以手动确认一下这个入口文件是否存在,或者直接require模块里的具体文件试试(比如require('xxxxx/lib/index.js')),如果能成功,那就是模块的main字段配置有问题。权限排查(针对Linux/macOS)
如果你的node_modules或者新模块文件夹的权限设置不对,Node.js可能读不到里面的文件。可以用下面的命令把权限改成当前用户所有:sudo chown -R $USER:$USER node_modules
如果上面这些方法都试过还是不行,可以把console.log(module.paths)的输出结果,以及新模块package.json的内容贴出来,这样能更精准地定位问题。
内容的提问来源于stack exchange,提问作者Oscar

