0

我正在使用一个库(非常自私,恕我直言)假设 baseUrl 将指向公​​司的 CDN:

baseUrl: "[http protocol slash slash]cdn.wijmo.com/amd-js/"

起初我以为我只需将上述 Url 的内容复制到我自己的文件夹(例如 /scripts/wijmo/amd-js),但这不起作用,因为 Wijmo 的好人在他们的 AMD 中硬编码路径引用定义语句,例如:

define(["./wijmo.widget"], function () { ... });

上面的意思(如果我理解正确的话)是如果您有任何其他非 Wijmo AMD 模块,那么您必须:

(a) 将它们放在 amd-js 路径下,可能在名为“myScripts”的子文件夹中 (b) 使用硬编码的 RequireJS 路径引用到您自己的 AMD,如下所示:

paths: {
  "myAMD_1": "http://www.example.com/scripts/myScripts/myAMD_1",
  "myAMD_2": "/scripts/myScripts/myAMD_2.js"
}

(a) 有效,但这意味着 baseUrl 无法指向 Wijmo CDN,因为我无权访问 Wijmo CDN 站点,因此我必须将在 amd-js 下发布的文件移动到我自己的服务器上。

(b) 某种工作,这是我的问题:如果我使用语法 myAMD_1 那么一切都很好。但这并不能让我在使用 localhost 的本地开发机器上进行测试。(我不想检测我正在运行的服务器并自定义路径值......我希望路径在发布到我的 http 服务器之前和之后保持不变。)

现在,根据 RequireJS 文档:

有时您确实想直接引用脚本,但不符合查找它的“baseUrl + 路径”规则。如果模块 ID 具有以下特征之一,则该 ID 将不会通过“baseUrl + 路径”配置传递,而只会被视为相对于文档的常规 URL: * 以“.js”结尾。* 以“/”开头。* 包含 URL 协议,如“http:”或“https:”。

当我尝试使用 .js 结束(终止)我的路径引用时(如上面的 AMD_2 所示),RequireJS 找不到我的 AMD,因为它最终会寻找 myAMD_2.js.js(注意两个 .js 后缀)。所以看起来 RequireJS 不再尊重文档所说的它用作路径解析算法的内容。由于 .js 后缀无法正常工作,我无法轻松修复对我自己的 AMD 的引用,因为我不确定它们将发布到什么服务器名称或物理路径结构——我真的想使用相对路径.

最后,我不想更改 Wijmo 的 AMD 模块,不仅因为它们有几十个,而且因为每次他们发布 Wijmo 更新时我都需要重新应用我的自定义。

因此,如果我的 baseUrl 必须指向硬编码的 Wijmo 路径,那么我如何使用自己的 AMD,而不将它们放在 Wijmo 路径下的子文件夹中,并且不对我自己的 AMD 的发布位置做出任何固定路径或 Url 假设?

4

1 回答 1

1

我可以在这里提出几种考虑的方法——它们都有一些缺点,但都可以。

第一种方法是为每个需要加载的 Wijmo 模块提供路径。这会起作用,但是您在问题描述中已经触及了这种方法的明显缺点:Wijmo 有许多需要引用的模块,并且在将来的更新中维护模块列表可能会有问题。

如果你能忍受这些缺点,下面是 RequireJS 配置的样子:

require.config({
    paths: {
        'wijmo.wijgrid': 'http://cdn.wijmo.com/amd-js/wijmo.wijgrid',
        'wijmo.widget': 'http://cdn.wijmo.com/amd-js/wijmo.widget',
        'wijmo.wijutil': 'http://cdn.wijmo.com/amd-js/wijmo.wijutil',
        // ... List all relevant Wijmo modules here
    }
});

require(['wijmo.wijgrid'], function() { /* ... */ });

第二种方法是初始配置 RequireJSbaseUrl以加载 Wijmo 模块。然后,一旦加载了 Wijmo 模块,重新配置 RequireJS 以能够加载您的本地应用程序模块。这种方法的缺点是所有的 Wijmo 模块都需要预先加载,因此您无法在自己的模块中按需调用 Wijmo 模块。这个缺点需要与第一种方法中列出所有 Wijmo 模块的显式路径的讨厌相平衡。

例如:

require.config({
    baseUrl: 'http://cdn.wijmo.com/amd-js',
    paths: {
        // ... List minimal modules such as Jquery and Globalize as per Wijmo documentation
    }
});

require(['wijmo.wijgrid'], function() { 
    require.config({
        baseUrl: '.'
    });

    require(['main'], function() {
        /* ... */
    });
});
于 2014-07-21T12:27:49.987 回答