Skip to content

AMD&CMD&CommonJS #43

@Leon68

Description

@Leon68

1: 为什么要使用模块化?

模块化可以使你的代码低耦合,功能模块直接不相互影响。模块化主要有以下几点好处:
1.可维护性:根据定义,每个模块都是独立的。良好设计的模块会尽量与外部的代码撇清关系,以便于独立对其进行改进和维护。维护一个独立的模块比起一团凌乱的代码来说要轻松很多。
2.命名空间:在JavaScript中,最高级别的函数外定义的变量都是全局变量(这意味着所有人都可以访问到它们)。也正因如此,当一些无关的代码碰巧使用到同名变量的时候,我们就会遇到“命名空间污染”的问题。
这样的问题在我们开发过程中是要极力避免的。

3.可复用性:现实来讲,在日常工作中我们经常会复制自己之前写过的代码到新项目中。
 参考链接 

2: CMD、AMD、CommonJS 规范分别指什么?有哪些应用 

  • CommonJS
    CommonJS规范是诞生比较早的。NodeJS就采用了CommonJS。是这样加载模块:
var clock = require('clock'); 
clock.start(); 

这种写法适合服务端,因为在服务器读取模块都是在本地磁盘,加载速度很快。但是如果在客户端,加载模块的时候有可能出现“假死”状况。比如上面的例子中clock的调用必须等待clock.js请求成功,加载完毕。那么,能不能异步加载模块呢?

  • AMD
    AMD,即 (Asynchronous Module Definition),这种规范是异步的加载模块,requireJs应用了这一规范。先定义所有依赖,然后在加载完成后的回调函数中执行:
require([module], callback); 

用AMD写上一个模块:

require(['clock'],function(clock){
    clock.start(); 
}); 

AMD虽然实现了异步加载,但是开始就把所有依赖写出来是不符合书写的逻辑顺序的,能不能像commonJS那样用的时候再require,而且还支持异步加载后再执行呢?

  • CMD
    CMD (Common Module Definition), 是seajs推崇的规范,CMD则是依赖就近,用的时候再require。它写起来是这样的:
define(function(require, exports, module) { 
    var clock = require('clock'); 
    clock.start(); 
});

 AMD和CMD最大的区别是对依赖模块的执行时机处理不同,而不是加载的时机或者方式不同,二者皆为异步加载模块。 AMD依赖前置,js可以方便知道依赖模块是谁,立即加载;
而CMD就近依赖,需要使用把模块变为字符串解析一遍才知道依赖了那些模块,这也是很多人诟病CMD的一点,牺牲性能来带来开发的便利性,实际上解析模块用的时间短到可以忽略。
 AMD应用:RequireJS、curl、Dojo 
CMD应用:SeaJS
CommonJS应用:NodeJs
原文链接
其他文章

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions