angularjs 和 requirejs 中“Q”和“q”的区别

2023-12-07

我正在创建一个基于 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”(即使没有导出)时,代码将起作用。有谁知道为什么会发生这种情况?

这是working需要配置:

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' ]
});

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

Breeze 总是先寻找全局,并且由于 q 的全局是“Q”,所以这就是微风搜索的内容

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

幸运的是,您只需更改所需路径即可。然而,对于击倒+杜兰达尔来说,这是行不通的。微风需要“ko”,但杜兰达尔需要“knockout”。解决方法是使用 RequireJS 地图:

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

angularjs 和 requirejs 中“Q”和“q”的区别 的相关文章

随机推荐