CommonJS、AMD和CMD

CommonJS是用在服务器端的,同步的,如nodejs ;AMD,CMD是用在浏览器端的,AMD是异步模块加载,如requirejs;CMD是通用模块加载,如seajs 。其中,AMD先提出,CMD是根据CommonJS和AMD基础上提出的。

CommonJS

CommonJs 是服务器端模块的规范,Node.js采用了这个规范。根据CommonJS规范,一个单独的文件就是一个模块。加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的exports对象。 例如:foobar.js

/私有变量
var test = 123; 

//公有方法
function foobar () { 

    this.foo = function () {
        // do someing ...
    }
    this.bar = function () {
        //do someing ...
    }
} 

//exports对象上的方法和变量是公有的
var foobar = new foobar();
exports.foobar = foobar; 

使用foobar.js

//require方法默认读取js文件,所以可以省略js后缀
var test = require(‘./boobar‘).foobar;
test.bar();

CommonJS 加载模块是同步的,所以只有加载完成才能执行后面的操作。像Node.js主要用于服务器的编程,加载的模块文件一般都已经存在本地硬盘,所以加载起来比 较快,不用考虑异步加载的方式,所以CommonJS规范比较适用。但如果是浏览器环境,要从服务器加载模块,这是就必须采用异步模式。所以就有了 AMD  CMD 解决方案。

AMD(Asynchromous Module Definition)

AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。AMD异步加载模块。它的模块支持对象 函数 构造器 字符串 JSON等各种类型的模块。

适用AMD规范适用define方法定义模块。如下:

//通过数组引入依赖 ,回调函数通过形参传入依赖
define([‘someModule1‘, ‘someModule2’], function (someModule1, someModule2) { 

    function foo () {
        /// someing
        someModule1.test();
    } 

    return {foo: foo}
}); 

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

define(function (require, exports, module) { 

    var reqModule = require("./someModule");
    requModule.test(); 

    exports.asplode = function () {
        //someing
    }
}); 

CMD

CMD是SeaJS 在推广过程中对模块定义的规范化产出。CMD和AMD的区别有以下几点:

1.对于依赖的模块AMD是提前执行,CMD是延迟执行。不过RequireJS从2.0开始,也改成可以延迟执行(根据写法不同,处理方式不通过)。

2.CMD推崇依赖就近,AMD推崇依赖前置。

//AMD
define([‘./a‘,‘./b‘], function (a, b) { 

    //依赖一开始就写好
    a.test();
    b.test();
}); 
//CMD
define(function (requie, exports, module) { 

    //依赖可以就近书写
    var a = require(‘./a‘);
    a.test(); 

    ...
    //软依赖
    if (status) { 

        var b = requie(‘./b‘);
        b.test();
    }
}); 

虽然 AMD也支持CMD写法,但依赖前置是官方文档的默认模块定义写法。

3.AMD的api默认是一个当多个用,CMD严格的区分推崇职责单一。例如:AMD里require分全局的和局部的。CMD里面没有全局的 require,提供 seajs.use()来实现模块系统的加载启动。CMD里每个API都简单纯粹。

参考其他博主的经验以及部分个人总结,如有侵权,请及时联系本人,QQ:435641688,谢谢

时间: 2024-08-29 15:43:20

CommonJS、AMD和CMD的相关文章

前端模块化(CommonJs,AMD和CMD)

