【问题标题】:How to fix dynamic requires in third-party libraries?如何修复第三方库中的动态需求?
【发布时间】:2018-05-05 14:26:38
【问题描述】:

我的桌面应用程序使用 Electron+React 作为接口,Edge.js 将 Node 与我的 C# 应用程序连接起来。

我的问题是:Webpack 无法捆绑我的应用程序,因为 Edge.js 依赖项抛出以下 error

严重依赖:依赖的请求是一个表达式

问题是 Edge.js 有以下动态需求:

var compilerName = 'edge-' + language.toLowerCase();
var compiler = require(compilerName);

大多数时候,compilerName 会被翻译成“edge-cs”,但 Webpack 无法确定这一点。

我该如何解决这个问题?人们建议设置require contextContextReplacementPlugin,但它们通常都适用于你有require('./directory/' + variable) 的情况,而我不知道如何在我有require(variable) 的情况下使用它们。

注意:我需要一个不需要修改我的第三方库代码的解决方案。

【问题讨论】:

  • 使用条件语句有用吗?例如。 if language = x then require x 而不是将变量名传递给 require?
  • 这行不通,因为 webpack 需要将所有可能的需求捆绑到包中,并且当您以编程方式确定需要什么时,它无法在打包时告诉您需要什么。但是,您可以使用 csilk 或 nilesh 建议的内容,因为这会向 webpack 显示所有可能需要的静态字符串。它会使代码更冗长,但这是 webpack 的限制。
  • @jfriend00,但这需要我更改第三方库代码,对吧?
  • @user8983325 - 是的,如果你想将 webpack 与不是按照 webpack 指南设计的代码一起使用。
  • 不确定这是否会有所帮助,但这可能相关吗? github.com/sindresorhus/require-fool-webpack

标签: node.js webpack


【解决方案1】:

我不认为这是可能的,你有没有考虑过像下面这样一个巨大的开关?建议here

switch (name) {
  case 'a': return require('./a');
  case 'b': return require('./b');
  // etc...
}

【讨论】:

  • 我知道这个建议可以解决问题,但我需要修改第三方代码,对吗?这个开关需要在节点模块中实现,对吧?
  • 你会在你的代码中写这个,一种包装器来加载你想要的东西。
  • 对不起,我听不懂。 require(variable) 在 3rd-party 模块模块 (edge.js) 内完成。在我的代码中,我正在做require('electron-edge'),这很好。问题出在模块内部。我应该在哪里放置 switch-case 语句? (感谢您的时间)
猜你喜欢
  • 1970-01-01
  • 2013-11-19
  • 2016-05-10
  • 2016-09-09
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2022-01-20
  • 2021-08-27
相关资源
最近更新 更多