3

案子

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

要求是:

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

令我惊讶的是,这被证明是一项不平凡的任务。使用 AMD 时遇到以下问题:

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

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

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

一个可能的解决方案

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

  1. 保持便携,不要将 AMD 强加给未来的用户
  2. 防止全局命名空间混乱
  3. 保持与凉亭兼容
  4. 允许usemin在grunt中构建整个批次

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

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

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

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

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

更新

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

4

1 回答 1

0

加载凉亭组件并不总是容易完成。例如 Raphael 不能在不修改源的情况下使用 AMD 加载

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

De requirejs 优化器将所有内容构建到一个文件中,不允许将库与站点脚本分开。做一些看起来很理智的事情。

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

于 2013-07-18T07:33:08.327 回答