Node脚本无法找到generator-jhipster模块,求助排查解决方案
我懂你现在遇到的这个头疼问题——明明通过yo命令能正常使用generator-jhipster,但自己写Node脚本调用require.resolve('generator-jhipster')时,却弹出“Cannot find module 'generator-jhipster'”的错误。这事儿多半是模块的安装位置和Node脚本的模块查找路径不匹配导致的,下面给你几个靠谱的解决办法:
方案1:把generator-jhipster安装到本地项目依赖里
你提到已经安装了模块,但大概率是全局安装的,而Node脚本默认会优先查找当前项目的node_modules目录。你可以执行这条命令,把generator-jhipster安装到本地项目的开发依赖中:
npm install generator-jhipster --save-dev
安装完成后再运行你的Node脚本,应该就能正常定位到模块了。
方案2:手动指定全局安装的模块路径
如果你更倾向于用全局安装的generator-jhipster,可以先找到它的全局安装位置。执行这条命令获取全局模块的根路径:
npm root -g
假设输出的路径是/usr/local/lib/node_modules,那你可以直接把注册代码改成指向generator-jhipster的app生成器入口文件:
var yeoman = require('yeoman-environment'); env.register('/usr/local/lib/node_modules/generator-jhipster/generators/app/index.js', 'jhipster:app');
这样就能绕开自动查找的问题,直接指定正确的模块路径。
方案3:调整Node的模块查找路径
你也可以在脚本开头把全局模块路径添加到Node的查找路径里。这里给你两种可行的方式:
第一种是修改require.paths(注意:新版本Node可能不再支持这个属性,不过可以试试):
var yeoman = require('yeoman-environment'); // 把全局模块路径添加进去,替换成你自己的全局路径 require.paths.push('/usr/local/lib/node_modules'); env.register(require.resolve('generator-jhipster'), 'jhipster:app');
第二种是通过NODE_PATH环境变量来设置,这种方式更稳妥:
const path = require('path'); // 拼接全局模块路径,替换成你自己的路径 process.env.NODE_PATH = `${process.env.NODE_PATH || ''}:${path.join(process.env.HOME, '.npm', 'lib', 'node_modules')}`; require('module').Module._initPaths(); var yeoman = require('yeoman-environment'); env.register(require.resolve('generator-jhipster'), 'jhipster:app');
方案4:先排查require.resolve的查找逻辑
你可以在脚本里先打印require.resolve('generator-jhipster')的结果,看看它到底在找哪个路径:
console.log(require.resolve('generator-jhipster'));
如果这条语句直接报错,说明确实是路径匹配的问题,照着前面的方案调整就行。
另外,别忘了检查一下generator-jhipster和Yeoman环境的版本兼容性,版本不匹配也可能导致加载失败哦。
内容的提问来源于stack exchange,提问作者Ildelian

