JS的模块通常就是指一个文件,每一个文件当做一个独立的作用域,对外暴露变量或者函数。
JS模块化有几种方案分别是 CommonJS,AMD,CMD,UMD,ESModule
CommonJS
适用于服务端
最大的特点就是同步加载
流程:
路径解析–>文件加载–>模块封装–>编译执行–>缓存
在浏览器端使用commonJS具体实现:
- 先使用require.register注册文件路径和对应方法之间的映射关系保存在require.modules中
- 再使用require方法,通过传入的路径去require.modules中取出对应的方法
- 使用require获取方法的同时,会触发依赖模块中的require方法,这样就实现了模块的加载
1 | function require(path) { |
AMD
AMD 规范加载模块是异步的,并允许函数回调,不必等到所有模块都加载完成,后续操作可以正常执行。
1 | // 规范 API |
RequireJS
CMD
CMD中,模块作为依赖且被引用时才会初始化,否则只会加载。
1 | //CMD |
SeaJS
AMD,CMD区别
- AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块并加载
- CMD推崇就近依赖,只有在用到某个模块的时候再去require
UMD兼容写法
1 | // a.js |
ES6
commonJS与ES6module区别
- CommonJS是运行时加载,ES6时编译时输出接口
commonJS加载的是一个对象,该对象在脚本运行完才会产生,es6模块不是模块,,他的对外接口只是一种静态定义,在代码解析执行就会生成。
因此es6有两个特点,一是import会被提前到文件顶部,exports会有变量提升的效果 - CommonJS是值的拷贝,ES6是值的引用