AMD:javascript环境中的目的是什么?

时间:2012-04-15 07:40:14

标签: javascript javascript-framework js-amd

关于AMD(异步模块定义)我读了这样的阶段:

  

AMD格式来自于想要比模板格式更好的模块格式   今天"写了一堆带有隐式依赖关系的脚本标签   你必须手动订购"还有一些易于使用的东西   直接在浏览器中。

javascript环境中的目的是什么?你能举个例子吗? pro et contro of using AMD?

2 个答案:

答案 0 :(得分:7)

在JavaScript获得本机模块系统之前很久,将脚本放到页面上的唯一方法是<script>个元素。它们按照它们在HTML上出现的顺序依次执行。这意味着如果你的脚本依赖于jQuery,那么jQuery的<script>必须在你的脚本<script>之前。否则,它会爆炸。

将应用程序逻辑拆分为多个文件并不罕见,特别是随着应用程序的增长。但是使用这种手动排序脚本的系统很快就成了一场噩梦。您的脚本具有隐式依赖关系,其管理在其他位置定义。这就是AMD的用武之地。

AMD是一个模块规范,RequireJS是这种系统的一个实现。简单地说,它是代码的包装器1)保持脚本在调用之前保持惰性,2)允许脚本显式定义其依赖项,3)允许模块系统确定哪些依赖项以什么顺序执行。

这是一个粗略的例子:

// your-app.js
define(['jquery', 'underscore'], function($, _){
  // Your script sits in this "wrapper" function.
  // RequireJS now knows app.js needs jquery and underscore.
  // It loads and executes them first before your script.
})

// jquery.js
define('jquery', [], function(){
  // jQuery stuff
  return jQuery
})

// underscore.js
define('underscore', [], function(){
  // underscore stuff
  return underscore
})

// Then on your HTML, load up your app.
<script data-main="path/to/app.js" src="path/to/require.js"></script>

答案 1 :(得分:5)

Javascript库相互依赖,要求按特定顺序加载它们是很常见的。例如,包含jQuery库的脚本标记必须位于包含jQuery UI库的脚本标记之前。

如果库使用AMD,则可以按任何顺序包含它们。 AMD库将以正确的顺序初始化库,因为您指定哪个库依赖于哪个库。

(有点讽刺的是,包含AMD库的脚本标签当然必须在包含任何使用AMD的库的代码之前......)