在AMD模块中使用条件依赖是一个好主意吗?

时间:2012-11-08 11:06:52

标签: javascript module js-amd

我正在考虑在AMD模块系统中使用条件来指定模块依赖项。例如,在浏览器上加载libraryA,在服务器上加载libraryB。

这可能是这样的:

define([window?"libraryA":"libraryB"],function(library){
    //do some stuff
});

这将允许我为2个模块构建一个抽象层。但这真的是个好主意吗?这样做有什么缺点吗?

1 个答案:

答案 0 :(得分:4)

That approach could cause problems for the build tool.

更新

经过进一步研究后,我发现config settings in your main JS file are not read by default by the optimizer.因此,更清晰的解决方案是为客户端和服务器使用不同的map config

原始

更安全的方法可能是定义一个适应环境的模块,从而将所有条件代码保留在模块定义中,并使所有依赖列表保持最可靠的格式。

// dependent module
define(["libraryAB"], function (library) {
    //do some stuff
});


// libraryAB.js dependency module
define([], function () {

    return window ?
        defineLibraryA() :
        defineLibraryB();

});

您也可以通过这种方式定义libraryA来保持libraryBlibraryAB代码分开。

// libraryAB.js dependency module
define(["libraryA", "libraryB"], function (libraryA, libraryB) {

    return window ? libraryA : libraryB;

});

//define libraryA.js and libraryB.js as usual

如果您想避免在服务器上执行libraryA或在客户端上libraryB执行,您可以让这些模块返回函数并在必要时记住结果。

道德是,最安全的做法是将所有非标准代码保存在模块定义中,使依赖列表保持良好且可预测。