1.什么是模块
将一个复杂的程序依据一定的规则(规范)封装成几个块(文件), 并进行组合在一起 块的内部数据与实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信
2.为什么使用模块及模块化
以module.exports(暴露)和require(引入 )来说
(1):达到代码重用性,避免全局变量的污染
模块化是指解决一个复杂问题时自顶向下逐层把系统划分成若干模块的过程,有多种属性,
分别反映其内部特性。
模块化是一种处理复杂系统分解为更好的可管理模块的方式。
代码冗余度降低
3.模块化的好处
避免命名冲突(减少命名空间污染)
更好的分离, 按需加载
更高复用性
高可维护性
每个模块都有特定的功能!
4.CommonJS规范、AMD规范和CMD规范的区别
CommonJS规范的特点:
NodeJS是CommonJS规范的主要实践者,
有四个重要的环境变量为模块化的实现提供支持:
module、exports、require、global
- 对于基本数据类型,属于复制。即会被模块缓存。同时,在另一个模块可以对该模块输出的变量重新赋值
- 对于复杂数据类型,属于浅拷贝。由于两个模块引用的对象指向同一个内存空间,因此对该模块的值做修改时会影响另一个模块。
- 使用require命令加载某个模块时,就会运行整个模块的代码。
- 循环加载时,属于加载时执行。即脚本代码在require的时候,就会全部执行。一旦出现某个模块被"循环加载",就只输出已经执行的部分,还未执行的部分不会输出。
CommonJS与AMD:
CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。
AMD规范则是非同步加载模块,AMD规范采用异步方式加载模块,允许指定回调函数。
由于Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用。但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用AMD规范。
CMD和AMD
CMD与AMD很类似,不同点在于:AMD推崇依赖前置、提前执行,CMD推崇依赖就近、延迟执行。
对于依赖的模块AMD是提前执行,CMD是延迟执行。不过RequireJS从2.0开始,也改成可以延迟执行。
AMD推崇依赖前置(在定义模块的时候就要声明其依赖的模块),CMD推崇依赖就近(只有在用到某个模块的时候再去require——按需加载)。
AMD的api默认是一个当多个用,CMD严格的区分推崇职责单一。例如:AMD里require分全局的和局部的。CMD里面没有全局的 require,提供 seajs.use()来实现模块系统的加载启动。CMD里每个API都简单纯粹。
ES6与CommonJS模块的差异
- CommonJS模块输出的是一个值的拷贝,ES6模块输出的是值得引用。
- ES6模块的运行机制与CommonJS不一样。JS引擎对脚本静态分析的时候,遇到模块加载命令
import
,就会生成一个只读引用。ES6模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。 - CommonJS 模块是运行时加载,ES6 模块是编译时输出接口
CommonJS 加载的是一个对象(即module.exports
属性),该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。
模块化解决的实际问题就是
①命名空间冲突
②文化依赖管理
标签:CommonJS,CMD,模块化,理解,AMD,可列举,模块,加载 From: https://www.cnblogs.com/alwaysrun/p/17178588.html