模块化就是将一个大的功能拆分为多个块,每一个块都是独立的,你不需要去担心污染全局变量,命名冲突什么的,它们只是向外暴露特定的变量和函数。
模块化的好处:①解决命名冲突 ②依赖管理 ③代码更加可读 ④提高复用性
目前流行的js模块化规范有AMD、CMD、CommonJS以及ES6的模块系统。
本文重点掌握AMD与CMD的区别、CommonJS与ES6 Module的区别
一、AMD
AMD,异步模块定义
(Asynchronous Module Definition),它是一个在浏览器端模块化开发的规范。
它是依赖前置(依赖必须一开始就写好)会先尽早地执行(依赖)模块 。换句话说,所有的require都被提前执行(require 可以是全局或局部 )。
由于不是JavaScript原生支持,使用AMD规范进行页面开发需要用到对应的库函数,也就是大名鼎鼎RequireJS
。
(1)定义模块: define()
定义一个叫modelName的模块,且该模块的依赖为a,b,c。当加载完所有依赖(即加载完a,b,c)后,再执行回调函数,返回模块的输出值(即对外暴露的值)
。
define('modelName', ["a","b","c"], function(a,b,c){
//`````
return {}; //返回模块输出值(由向外暴露的变量 组成)
})
- 参数一:定义的
模块名称
。若没有提供该参数,则默认为该模块所在文件的名称。(可选) - 参数二:当前
模块的依赖(是数组)
,且数组里依赖的模块必须是已经定义的。
若没有提供该参数,它默认为["require", "exports", "module"]
;(可选) - 参数三:
模块初始化要执行的函数或对象
。
× 模块名格式:
模块名命名必须为驼峰形式,且不允许有文件扩展名(如“.js” )
模块名可以为 “相对的” 或 “顶级的”。如果首字符为“.”或“…”则为相对的模块名
顶级的模块名从根命名空间的概念模块解析
相对的模块名从 “require” 书写和调用的模块解析
(2)加载模块: require()
require()函数在加载依赖的函数的时候是异步加载的,这样浏览器不会失去响应,它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。
require(["a", "b", "c"], function(z,x,d){});
- 参数一:是个数组,表示所依赖的模块
- 参数二:是一个回调函数,
参数一的模块都加载成功后&