CommonJS、AMD、 CMD 都是 JavaScript 模块化的规范。其中 CommonJS 侧重于服务器端 JavaScript 模块化规范,著名的 NodeJS 就是这种规范的实现;AMD(异步模块定义)和 CMD(通用模块定义)偏向于浏览器端 JavaScript 模块化规范:RequireJS 遵循 AMD,SeaJS 则遵循 CMD。
遵循这些规范,便可在需要时加载某些模块,使得大量庞杂的代码得以良好的组织和管理。模块化还使得我们在管理和使用代码不那么混乱,更方便与他人合作。
CommonJS
CommonJS 规范是出现的比较早,是一个偏向于服务器端的规范,NodeJS 便采用该规范。根据 CommonJS 规范,一个单独的文件就是一个模块。加载模块使用 require 方法,您可以通过 require('something') 来加载模块。该方法读取一个文件并执行,最后返回文件内部 exports 的对象。因此,在 NodeJS 中,定义一个模块就是写一个新的 JavaScript 文件,最后要将文件的内容 exports 出来。
不过,这种方法更适合服务端,因为在服务器端通过读取本地磁盘加载模块,同步加载速度很快。如果在客户端,由于网络等不稳定因素,同步加载模块代码有可能会阻塞,会影响 require 后代码的执行。有没有异步加载模块的规范呢?
AMD
CommonJS 解决了 JavaScript 模块化的问题,并可以用在浏览器中。但 CommonJS 是同步加载模块,即用到模块时即时加载,现加载现用,这种同步机制导致在浏览器端会出现各种问题:性能、可用性、调试和跨域等。
鉴于浏览器的特殊情况,又出现了一个规范,这个规范呢可以实现异步加载依赖模块,并且会提前加载那,这就是 AMD 规范,即 Asynchronous Module Definition,这种异步模块定义规范,RequireJs 实现了这一规范:先定义所有依赖,然后在加载完成后的回调函数中执行,语法类似 require([module], callback)
AMD 虽然实现了异步加载,但是必须开始就把所有依赖写出来,其并不符合书写的逻辑顺序,能不能像 CommonJS 那样用的时候在 require,并且还支持异步加载呢?
CMD
CMD ,Common Module Definition, 淘宝的玉伯实现了 SeaJs 并遵循该规范。CMD则是依赖就近,用的时候再 require。类似这样:
define(function(require, exports, module){
var a = require('module a')
? ? a.doSomething()
? ? var b = require('module b') // 依赖可以就近加载
? ? b.doSomething()
})
AMD 和 CMD 最大的不同是对依赖模块的执行时机不同,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也可以延迟执行。AMD 依赖前置,JavaScript 代码可以方便知道依赖模块有哪些,立即加载;而 CMD 推崇就近依赖,需要使用把模块变为字符串解析一遍后才知道有哪些依赖,这是一些人诟病 CMD 的点,牺牲性能来换取开发的便利性,不过实际上运行中,解析模块牺牲的时间几乎可以忽略。
本文暂时没有评论,来添加一个吧(●'◡'●)