NodeJS构建报错:无法找到ncp模块(macOS环境)
问题回顾
你在macOS High Sierra 10.13.2环境下运行Node.js构建脚本时,遇到了模块找不到的错误,具体栈信息如下:
module.js:472 throw err;
^ Error: Cannot find module 'ncp'
at Function.Module._resolveFilename (module.js:470:15)
at Function.Module._load (module.js:418:25)
at Module.require (module.js:498:17)
at require (internal/module.js:20:19)
at Object.(/Users/Shared/WebServer/Mobile/builds/build.nodejs:28:21)
at Module._compile (module.js:571:32)
at Object.Module._extensions..js (module.js:580:10)
at Module.load (module.js:488:32)
at tryModuleLoad (module.js:447:12)
at Function.Module._load (module.js:439:3)
你的脚本里用了require('ncp'),而且已经做了不少排查:环境变量配置正确、全局装了npm和ncp、调整了文件夹权限、测试过多个Node.js/Cordova版本,但问题依然存在。下面给你几个针对性的解决方案:
尝试这些解决方案
1. 确认全局模块路径并让Node.js识别它
首先,先搞清楚全局模块的安装位置:
npm root -g
正常情况下会输出/usr/local/lib/node_modules。接着检查ncp是不是真的在这个目录里:
ls $(npm root -g)/ncp
如果存在,但Node.js找不到,那可能是全局模块路径没被加入Node的搜索路径。你可以在构建脚本的最开头加上这行代码:
require('module').paths.push('/usr/local/lib/node_modules');
或者临时设置环境变量试试:
export NODE_PATH=/usr/local/lib/node_modules
要是有用的话,把这条export命令加到~/.bash_profile里,以后就不用每次都设置了。
2. 换成本地安装ncp试试
全局安装有时候会因为权限或者路径映射的问题出幺蛾子,不如直接在项目目录里本地安装:
cd /Users/Shared/WebServer/Mobile/builds npm install ncp --save
这样脚本会优先从项目自己的node_modules文件夹里加载ncp,绕开全局路径的问题。
3. 匹配Node.js版本安装对应ncp版本
不同版本的ncp对Node.js的要求不一样,你测试了多个Node版本,但可能没注意ncp的版本兼容性。比如Node.js v4.x的话,建议安装ncp v2.x版本:
npm install ncp@2.0.0 --save
(ncp v3.x及以上可能需要Node.js v6+,你可以根据自己用的Node版本选合适的ncp版本)
4. 修复npm全局权限问题
就算用sudo装了模块,权限还是可能出问题。试试重置npm的全局权限:
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
然后重新安装ncp:
npm install -g ncp
这样以后不用sudo也能装全局模块,避免权限混乱。
5. 清理npm缓存后重装
缓存损坏也可能导致模块识别异常,先清缓存再重装:
npm cache clean --force npm install -g ncp
6. 检查脚本里的大小写
注意到你代码里写的是Require('ncp'),但Node.js的require是小写的!JavaScript是大小写敏感的,虽然有时候某些环境可能兼容,但标准写法是小写的require,建议改成:
const ncp = require('ncp');
说不定就是这个小细节导致的问题。
内容的提问来源于stack exchange,提问作者Selvakumar Maruthamuthu

