【已解决】如何让项目目录外的模块使用本项目的node_modules
比如以下目录结构
root
- out.js
- proj
- node_modules
- lodash
- package.json
- index.js
index.js
require('lodash');
require('../out');
out.js
require('lodash');
在proj文件夹下执行node index
报错,out.js是读取不到proj下的lodash模块的,有没有办法让项目外的模块的require能够读取本项目的node_modules
?
我知道可以在out.js中使用module.paths.push('root/proj/node_modules')
或设置环境变量set NODE_PATH=root\proj\node_modules
来实现功能,有没有通过只修改proj下代码的方式来实现这个功能的方法?
4 回复
开发阶段还是部署阶段?
@waitingsong 是一个electron程序,我想实现一个插件功能,能够添加用户提供的模块,但是像react这样的模块要求全局只能使用同一个react,所以不能让用户模块自己安装react,只能想办法让用户模块使用主程序的react
软连接方式?
@waitingsong 看了node源码后找到了一个合适的解决方案,在Module上做手脚把自己的node_modules
文件夹添加到了nodeModulePaths
列表中
index.js
const Module = require('module');
const path = require('path')
const _nodeModulePaths = Module._nodeModulePaths
Module._nodeModulePaths = function (from) {
const paths = _nodeModulePaths(from)
paths.push(path.resolve(__dirname, 'node_modules'));
return paths;
}
const lodash = require('lodash');
const outLodash = require('../out');
console.log(lodash === outLodash); // true
out.js
module.exports = require('lodash');
或者修改Module._resolveLookupPaths
可以做到让自己的node_modules
搜索优先级高于用户模块的node_modules