模块化开发的演变过程
按文件划分
- 每个功能单独放在不同的文件中
 - 所有模块都在全局去工作,完全依赖约定存在
 - 每个模块暴露一个全局对象,所有模块成员都挂载到对象中
 - 虽然减少了全局污染,但是全局污染、命名冲突、依赖关系依然没有解决
立即执行函数(IIFE)
 - 实现了内部私有的成员
 - 通过传参传入依赖项
 
(function($){
    ...
    window.xxx = {
        xxx:...
    }
})(jq)
AMD
异步模块定义规范,通过异步方式加载模块,模块加载不影响后面代码执行,所有依赖模块执行的代码,放在回调函数中,异步模块加载完毕后会执行回调函数
require([module]callback)
目前主要有两个JavaScript库实现了AMD规范 requireJs 和cur
存在问题
- 需要引入第三方库,增加额外的代码
 - 请求js文件频繁
CommonJS
 - 每个模块是单独的文件
 - 每个模块的有自己的作用域
 - 通过module.exports导出模块;通过require导入模块,后缀名默认为.js,多次require
 - 加载模块是同步的
 
http://javascript.ruanyifeng.com/nodejs/module.html
由于CommonJS是同步的,所以不适合浏览器环境,在node环境中,模块都是本地文件,加载速度比较快
CMD(sea.js )
类似CommonJS规范,后来被requirejs兼容了
define(function(require, exports, module) {
    // 模块代码
});
ES Modules
- 标准化的Module特性
 - 自动使用严格模式
 - export 导出,import导入
- export导出的不是对象,而是特定的代码
 - import 导入只会加载导入的方法,没有导入的方法不会加载
 - 编译时加载
 
 - 每个文件都有自己单独的作用域
模块标椎规范
 - NodeJS 采用CommonJS规范
 - 浏览器采用ES Modules