我在将 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 只会双重加载传统页面可能已经加载的任何内容。