前端模块规范有三种:CommonJs,AMD和CMD. CommonJs用在服务器端,AMD和CMD用在浏览器环境AMD 是 RequireJS 在推广过程中对模块定义的规范化产出.CMD 是 SeaJS 在推广过程中对模块定义的规范化产出.AMD:提前执行(异步加载:依赖先执行)+延迟执行CMD:延迟执行(运行到需加载,根据顺序执行) 模块 函数写法 function f1(){ //... } function f2(){ //... } 模块就是实现特定功能的文件,把几个函数放在一个文件里

前端模块化 CommonJS AMD ES6 CMD

不使用模模块化的情况 util.js(基础函数库) getFormatDate 函数 a-util.js(业务基础函数库) aGetFormatDate 函数 使用getFormatDate a.js aGetFormatDate // util.js function getFormatDate(date, type) { // type === 1 返回 xxxx // type === 2 返回 xxx // ... } // a-util.js function aGetFormatDa

对于模块加载:ES6、CommonJS、AMD、CMD的区别

运行和编译的概念 编译包括编译和链接两步. 编译,把源代码翻译成机器能识别的代码或者某个中间状态的语言. 比如java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.还简单的作一些比如检查有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程. 链接,是把编译生成的二进制文件,组合成为一个系统可以执行的可执行文件. 运行: 把编译出来的可执行文件代码在系统中执行的过程,此时被装载到内存中. (代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的). 运行时类型检查就

浅析JS模块规范:AMD,CMD,CommonJS

随着JS模块化编程的发展,处理模块之间的依赖关系成为了维护的关键. 模块化 AMD,CMD,CommonJS是目前最常用的三种模块化书写规范. CommonJS CommonJS规范是诞生比较早的.NodeJS就采用了CommonJS.是这样加载模块: var clock = require('clock'); clock.start(); 这种写法适合服务端,因为在服务器读取模块都是在本地磁盘,加载速度很快.但是如果在客户端,加载模块的时候有可能出现"假死"状况.比如上面的例子中cl

关于commonjs,AMD,CMD之间的异同

1.简介 随着前端业务复杂度的增加,模块化成为一个大的趋势.而在ES6还未被浏览器所支持的情况下,commonjs作为ES6中标准模块加载方案,在客服端中的支持情况并不好,现在在客服端中有2中模块化的解决方案,CMD和AMD,他们的代表分别为seajs和requirejs.这篇文章主要介绍我对commonjs.AMD以及CMD的理解. 2.commonJS commonjs的目标是制定一个js模块化的标准,它的目标制定一个可以同时在客服端和服务端运行的模块.这些模块拥有自己独立的作用域,也可以向

插件兼容CommonJS, AMD, CMD 和 原生 JS

模块标准 CommonJS CommonJS 有三个全局变量 module.exports 和 require.但是由于 AMD 也有 require 这个全局变量,故不使用这个变量来进行检测. 如果想要对外提供接口的话,可以将接口绑定到 exports (即 module.exports) 上. function MyModule() { // ... } if(typeof module !== `undefined` && typeof exports === `object`) {

前端模块化方案:CommonJS/AMD/CMD/ES6规范

模块化的开发方式可以提高代码复用率,方便进行代码的管理.通常一个文件就是一个模块,有自己的作用域,只向外暴露特定的变量和函数.目前流行的js模块化规范有CommonJS.AMD.CMD以及ES6的模块系统.前端模块化的演进过程可以看看阮一峰老师的文章.本文主要介绍各规范下的模块化实现方式. 一.CommonJS Node.js是commonJS规范的主要实践者,它有四个重要的环境变量为模块化的实现提供支持:module.exports.require.global.实际使用时,用module.e

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

前一篇文章了解了什么是模块,这一篇就简单介绍一下如何定义并加载一个模块. 我所了解的三种模块加载方式分别是CommonJS.AMD和CMD 网上关于这三种模块加载方式讲解的文章很多,我就简单的做个介绍,如果想深入了解一下可以去网上查阅一下相关的资料. (1)CommonJS 在CommonJS中,一个单独的文件就是一个模块.被调用模块内使用exports暴露接口,调用模块使用require调用暴露出来的接口. 示例如下: 1 // student.js 2 // 私有变量 3 var a = 1

commonJS、AMD和CMD之间的区别

JS中的模块规范(CommonJS,AMD,CMD),如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. 现在就看看吧,这些规范到底是啥东西,干嘛的. 一.CommonJS CommonJS就是为JS的表现来制定规范,NodeJS是这种规范的实现,webpack 也是以CommonJS的形式来书写.因为js没有模块的功能所以CommonJS应运而生,它希望js可以在任何地方运行,不只是浏览器中.它的终极目标是提供一个

该如何理解AMD ,CMD,CommonJS规范--javascript模块化加载学习总结

是一篇关于javascript模块化AMD,CMD,CommonJS的学习总结,作为记录也给同样对三种方式有疑问的童鞋们,有不对或者偏差之处,望各位大神指出,不胜感激. 本篇默认读者大概知道require,seajs的用法(AMD,CMD用法),所以没有加入使用语法. 1.为何而生: 这三个规范都是为javascript模块化加载而生的,都是在用到或者预计要用到某些模块时候加载该模块,使得大量的系统巨大的庞杂的代码得以很好的组织和管理.模块化使得我们在使用和管理代码的时候不那么混乱,而且也方便了