凉亭& amd模块

时间:2013-04-02 21:30:26

标签: dependency-injection requirejs amd gruntjs bower

案例

我正在尝试设置一个大型javascript项目的最方便的解决方案。

要求是:

  1. 模块化javascript:如有必要,只需要全局命名空间中的一个对象
  2. 与凉亭组件兼容
  3. 与grunt兼容:由grunt构建和部署( contrib-usemin contrib-requirejs
  4. 令我惊讶的是,事实证明这是一项非常重要的任务。 使用AMD时,我遇到了以下问题:

    1. 装载凉亭组件不能轻易完成。例如,Raphael无法在不修改源的情况下使用AMD加载。使用bower时,这真的不是一个选项,因为我只将依赖列表推送到git。另外:加载不支持AMD的javascript库,可以是shimmed,但是由多个文件组成(如jquery-ui)是有问题的;我需要一起破解它。
    2. De requirejs优化器将所有内容构建到一个文件中,不允许选项从站点脚本中分离库。这似乎是一件理智的事情。
    3. 当我不使用AMD时,我会遇到其他问题:

      1. 如何控制大型项目中的依赖项?
      2. 可能的解决方案

        所以我正在考虑一个解决方案:

        1. 保持便携性,不要强迫未来用户使用AMD
        2. 防止全局命名空间混乱
        3. 与bower保持兼容
        4. 允许 usemin grunt
        5. 中构建整个批次

          它包含一个定义require( <deps>, <factory> )的小脚本和一个实现基本模块定义和注入的`define(,,)函数。它不会实现任何异步加载或具有不匹配依赖关系的脚本排队!

          此外,我将使用命名模块模式定义任何模块,而不是使用匿名模块。即使这会牺牲最小的便携性。

          现在我可以将 requirejs 或那个微小的依赖注入器与手动<script src=""></script>加载结合使用。当使用后一个选项时,我仍然需要使用以下内容注册加载的非amd库:

          define( 'raphael', [], function() { return Raphael; })
          
          你怎么看?我做得很清醒吗?重新发明轮子?不必要的复杂?

          更新

          我想我可以使用 almond https://github.com/jrburke/almond)来满足上述目的。

1 个答案:

答案 0 :(得分:0)

  

装载凉亭组件不能轻易完成。例如,拉斐尔无法在不修改源

的情况下使用AMD加载

您可以使用requirejs中的shim配置来加载通常不是AMD可加载的模块。 (或raphael是一个非常特殊的案例?)

  

De requirejs优化器将所有内容构建到一个文件中,不允许选项从站点脚本中分离库。这似乎是一件理智的事情。

那不是真正的imho。阅读http://requirejs.org/docs/optimization.html#wholemultipage