什么是模块化
1. 将复杂的应用根据职责封装成几个模块文件,并组合在一块
2. 每个模块都有自己独立的作用域,模块内部的数据是私有的,不同模块之间互不影响,只是暴露一些接口与外部通讯
模块化发展的进程
1. 全局命名函数
2. 命名空间对象
3. 立即执行函数
将系统代码划分为多个单一职责的模块,保证了各个模块的独立性,使系统中某一部分的变化影响其他部分变得清晰可见,系统的维护性更加简单,提高代码复用性。但是多个 script 标签的引用导致当依赖多个模块的时候,需要发送多个请求,请求过多;依赖模糊,多个 js 文件之间的加载顺序不一致导致代码报错;系统变得难以维护;
模块化需要解决的问题:
1. 模块静态资源的管理;
2. 模块依赖关系的处理;
3. 模块沙箱(模块闭包),模块内定义的变量其他模块无法读取到;
模块化规范
commonjs
nodejs 标志着 javascript 模块化编程正式诞生,服务器端,需要与操作系统和其他应用程序互动,一定要有模块,否则根本没法编程。
nodejs 的模块化系统,是参照 commonjs 实现的,该规范的核心是允许模块通过require()的形式以同步的方式加载其他需要依赖的模块,然后通过exports、module.exports 的方式导出模块。由于一个重大的局限,commonjs 是同步加载模块,使得CommonJS规范不适用于浏览器环境。
有四个重要的环境变量module、exports、require、global为模块化提供支持
AMD(模块定义规范)
AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。对于浏览器,模块都放在服务器上,等待的时间取决于网速的快慢,可能需要等待很长的时间,需要等模块加载完再执行代码,只能采用“异步加载”,避免网页失去响应。

AMD 规范基本语法:
define(id?,dependencies?,factory);
require([module], callback);
AMD 特点:
能并行加载多个文件;
依赖前置,先加载后执行,需要提前加载所有的依赖才能使用,不是在需要的时候加载;
实现 AMD 规范的库:
由于是浏览器端模块化开发规范,并不是浏览器的原生支持,所以用 amd 规范进行开发需要用到对应的库,主要有两个 JavaScript 库实现了 AMD 规范: require.js 和 curl.js。
CMD (模块定义规范)
cmd 是类似于 AMD 的另一种 js 模块化规范。module 的执行顺序与书写顺序完全一致。
CMD特点:
依赖就近原则,按需加载执行;
依赖 SPM 打包,模块的加载逻辑偏重
实现 CMD 规范的库:
seaJS是基于CMD规范的模块化库
es6模块规范
在语言上标准上实现了模块化,取代CommonJS、AMD、CMD成为服务端和浏览器端通用的模块解决方案。(CommonJS、AMD、CMD运行时确定依赖关系)。ES6 Modules不是对象,import命令会被 JavaScript 引擎静态分析,在编译时就引入模块代码,而不是在代码运行时加载,所以无法实现条件加载。也正因为这个,使得静态分析成为可能。