我正在考虑在AMD模块系统中使用条件来指定模块依赖项。例如,在浏览器上加载libraryA,在服务器上加载libraryB。
这可能是这样的:
define([window?"libraryA":"libraryB"],function(library){
//do some stuff
});
这将允许我为2个模块构建一个抽象层。但这真的是个好主意吗?这样做有什么缺点吗?
答案 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
来保持libraryB
和libraryAB
代码分开。
// libraryAB.js dependency module
define(["libraryA", "libraryB"], function (libraryA, libraryB) {
return window ? libraryA : libraryB;
});
//define libraryA.js and libraryB.js as usual
如果您想避免在服务器上执行libraryA
或在客户端上libraryB
执行,您可以让这些模块返回函数并在必要时记住结果。
道德是,最安全的做法是将所有非标准代码保存在模块定义中,使依赖列表保持良好且可预测。