【已解决】如何让项目目录外的模块使用本项目的node_modules
发布于 3 年前 作者 dislido 4582 次浏览 来自 问答

比如以下目录结构

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

回到顶部