3

我在将 knockout.mapping 插件与 RequireJS 结合使用时遇到了这个问题。基本上,托管我的应用程序的网站正在按此顺序加载 knockout、knockout.mapping 和 requirejs。

<script src="http://127.0.0.1/scripts/require.js" type="text/javascript"></script>
<script src="http://127.0.0.1/scripts/knockout.js" type="text/javascript"></script>
<script src="http://127.0.0.1/scripts/knockout.mapping.js" type="text/javascript"></script>

甚至没有做任何进一步的事情,我得到这个不匹配错误。是否有某种我没有意识到的顺序?

/// 更新 ///

我写了这两个测试:

基本上,您看到的是,如果我在映射插件之前自行将 require.js 加载到我的项目中,那么映射插件将变得不可见。我认为这与映射插件如何使用 require 来要求淘汰有关......但我无法确定它失败的原因。

/// 第二次更新 ///

看来这个场景在这里很重要,所以我将提供更多的背景信息。

想象一个在脚本标签中定义了 knockout.js 和 knockout.mapping.js 的 Web 应用程序。然后第三方小部件加载到页面中,该页面使用 requireJS 来建立它的依赖关系。正是这种加载似乎导致了问题。由于某些库是通过老式的手动方式加载的,而其他库是使用 require 加载的,因此 require 似乎与现有库的上下文相混淆。

如果我从主机应用程序中删除对 require 的引用,那么当我回来查看 ko.mapping 是否存在时会出现错误。这显然是因为该小部件对淘汰赛做了一个要求,这以某种方式破坏了它与映射插件的关系。

我想我需要一个非常熟悉 RequireJS 的人来评论堆叠这些库。显然,当我为匿名消费创建小部件时,我不知道消费者如何或是否使用 requireJS。

/// 第三次更新 /// 尽量澄清问题,也许这会更有意义:

是否有任何明确定义的模式可以将使用 RequireJS 的小部件注入到现有网页中,手动加载资源?这似乎是不可能的,因为 RequireJS 只会双重加载传统页面可能已经加载的任何内容。

4

1 回答 1

3

答案是使用模块加载器加载所有 JavaScript,不要回头。我认真地认为这是唯一的解决方案。在大多数客户端站点还没有达到这一点的世界中,开发一个使用模块加载器的小部件会导致您使用一些老派的心态。

现在,如果我能得到+50分,我对这个问题很生气:)

于 2012-04-13T23:03:33.227 回答