对于大型Web应用或者项目,动辄上万行的代码,给开发和后期维护带来了不小的麻烦。所以,须要有一种规范化的模块管理机制,帮助开发者集中处理模块的定义与调用关系。node
在ES6正式出台前,已经有很多人致力于推出适合Web开发的模块化管理标准,CommonJS、AMD和CMD就是其中的成功表明。git
如下为我查阅资料后,对三者最直观的理解:github
一般被应用于服务器,实现表明:NodeJS。NodeJS相信你们都不陌生,它的出现成功将Javascript应用到了服务器端,使得前段开发者也能较为省力得转向后端开发,而无需学习一门新语言。json
在服务器端,模块的加载和执行都在本地完成,所以,CommonJS并不要求模块加载的异步化。后端
AMD(异步模块加载)和CMD一般用于浏览器端,它们与CommonJS最明显的不一样就是异步加载。AMD的实现表明是require.js,它也是require.js在推广过程当中的附加产物。数组
requirejs.config({ config: { 'bar': { size:'large' }, 'baz': { color: 'blue' } } }); //bar.js直接使用module模块 define(function (require, exports, module) { var size = module.config().size; }); //baz.js使用了一个依赖数组,并要求一个特殊的依赖“module” define(['module'], function(module) { var color = module.config().color; });
当“some/newmodule”调用了“require('foo')”,它将获取到foo1.2.js文件;而当“some/oldmodule”调用“`require('foo')”时它将获取到foo1.0.js。浏览器
requirejs.config({ map: { 'some/newmodule': { 'foo': 'foo1.2' }, 'some/oldmodule': { 'foo': 'foo1.0' } } });
CMD(通用模块加载)是sea.js在推广过程当中的产出,它与AMD主要有如下几点区别(来自seajs的官方阐述):服务器
这造成了两种大相径庭的加载方式:“预加载”和“懒加载”。AMD提早将全部模块的全部依赖加载完成后,才开始执行主流程;而CMD是遇到一个依赖开始加载,完成后执行当前流程,遇到下一个依赖再次去加载,而后再执行下一步。固然,同一模块的依赖之间仍然是异步加载的。异步
流程与AMD相似,再也不赘述,只简单介绍seajs的API。模块化
seajs.config({ // 变量配置 vars: { 'locale': 'zh-cn' } }); define(function(require, exports, module) { var lang = require('./i18n/{locale}.js'); //=> 加载的是 path/to/i18n/zh-cn.js });
使用变量须要用花括号包围,如例中的{locale}。