如何将 webpack 指向特定的 node_modules 文件夹

How to point webpack to a specific node_modules folder

我正在尝试构建一个 grpc 网络客户端,我需要打包代码来解析 require 语句。

我已将 protos 编译为 js,如果我将它们放在我安装 node modules.

的当前文件夹中,它就可以工作

问题是如果我在其他地方有 compiled proto 并且我从那里需要它们,webpack 会在那个路径中寻找 node modules

来自我的 client.js

工作版本:

const {StopRequest, StopReply} = require('./work_pb.js');

有问题的版本:

const {StopRequest, StopReply} = require('../../../messages/proto/output/work_pb.js');

在最后一个例子中,它在 ../../../messages/proto/output/ 中查找 node modulesnode modules 安装在我的 client.js 所在的当前路径以及我 运行 npx webpack client.js.

的位置
ERROR in /home/xxx/yyy/zzz/messages/proto/output/work_pb.js
Module not found: Error: Can't resolve 'google-protobuf' in '/home/xxx/yyy/zzz/messages/proto/output'
 @ /home/xxx/yyy/zzz/messages/proto/output/work_pb.js 11:11-37
 @ ./client.js

如何告诉 webpack 在当前路径中查找节点模块而不是在已编译原型的路径中?

可以指定resolve.modules自定义目录,Webpack在该目录下搜索绝对导入路径的模块:

// inside webpack.config.js
const path = require('path');
module.exports = {
  //...
  resolve: {
    modules: [path.resolve(__dirname, 'node_modules'), 'node_modules']
  }
};

这将使项目根目录(webpack 配置所在的位置)内的 node_modules 优先于默认设置 "node_modules",后者通过 node module resolution 算法解析路径。

更多信息:Webpack docs: Module Resolution