Webpack:使用节点的require.resolve()而不是webpack的

时间:2019-07-29 10:27:03

标签: webpack electron electron-builder

我有一个电子项目,该项目使用ceratin nodejs lib(@ grpc / proto-loader)。 生产版本无法正常工作,因为webpack用自己的函数替换 require.resolve(),该函数返回模块ID而不是路径。如何防止webpack这样做?

我试图将有问题的程序包添加到“外部程序”中,但这似乎不起作用。

我希望应用程序使用节点的require()函数。 我知道可以使用non_webpack_require,但是我不能修改软件包的代码,这是一个第三方库。那有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我写了一篇文章来解决此问题:https://github.com/grpc/grpc-node/issues/969#issuecomment-633271735

更新您的webpack.config.js以使用新的加载器(请先指定):

...
  rules: [
    {
       test: /@grpc\/proto-loader/,
       use: path.resolve('scripts/remove-proto-loader-protos.js'),
    },
...

然后使用以下代码创建文件scripts/remove-proto-loader-protos.js

// https://github.com/grpc/grpc-node/issues/969
module.exports = function (source) {
  if (source.includes(`Load Google's well-known proto files`)) {
    return source.replace(/\/\/ Load Google's well-known proto files.*?\n}/gis, '')
  } else {
    return source
  }
}

就是这样!原始加载代码将自动清除。无需单独的fork并手动对其进行更新。

这当然意味着,如果任何人都需要这些原始文件,则必须手动加载它们。此外,如果Google更新了他们的代码,则将来可能需要更新此黑客。我知道,这是黑客,但是您能做什么? ¯\_(ツ)_/¯