【发布时间】:2014-11-25 00:31:36
【问题描述】:
我正在尝试在利用 Q 库的网页上运行小部件。不幸的是,该页面还使用嵌入 require.js 的 AddThis 小部件 并导致冲突。具体来说,当同时运行时,控制台会显示以下两条错误消息:
未捕获的 ReferenceError:未定义 Q
未捕获的错误:不匹配的匿名 define() 模块
很遗憾,我无法控制 AddThis 小部件的使用。但是,我确实可以使用 Q 控制嵌入式应用程序。我可以实现一个 JavaScript 模式来命名 Q 库,这样它就不会与 require.js 冲突?
这是一个演示问题的简单示例:
<!doctype html />
<html>
<head>
<script src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.15/require.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/q.js/0.9.2/q.min.js"></script>
</head>
<body>
<script>
var called = function() {
var deferred = Q.defer();
console.log("Q called successfully");
deferred.resolve();
return deferred.promise;
}
Q.fcall(called);
</script>
</body>
</html>
【问题讨论】:
-
一些源代码怎么样? RequireJS 配置?
-
我找到了部分解决方案。通过注释掉 Q 中的 RequireJS else if 块(在 Montage Require 和 CommonJS 下),我可以在 RequireJS 旁边的全局命名空间中运行它而不会出现错误。但是,如果有人通过 RequireJS 加载 Q,这仍然会导致冲突。所以问题仍然存在,是否有一种模式可以将 Q(或任何其他库)包装在已知命名空间中的对象中?
标签: javascript namespaces requirejs shared-libraries q