Webpack构建Kurento-Client-JS时的循环引用问题

8
我在使用Webpack 2 + babel构建kurento-client-js时遇到了错误。
WARNING in ./node_modules/kurento-client/lib/register.js
60:20-33 Critical dependency: the request of a dependency is an expression

在执行时,它会产生以下结果:
Uncaught Error: Cannot find module "."

我认为问题本身是由/lib/register.js中的require引起的。

//kurento-clinet/lib/register.js
if (constructor == undefined)
    return register(require(name));

导致错误的代码:

//kurento-clinet/lib/index.js
//this module requires kurento-client resulting in circular reference
register('kurento-client-core') 

kurento bower 包含使用 browserify 构建的分发包。

我想知道是否有人尝试过使用 webpack 构建 kurento-client-js。请分享你的经验。

编辑:

循环依赖错误堆栈跟踪:

Uncaught TypeError: Cannot read property 'MediaObject' of undefined
at Object._typeof (KurentoClient.js:42)
at __webpack_require__ (bootstrap 0d7eac46304670c5f3b5:19)
at Object._typeof (index.js:44)
at __webpack_require__ (bootstrap 0d7eac46304670c5f3b5:19)
at Object.module.exports (HubPort.js:21)
at __webpack_require__ (bootstrap 0d7eac46304670c5f3b5:19)
at Object._typeof (index.js:32)
at ...

听起来值得提交一个错误报告。这应该是他们的责任。完全有可能构建一个漂亮的捆绑包,可以使用Webpack构建并与Node一起工作,但似乎他们已经做了自己复杂的构建过程。 - loganfsmyth
@loganfsmyth,完全同意。自从Kurento团队被Twilio收购后,他们停止了活跃的项目开发。我曾考虑过从头开始重写整个客户端,但在深入研究源代码后决定放弃。现在几乎所有的文件和包都是由某个IDL工具自动生成的,看起来像一团糟。重新组装客户端需要超过一周的时间。当然,这将是很好的,因为许多遗留代码将被消除。然而,到目前为止,我正在寻找一个更简单的解决方案。 - kreig
1个回答

0
首先,webpack 抱怨一个动态依赖项(在构建捆绑包时无法解析)。这不是循环依赖。
我像这样让它工作:
1)在您的应用程序的 main.js 中手动要求所有可能需要 register() 函数的模块
require('kurento-client-core')
require('kurento-client-elements')
require('kurento-client-filters')

const kc = require('kurento-client-core/lib/index.js')

console.log(kc)

2)使用此Webpack插件完全忽略未解决/动态的require()调用

//in webpack.config.js
plugins:[

function() {
  this.parser.plugin('call require', function(expr) {
    if (expr.arguments.length !== 1) {
      return;
    }

    const param = this.evaluateExpression(expr.arguments[0]);
    if (!param.isString() && !param.isConditional()) {
      return true;
    }
  });
}
//... other plugins
]

Webpack2 会警告旧的插件格式,但它确实可以工作

鸣谢: https://dev59.com/fpnga4cB1Zd3GeqPYnCF#42527120


循环引用在kurento-clientkurento-client-core库中都存在。 kurento-client-core需要HubPort,而HubPort需要kurento-client,而kurento-client又需要kurento-client-core。我尝试了您的代码,webpack组装了包,但在浏览器中无法正常工作,在kurento-client-core模块引用的kurento-client模块中的var MediaObject = require('kurento-client-core').abstracts.MediaObject;处失败。 - kreig
我已经在控制台中输出了kurento-client。它确实起作用了。 - Tudor Ilisoi
你代码示例中的 kc 变量是 kurento-client-core 模块的一个实例,而不是 kurento-client。我正在使用 kurento-client v6.6.2。require('kurento-client/lib/index.js') 会抛出一个错误。 - kreig
换句话说,我有一个具备上述设置的工作捆绑包。 - Tudor Ilisoi
非常感谢您抽出时间回答我的问题,但是在我的情况下它并不起作用。也许您正在使用另一个版本的 kurento-client 模块。我已经附加了一个错误到原始问题中以演示循环依赖问题。 - kreig
我明白了。让我试一下,然后再回复你。 - Tudor Ilisoi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接