我正在兜圈子,试图理解 RequireJS 以及如何使用它来加载当我尝试在模块中使用它们时不显示为未定义的依赖项。
我从 John Papa 的 Pluralsight“带有 HTML5 的 SPA”课程开始。我从来不明白的是,为什么需要在脚本标签中指定每个库,而我认为 AMD 在 requireJS 中的全部意义在于您将责任移交给它及其 data-main 属性以异步加载需要什么。该课程中提出的解决方案令人倍感困惑的是,它没有遵循 RequireJS 文档中记录的整个数据主设置。
再过几个月,我们现在有了带有 Durandal 的“热毛巾”模板、一个示例“服务”模块、一个遵循 RequireJS 文档的设置和一个相当容易理解的入门应用程序。唯一能敲响警钟的是,大多数库都位于通常的“脚本”文件夹中,而 Durandal 与应用程序逻辑一起位于完全独立的“应用程序”文件夹中。如果我从pluralsight SPA 课程中学到一件事并使用requireJS,那就是将东西从单个文件夹中移出,事情很快就会变得非常混乱。
无论如何,新模板工作正常。模块依赖关系很好,视图和视图模型是绑定的,并且有一个示例记录器模块,其模块依赖于 Durandal 模块(即在应用程序文件夹中),效果很好。根据 Hot Towel 模板中的代码添加另一个使用 jQuery 和 mockJson 的简单模块应该很简单,对吧?呃,不,不是真的。
这是一个非常简单的声明,用于在“app/services”文件夹中启动我的模块“dataservice.js”
define(['jquery'],
function ($) {
var init - function....
当我尝试在我的代码块中访问它时,我当然会为 $ 得到“未定义”。因此,在阅读了太多令人困惑的文献之后(其中大部分最终都以评论说“这在 jquery xxxx 中发生了变化,因此不再相关”),我有以下问题:
当我监控网络流量时,我可以看到 jQuery 库正在正确下载,如果我将其添加到 BundleConfig.cs 中定义的“供应商”捆绑包中,mockJSON 也是如此,所以 jQuery 在那里并在我的浏览器中等待,即使我没有我自己没有给它一个模块定义。要摆脱模块文档中的“未定义”引用似乎意味着我需要添加如下内容:
require.config({ paths: { 'text': 'durandal/amd/text', jquery: '../Scripts/jquery-1.9.1' } });
(“文本”声明已经存在。我刚刚添加了 jquery 别名)这导致我的模块有一个函数而不是“未定义”,它解决了部分问题,除了它导致我已经复制的脚本的第二个副本由于 Hot Towell 模板“供应商”捆绑包而下载。出于明显的原因,我不想下载两份 jQuery,那么我该如何解决这个问题?
我已将 mockJSON 库添加到我的“供应商”捆绑包中,这通常使用 $.mockJSON 来引用,我无法做任何事情来使其有效。即使我使用与 jquery 相同的过程对脚本的引用进行了破解,我使用 'require.config({paths:' 声明我得到了未定义,更不用说已经提到的'库被下载了两次'的问题. 如何获得定义的库依赖项,以便在模块中使用该库?
我猜所有这些痛苦都与 requireJS 是关于下载异步模块的事实有关,但 jQuery 和 mockjson 是同步的,所以我必须通过其他方式下载它们(捆绑硬编码参考)但这仍然意味着我的 requireJS模块需要一种将它们声明为依赖项的方法,而我尝试过的任何方法都不起作用。我关于这是一个同步/异步问题的假设是否正确?我曾希望在 Durandal 中找到至少一个使用 jQuery 的示例应用程序,最好是一个 jquery 插件,但我只能看到使用 Durandal 模块而不是其他任何东西的模块代码。所有这些库都在 requireJS 的主根之外的事实可能会加剧问题,因为我不得不求助于其中包含“../”字符串的路径来获取引用。
我知道 requireJS 在定义命令上使用“约定优于配置”,因此如果我错过了模块 ID,那么它会根据模块源文件名和使用 data-main 指定的已定义根文件夹的路径假定一个 ID。然而,Durandal 在其代码中引用了一个名为“入口”的模块。这个模块不在根文件夹中,而是在一个名为“Durandal/transitions/entrance.js”的文件夹中,所以我很困惑为什么对它的任何引用都是“入口”而不是“Durandal/transitions/entrance”。它在哪里被别名?
最后(hoorah)我还没有掌握将依赖项指定为定义语句的第一个参数(字符串数组)与省略这些依赖项之间的细微差别,但是在模块工厂中,它成为第一个参数,指定类似 var system = require('../system') - 为什么我会优先使用一种形式而不是另一种形式。我看到这两种类型在示例应用程序中混合在一起,但不明白为什么。
PS:当我编辑此条目时,我看到编号为 1 到 5 的五个问题。当我查看它时,我看到它被渲染为 1,然后是 1 到 4。一些奇怪的 HTML 编辑器与渲染错误,无论我尝试什么格式,我都没有'无法修复,所以请发表任何评论,就好像有五个问题编号为 1 到 5 而不是 2 个编号为 1 和三个编号为 2 到 4!)