JS扩展无需解析的RequireJS路径

时间:2014-07-19 15:03:23

标签: requirejs js-amd wijmo

我正在使用一个库(非常自私,恕我直言)假设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)对您自己的AMD使用硬编码的RequireJS路径引用,如下所示:

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 + paths"找到它的规则。如果模块ID具有以下特征之一,则ID将不会通过" baseUrl + paths"配置,只是被视为相对于文档的常规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假设发表了什么?

1 个答案:

答案 0 :(得分: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() { /* ... */ });

第二种方法是初始配置RequireJS baseUrl以加载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() {
        /* ... */
    });
});