gpt4 book ai didi

javascript - angularjs和requirejs中 "Q"和 "q"的区别

转载 作者:行者123 更新时间:2023-11-29 22:10:29 29 4
gpt4 key购买 nike

我正在创建一个基于 AngularJS、Breeze 和 RequireJS 的单页应用程序。在使用 requirejs 设置 AMD 以使用 Angular 和 Breeze 时,我遇到了 Breeze 对“q”的依赖性问题。如果“q”的配置规则是小写,即使“shim”中没有显式导出,Breeze 也会给出此错误:

Uncaught Error: Unable to initialize Q. See https://github.com/kriskowal/q
"http://localhost:1498/Scripts/shared/breeze.js"breeze.js:1`

当 require config 将所有引用从“q”更改为“Q”时(即使没有导出),代码也能正常工作。有谁知道为什么会这样?

这是工作需要的配置:

require.config({
baseUrl: '../Scripts',
paths: {
angular: 'shared/angular',
bootstrap: 'shared/ui-bootstrap',
dropdowns: 'app/directives/dropdowns',
employeeApp: 'app/modules/employeeModule',
controllers: 'app/controllers',
dates: 'app/directives/dates',
jquery: 'shared/jquery',
Q: 'shared/q',
breeze: 'shared/breeze',
config: 'app/services/config',
model: 'app/services/model',
dataservice: 'app/services/dataservice',
expenseInfo: 'app/services/expenseInfo'
},
shim: {
'angular': { 'exports': 'angular' },
'bootstrap': { deps: ['angular'] },
//'q': { 'exports': 'q' },
'breeze': { deps: ['Q', 'jquery'], 'exports': 'breeze' }
},
priority: [ 'angular', 'bootstrap', 'dropdowns', 'jquery',
'Q', 'breeze', 'employeeSearch', 'dates' ]
});

最佳答案

技术原因是 Breeze 明确寻找“Q”。要找到所有的 Breeze ,需要在源代码中搜索“requireLib”(不是整个单词)。

Breeze 总是首先寻找全局变量,因为 q 的全局变量是 'Q',这就是 breeze 搜索的内容

更多背景:(是的,我最近一直在经历一些 Breeze + RequireJS 的痛苦)

幸运的是,您只需更改 require 路径即可。然而,对于 knockout + Durandal 这不起作用。 Breeze 需要'ko',但Durandal 需要'knockout'。解决方法是使用 RequireJS 映射:

map: {
//knockout used by Durandal, ko used by breeze --> anytime ko is requested, substitute knockout
'*': { 'ko': 'knockout' }
}

Breeze 的 RequireJS 依赖项确实存在一些问题,因为它没有预定义其依赖项(没有在其定义调用中列出的依赖项)。这可能是因为它的一些依赖项是可配置的(你不想要 knockout,但我想要)。这就是为什么您需要 shim 以确保在 Breeze 请求它们之前加载它们。

jQuery 有异常的 AMD 行为。大多数库在运行时都会查找 AMD 库。如果他们找到 AMD 库(例如 RequireJS),他们会将自己加载到其中(例如 define( ... )),并跳过将自己作为全局加载。如果可以(有充分的理由),jQuery 会两者。这意味着 Breeze 总是看到并加载全局 jQuery,因此无需创建从 Breeze 的“jQuery”到 RequireJS 的“jquery”的映射。

顺便说一句,“即使没有导出”也无关紧要。 shim 中的导出属性用于:加载后,使用全局“Breeze ”作为模块值。毫无意义,因为 Breeze 看到 RequireJS,将自身而不是全局加载到其中,并且 shim 忽略了导出。

关于javascript - angularjs和requirejs中 "Q"和 "q"的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18321563/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com