可以用闭包来构造模块,隐藏私有属性和方法,暴露公有属性和方法。这样 就形成了一个模块。
在模块化规范有commonjs,AMD,CMD,UMD, ES6
1.commonjs,是服务器端的规范,用到的是同步加载。 commonjs是主要为了js在后端的表现制定的,他是不适合前端的!nodejs用的就是commonjs规范
那么commonjs也是有缺陷的。require引入的模块是同步的,由于浏览器环境下,js都是通过script标签引入的,而这是异步的,因此conmmonjs在浏览器环境下无法正常加载
2.AMD(异步模块定义),是一个浏览器端模块化开发的规范。用到的是异步加载。requirejs框架用的就是AMD规范。
AMD模块中所有的依赖都前置, 其模块是异步的, 该自定义的模块内用到的模块均等到异步加载完成之后才调用响应模块, 这样浏览器不会失去响应。require指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题
3.CMD(同步模块定义)跟AMD的区别是实现了按需加载。seajs使用了CMD规范
4.UMD commonjs和AMD的结合。
UMD模块其实就是在当前JS执行环境中对以上几种模块规范定义的define, module.exports等进行判断, 同一模块根据不同场所返回不同结果。
ES6的模块化的基本规则或特点:
1、每一个模块只加载一次, 每一个JS只执行一次, 如果下次再去加载同目录下同文件,直接从内存中读取。 一个模块就是一个单例,或者说就是一个对象;
2、每一个模块内声明的变量都是局部变量, 不会污染全局作用域;
3、模块内部的变量或者函数可以通过export导出;
4.一个模块可以导入别的模块
AMD和CMD的区别
1.AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块,CMD`推崇就近依赖,只有在用到某个模块的时候再去require
2.两个都是定义的全局define函数来定义模块, define接收函数function(require, exports, module)保持一致
3.CMD是懒加载, 仅在require时才会加载模块; AMD是预加载, 在定义模块时就提前加载好所有依赖
4.CMD保留了CommonJS风格