BreezeJS和RequireJS没有按预期工作

时间:2012-12-18 16:41:15

标签: javascript knockout.js requirejs amd breeze

我正在将breezeJS集成到已经使用knockoutJS的现有requireJS项目中。我遇到了几个问题。

第一个是breeze无法加载Q库,除非我将它作为<script>标记包含在我的html包装器中,而不是作为加载的AMD依赖项。在我的项目中,我试图将代码保留为单个脚本标记,因此这不是理想的。

第二个问题是breezeJS无法加载淘汰赛。在我的main.js中,我已经定义了一个淘汰路径:

knockout: '../libs/knockout/knockout-2.2.0',

(我这样做是因为我喜欢确定我没有访问全球ko

然而,当我为我的项目添加微风时,微风无法加载我的淘汰库。查看微风代码,我可以看到它被硬编码加载淘汰库ko

我不想改变我的所有代码,我发现我可以将我的AMD加载的挖空库添加到全局窗口对象window['ko']。但这感觉就像一个小屋。还奇怪地以这种方式添加Q并删除<script>标签不起作用,因为我认为Q在应用程序的生命周期中需要太早,甚至在我污染全局之前 - 我确实嵌套了{{1}在main.js中调用但是从构建过程中隐藏了大部分应用程序文件,所以我放弃了这种方法。

我如何在我的项目中包含Q和knockout和breeze,并且仍然使用单行require()标记,目前我必须将Q作为单独的<script>标记包含并污染全局让微风和淘汰赛很好玩。

我在我的项目中使用了很多其他库,但没有一个难以集成。

非常感谢任何帮助

干杯

GAV株系

编辑:这是我的完整需求配置:

<script>

3 个答案:

答案 0 :(得分:3)

抱歉(假期)延迟解决您的问题。

我理解并感谢您删除除了RequireJS之外的每个脚本标记的目标。根据我的经验,这个目标并不容易实现。

您确实发现了Breeze缺陷。 Breeze内部引用了与应用程序'require'功能不同的'require'功能。它不知道应用程序的'require'功能或其配置。因此,当您省略Q脚本标记时,无论您如何配置应用程序'require',Breeze都找不到Q ...

我们必须解决这个问题。我们会在这里添加评论。

同时,您必须使用'Q'和'KO'的脚本标记,并且必须将这些标记放在RequireJs的脚本标记上方。请继续对您的应用程序脚本使用require。

不幸的是,您还有其他与双重需求功能问题无关的问题。

首先,我认为你总是难以让KO远离全局命名空间......而这与Breeze无关。

在KO的AMD实现中(至少在我上次查看时),KO要么在全局命名空间中,要么在require容器中;从来没有。 不幸的是,许多有用的插件(bindingHandlers,debug.helpers)假设它位于全局命名空间中;如果您使用require 加载KO,则无法使用它们。

您可以在需要之前在脚本标记中加载Knockout,然后在配置期间将KO填充到Require容器中。您的配置可能如下所示:

define('knockout', [], function () { return window.ko; });

jQuery 开发人员意识到这将是一个问题。太多好的插件假设jQuery位于全局命名空间中。而不是纯粹主义者,jQuery维护者(正确地在我看来)将jQuery放在两者全局命名空间中的Require容器中。

其次,许多其他有用的库不支持Require。您的代码可以编写为好像这些脚本是为require设计的。我仍然认为处理这个问题最简单,最清晰的方法是在脚本标记中指定它们。然后,您可以通过使用define调用定义它们将它们添加到容器中,如上所示。通过这种填充,您自己的模块可以在依赖于需要服务位置和依赖注入这些库时保持一致。

第三,我认为您的配置存在错误。出于逃避我的原因,您决定在您的Require宇宙中将Knockout模块称为“ knockout ”。

很好......但是当我们修复它以使用应用程序的require容器时,你不应该指望Breeze预期模块名称。 Breeze将以其标准名称“ko”寻找KnockoutJs。 Breeze不会以您的首选名称“淘汰”找到它。

这不是什么大问题。如果您坚持使用“淘汰”名称,则可以在两个名称下使用相同的实例。我非常确定以下的填充线在添加到配置代码时会起作用:

define('ko', ['knockout'], function (ko) { return ko; });

再次......只有在我们修复了Breeze require bug之后,这才有效。

John Papa必须解决许多类似的问题in Code Camper;你可以看看他在那里做了什么,特别是在main.js

答案 1 :(得分:2)

这应该从Breeze v 1.2.4开始修复。我们不再使用“require”的内部实现。

答案 2 :(得分:0)

听起来你的require配置不对。你可以发布你的require配置代码吗? 我很好奇:

keep my code down to a single script tag

为什么?

编辑:现在我明白了。仍然听起来像需要配置是错误的。