dependency-injection - Bower 和 AMD 模块

标签 dependency-injection requirejs amd gruntjs bower

案例

我正在尝试找到建立大型 JavaScript 项目的最方便的解决方案。

要求是:

  1. 模块化 javascript:如有必要,只需全局命名空间中的一个对象
  2. 与 Bower 组件兼容
  3. 与 grunt 兼容:由 grunt 完成构建和部署(contrib-usemincontrib-requirejs)

令我惊讶的是,这并不是一项简单的任务。 我在使用 AMD 时遇到以下问题:

  1. 加载 bower 组件并不总是那么容易完成。例如,如果不修改源代码,就无法使用 AMD 加载 Raphael。使用 Bower 时这确实不是一个选项,因为我只将依赖项列表推送到 git。另外:加载不支持 AMD 的 javascript 库,可以进行填充,但包含多个文件(如 jquery-ui)是有问题的;我需要将其整合在一起。
  2. De requirejs 优化器将所有内容构建到一个文件中,不允许选择将库与站​​点脚本分开。做一些看似理智的事情。

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

  1. 如何控制大型项目中的依赖关系?

可能的解决方案

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

  1. 保持便携,不要将 AMD 强加给 future 的用户
  2. 防止全局命名空间困惑
  3. 与 Bower 保持兼容
  4. 允许usemingrunt中构建整个批处理

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

此外,我将使用命名模块模式而不是使用匿名模块来定义任何模块。尽管这会牺牲最小程度的可移植性。

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

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

你觉得怎么样?我正在做一些理智的事情吗?重新发明轮子?不必要的复杂?

更新

我想我可以使用杏仁 ( https://github.com/jrburke/almond ) 来实现上述目的。

最佳答案

Loading bower components cannot alwasy be done easily. Raphael for example cannot be loaded using AMD without modifying the source

您可以使用 requirejs 中的 shim 配置来加载通常不可加载 AMD 的模块。 (或者拉斐尔真的是一个特例吗?)

De requirejs optimizer builds everything into one file, not allowing the option to seperate libraries from site scripts. Something that seems a sane thing to do.

恕我直言,这不是真的。阅读http://requirejs.org/docs/optimization.html#wholemultipage

关于dependency-injection - Bower 和 AMD 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15774775/

相关文章:

java - Spring 如何知道要使用 @Bean 注入(inject) bean 和方法调用

c# - 模型中的 ASP.NET CORE DI

c# - Ninject - 管理泛型类型的不一致性?

backbone.js - 从控制台访问 requireJS 模块中的主干对象

javascript - RequireJs 定义具有不同路径的模块

javascript - 需要JS,通过CDN加载库失败

c# - 将构造函数参数传递给根对象的依赖项,作为 Ninject 中单个解析的一部分

javascript - requirejs 忽略我的 requirejs.config

coffeescript - Require.JS 和 JS 测试驱动程序 : Unexpected token <

javascript - 重新加载/重新初始化/刷新 CommonJS 模块