模块化要解决的问题
如何安全的包装一个模块的代码?(不污染模块外的任何代码)
如何唯一标识一个模块?
如何优雅的把模块的API暴漏出去?(不能增加全局变量)
如何方便的使用所依赖的模块?
Modules/1.0规范
模块的标识应遵循的规则(书写规范)
定义全局函数require,通过传入模块标识来引入其他模块,执行的结果即为别的模块暴漏出来的API
如果被require函数引入的模块中也包含依赖,那么依次加载这些依赖
如果引入模块失败,那么require函数应该报一个异常
模块通过变量exports来向外暴露API,exports只能是一个对象,暴漏的API须作为此对象的属性。
AMD 规范
用全局函数define来定义模块,用法为:define(id?, dependencies?, factory);
id为模块标识,遵从CommonJS Module Identifiers规范
dependencies为依赖的模块数组,在factory中需传入形参与之一一对应
如果dependencies的值中有"require"、"exports"或"module",则与commonjs中的实现保持一致
如果dependencies省略不写,则默认为["require", "exports", "module"],factory中也会默认传入require,exports,module
如果factory为函数,模块对外暴漏API的方法有三种:return任意类型的数据、exports.xxx=xxx、module.exports=xxx
如果factory为对象,则该对象即为模块的返回值