Javascript应用程序作为具有外部依赖关系的AMD模块

Javascript app as an AMD module with external dependencies

本文关键字:关系 依赖 AMD 模块 外部 应用程序 Javascript      更新时间:2024-04-09

我正在编写一个Javascript应用程序,该应用程序应该托管在各个站点上。应用程序本身使用jQuery和jQuery UI。我知道jQuery.noConflict(true)的诀窍,目前正在使用它,以免污染全球空间。我的目标是始终保持jQuery及其任何插件在我的应用程序本地,以免与托管网站上的任何内容发生冲突。托管网站应该可以加载自己的jQuery(可能是不同的版本)并添加一些插件。

现在,我想把这个应用程序构造成一个AMD模块。我可以从托管网站要求使用AMD加载程序(require.js,curl等),但我不想要求任何特定的加载程序-只需要符合AMD API的任何程序(是的,我知道它还没有100%准备好)。

这有可能吗?我能以一种可互操作的方式做到这一点吗?这样托管站点就可以使用例如requirejs、curl或Dojo AMD加载器?

例如:

define(['jquery'], function($) {
    var myLocaljQuery = $.noConflict(true);
    ... my app module implementation here ...
});

如何指定应用程序要使用的jQuery的路径?据我所知,我不能做这样的事情:

require.config({
    paths: {
       'jquery' : 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min'
    }
});
define(['require'], function(require) {
    require(['jquery'], function($) {
        var myLocaljQuery = $.noConflict(true);
        ... my app module implementation here ...
    });
});

因为第一个CCD_ 2是全局对象。

经过进一步的研究,我认为目前还不可行。至少有一点——模块ID在AMD上下文中是全局的,所以我不能简单地在我的应用程序中使用"jquery"或"jquery ui"模块ID,并确保当有人托管我的应用软件并希望通过AMD使用jquery(可能是其他版本)时不会有任何冲突。参见此处的示例:

curl.js不防止与第三方脚本发生冲突,这些脚本可能会将其他版本的jQuery加载为AMD模块。

据我所知,AMD的目标是在你自己的应用程序中模块化东西。它不太支持与第三方应用程序集成,至少当你想进行一些封装以避免冲突时是不支持的。