JavaScript模块化思想之CommonJS、AMD、CMD、UMD

前一篇文章了解了什么是模块,这一篇就简单介绍一下如何定义并加载一个模块。

我所了解的三种模块加载方式分别是CommonJS、AMD和CMD
网上关于这三种模块加载方式讲解的文章很多,我就简单的做个介绍,如果想深入了解一下可以去网上查阅一下相关的资料。

(1)CommonJS
在CommonJS中,一个单独的文件就是一个模块。被调用模块内使用exports暴露接口,调用模块使用require调用暴露出来的接口。
示例如下:
复制代码
1 // student.js
2 // 私有变量
3 var a = 123;
4 function add(student) {
5     console.log('Add student:' + student);
6 }
7 // exports对象上的方法和变量是外部可访问的
8 exports.add = add;
复制代码
1 // 使用require加载student.js模块
2 var student = require('./student.js');

CommonJS加载模块是“同步”的,也就是说,如果我们要调用被调用模块中的公共方法和变量,一定要等被调用模块加载完毕后才可以。用于服务端的NodeJS就采用的CommonJS来管理模块。但是在浏览器端,同步加载会因为收到网络环境的影响存在很大的不确定性,所以CommonJS不适合于浏览器端。


 

如果在浏览器环境下想要从服务器加载模块,就必须使用“异步”的方式。所以就出现了AMD和CMD解决方案。


(2)AMD(Asynchromous Module Definition)
requireJS就是一种使用AMD异步加载模块的管理插件。AMD模块支持对象,函数,构造器,字符串,JSON等各种类型的模块。
 
AMD规范使用define方法定义模块:
复制代码
 1 //define(param1,param2) 通过define方法定义模块
 2 //@param1: 数组,元素为引入的依赖模块
 3 //@param2: 回调函数,通过形参传入依赖
 4 define(['firstModule','secondModule'],function(firstModule,secondModule){
 5      function foo(){
 6            firstModule.test();
 7      }
 8      // 暴露foo()
 9      return {foo:foo};
10 });
复制代码

同时,AMD允许使用define方法定义模块是兼容CommonJS规范,可以使用require和exports。

复制代码
1 define(function(require,exports,module){
2      var reqModule = require("./firstModule");
3      reqModule.test();
4 
5      exports.pubPort = function(){
6             // 函数体
7      }
8 });
复制代码

 

(3)CMD
CMD和AMD的区别主要体现在对依赖模块的执行时机上,AMD是“依赖前置”。主张提前加载所需模块,CMD是“依赖就近”。也就是可以用到的时候再加载。有点类似于Java中的“饿汉模式”和“懒汉模式”。
从requireJS 2.0开始,也可以延迟加载了。
举个栗子:
复制代码
 1 // AMD——依赖前置
 2 define(['./a','./b'],function(a,b){
 3     //提前声明要依赖的模块
 4 });
 5 
 6 // CMD
 7 define(function(require,exports,module){
 8     //依赖可以就近写
 9     var a = require('./a');
10     a.test();
11 
12     //软依赖
13     if(status){
14         var b = require('./b');
15         b.test();
16     }
17 });
复制代码
这里有个名词叫软依赖,我个人理解软依赖就是不一定依赖,硬依赖就是一定会依赖的模块,软依赖就是需要才依赖,不需要就不依赖,根据status判断。

 


 

(4)UMD
UMD——Universal Module Definition,通用的模块定义
UMD等于CommonJS加上AMD。UMD的工作其实就是做了一个判断:
    - 先判断当前环境对NodeJs支持的模块是否存在,存在就用Node.js模块模式(exports)。
    - 如果不支持,就判断是否支持AMD(define),存在就使用AMD方式加载。
 

转载于:https://www.cnblogs.com/gopark/p/10701855.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值