AMD、CMD、commonJS模块化规范的理解
前言
这三个都是为Js模块化加载而生的,使模块能够按需加载,使系统同庞杂的代码得到组织和管理。模块化的管理代码使多人开发得到了更好的合作。
一、commonJS
定义模块
根据CommonJS
规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性
特点
CommonJS
规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。
模块输出与加载
nodejs
中的模块化机制,模块通过require()
引入,exports
或modules.exports
导出
常用于:服务器端,node
,webpack
二、AMD
特点
- 异步加载:因为面向浏览器端,为了不影响渲染肯定是异步加载
- 依赖前置:所有的依赖必须写在最初的依赖数组中,速度快,但是会浪费资源,预先加载了所有依赖不管你是否用到
AMD规范则是非同步加载模块,允许指定回调函数。
三、CMD
- 是需要的时候去请求,而不是先加载再使用。
RequireJS
用的就是AMD
,AMD
用define
定义方法,用require
引用模块
特点
- 异步加载
- 按需加载 / 依赖就近:用到了再引用依赖,方便了开发,缺点是速度和性能较差。
四、AMD与CMD的区别
AMD
推崇依赖前置,在定义模块的时候就要声明其依赖的模块。
CMD
推崇就近依赖,只有在用到某个模块的时候再去require
。
对于依赖的模块AMD
是提前执行,CMD
是延迟执行。不过RequireJS
从2.0开始,也改成可以延迟执行(根据写法不同,处理方式不通过)。
AMD
推崇依赖前置,AMD
的api
默认是一个当多个用,CMD
严格的区分