为什么要使用模块化?
最主要的目的:
- 解决命名冲突
- 依赖管理
其他价值:
- 提高代码可读性
- 代码解耦,提高复用性
CMD、AMD、CommonJS 规范分别指什么?有哪些应用
模块的规范:
定义一个统一的前提,大家必须以同样的方式编写模块。
- CommonJS:
CommonJS是服务器端模块的规范。
- 在一个模块中,存在一个自由的变量
require
,他是一个函数- 这个
require
函数接受一个模块标识符 -
require
返回外部模块所输出的API - 如果出现依赖闭环,那么外部模块在被他的传递一台所
require
的时候可能并没有执行完成;在这种情况下,require
返回的对象必须至少包含此外部模块在调用require
函数之前就已经准备完毕输出 - 如果请求的模块不能返回,那么
require
必须抛出一个错误
- 这个
- 在一个模块中,会存在一个名为exports的自由变量,它是一个对象,模块可以在执行的时候把自身的API加入其中
- 模块必须使用exports对象做唯一表示
- CMD:
是SeaJS推广过程中诞生的,在CMD规范中,一个模块就是一个文件,代码的书写格式如下
define(factory)
- AMD:
AMD(异步模块定义)指定一种机智,在该机制下模块和依赖可以异步加载。这对浏览器端尤其适用。
define(id?,dependencies?,factory);
- id:定义中模块的名字,可选:如果没提供该参数,模块的名字应该默认为模块加载器请求的指定的脚本的名字。
- dependencies:是一个当前模块依赖的,已被模块定义的模块标识的数组字面量。依赖参数是可选的。如果忽略次参数它应该默认为["require", "exports", "module"]。然而,如果工厂方法的长度属性小于3,加载器会选择以函数的长度属性指定的参数个数调用工厂方法。
- 工厂方法,模块初始化要执行的函数或对象。如果为函数,他应该只被执行一次。如果是对象,此对象应该为模块的输出值。
示例:
define('modal', ['jQuery', 'dialog'], function($, Dialog){
$('.modal').show();
Dialog.open();
});