【问题标题】:Is it a good idea to use conditional dependencies in AMD modules?在 AMD 模块中使用条件依赖是个好主意吗?
【发布时间】:2012-11-08 11:06:51
【问题描述】:

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

这可能看起来像这样:

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

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

【问题讨论】:

    标签: javascript module js-amd


    【解决方案1】:

    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();
    
    });
    

    您也可以通过这种方式定义libraryAB,将libraryAlibraryB 代码分开。

    // libraryAB.js dependency module
    define(["libraryA", "libraryB"], function (libraryA, libraryB) {
    
        return window ? libraryA : libraryB;
    
    });
    
    //define libraryA.js and libraryB.js as usual
    

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

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

    【讨论】:

    • 这里的问题是,客户端可以看到服务器代码,这是 A) 不必要的和 B) 危险的。但你是对的。如果我想在一个文件中构建整个东西,代码首先在服务器上运行,这意味着错误的代码被放在一起......有什么想法吗?
    • 经过进一步研究,我发现config settings in your main JS file are not read by default by the optimizer。因此,更简洁的解决方案是为客户端和服务器使用不同的map config
    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多