首页 文章

Bower&amd模块

提问于
浏览
3

案件

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

要求是:

  • 模块化javascript:如有必要,只需要全局命名空间中的一个对象

  • 与凉亭组件兼容

  • 与grunt兼容:由grunt完成构建和部署( contrib-usemincontrib-requirejs

令我惊讶的是,事实证明这是一项非常重要的任务 . 使用AMD时遇到以下问题:

  • 装载凉亭组件不能轻易完成 . 例如,Raphael无法在不修改源的情况下使用AMD加载 . 使用bower时,这真的不是一个选项,因为我只将依赖列表推送到git . 另外:加载不支持AMD的javascript库,可以是shimmed,但是由多个文件组成(如jquery-ui)是有问题的;我需要一起破解它 .

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

当我不使用AMD时,我会遇到其他问题:

  • 如何控制大型项目中的依赖项?

可能的解决方案

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

  • 保持便携性,不要强迫未来用户使用AMD

  • 防止全局命名空间混乱

  • 与凉亭保持兼容

  • 允许 usemingrunt 中构建整个批次

它将由一个定义 require( <deps>, <factory> ) 的小脚本和一个实现基本模块定义和注入的`define(,,)函数组成 . 它不会实现任何 asynchronous loading 或具有不匹配依赖关系的脚本排队!

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

现在我可以使用 requirejs 或那个小 dependency injector 与手动 <script src=""></script> 加载 . 当使用后一个选项时,我仍然需要使用以下内容注册加载的非amd库:

define( 'raphael', [], function() { return Raphael; })

你怎么看?我做得很清醒吗?重新发明轮子?不必要的复杂?

更新

我想我可以用 almondhttps://github.com/jrburke/almond)来填补上述目的 .

1 回答

  • 0

    装载凉亭组件不能轻易完成 . 例如,Raphael无法在不修改源的情况下使用AMD加载

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

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

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

相关问题