开发者社区> webmirror> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JavaSript模块规范--AMD规范与CMD规范

简介: 有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块;但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则岂不是乱了套;考虑到Javascript模块现在还没有官方规范,这一点就更重要了
+关注继续查看

模块的规范

有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块;但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则岂不是乱了套;考虑到Javascript模块现在还没有官方规范,这一点就更重要了

目前,通行的Javascript模块规范主要有:CommonJS/AMD/CMD;那么让我先从CommonJS讲起

CommonJS

2009年美国程序员Ryan Dahl创造了node.js项目,将javascript语言用于服务器端编程,这标志"Javascript模块化编程"正式诞生;因为老实说,在浏览器环境下,没有模块也不是特别大的问题,毕竟网页程序的复杂性有限;但是在服务器端,一定要有模块,与操作系统和其他应用程序互动,否则根本没法编程

node.js的模块系统就是参照CommonJS规范实现的;在CommonJS中,有一个全局性方法require()用于加载模块;假定有一个数学模块math.js,就可以像下面这样加载

var math = require('math');

然后就可以调用模块提供的方法:

var math = require('math');
math.add(2,3); // 5

我们在这里就需要知道:require()是用于加载模块的

浏览器环境

有了服务器端模块以后,大家就想要客户端模块;而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行;但是,由于一个重大的局限,使得CommonJS规范不适用于浏览器环境;上面的代码如果在浏览器中运行就会有一个很大的问题:第二行math.add(2, 3)在第一行require('math')之后运行,因此必须等math.js加载完成;如果加载时间很长,整个应用就会停在那里等;这对服务器端不是一个问题,因为所有的模块都存放在本地硬盘可以同步加载完成,等待时间就是硬盘的读取时间;但是对于浏览器,这却是一个大问题,因为模块都放在服务器端,等待时间取决于网速的快慢,可能要等很长时间,浏览器处于"假死"状态

因此,浏览器端的模块不能采用"同步加载"(synchronous),只能采用"异步加载"(asynchronous);这就是为什么有了AMD的诞生

AMD

AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义",是在推广require.js时对模块规范化产出;它采用异步方式加载模块,模块的加载不影响它后面语句的运行;所有依赖这个模块的语句都定义在一个回调函数中,等到加载完成之后这个回调函数才会运行;AMD也采用require()语句加载模块,但是不同于CommonJS,它要求两个参数:

require([module], callback);

第一个参数[module]是一个数组,里面的成员就是要加载的模块;第二个参数callback则是加载成功之后的回调函数;如果将前面的代码改写成AMD形式,就是下面这样:

require(['math'],function(math){
  math.add(2,3);
})

math.add()与math模块加载不是同步的,浏览器不会发生假死;所以很显然AMD比较适合浏览器环境

目前主要有两个Javascript库实现了AMD规范:require.js和curl.js

下面来看下require.js具体的用法(具体详细配置以及使用方法请大家查看require.js官方文档):

define(['someModule1','someModule2'],function(someModule1, someModule2){ //通过数组引入依赖,回调函数通过形参传入依赖
  function foo(){
    someModule1.test();
  }
  return {foo:foo}
})

AMD规范允许输出模块兼容CommonJS规范,这时define方法如下:

define(function(require,exports,module,reqModule){
  var reqModule = require('./someModule');
  requModule.test();
  exports.asplode = function(){
    //something
  }
});

因此我们可以得出结论:

1.Amd推崇的是依赖前置

2.Amd对加载的模块是提前读取并加载

CMD代表的sea.js

CMD是指Common Module Definition--异步的模块加载机制,是在推广sea.js时对模块规范化产出

Cmd更像是Amd和Common.js的升级版,结合了两者的优点;Common.js可以做到当需要这个模块时再读取并加载

Amd可以做到避免Common.js的 "临时读取并加载文件",它是提前读取并加载;而Cmd可以做到的是"提前读取文件,但在需要再加载",这样可以避免浏览器临时加载文件的假死,也可以避免提前加载引起的逻辑问题;所以大家叫sea.js懒加载,也就是"as lazy as possible",这也是Cmd的标志

因此我们可以总结出:

1.Cmd推崇的是就近依赖

2.Cmd对加载的模块是提前读取并不加载,而是在需要时加载

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JavaScript模块化
JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解JavaScript模块化
10 0
mac安装pyv8模块-JavaScript翻译成python
mac安装pyv8模块-JavaScript翻译成python
28 0
精通模块化JavaScript
  近日读了一本名为《精通模块化JavaScript》的书,并记录了其中的精髓。
50 0
mac安装pyv8模块-JavaScript翻译成python
mac安装pyv8模块-JavaScript翻译成python
71 0
JavaScript进阶【一】JavaScript模块化开发的基础知识
版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/79249047 //模块化的最初写法 //1.最初写法 //下面的m1和m2就组成了一个模块 //缺点:"污染"了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系。
958 0
Javascript模块化
原文:Javascript模块化 一、原始写法 模块就是实现特定功能的一组方法。 只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块。   function m1(){    //...  }   function m2(){    //...  } 上面的函数m1()和m2(),组成一个模块。
618 0
+关注
webmirror
Good good study, day day up
文章
问答
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载