CommonJS 规范
优点:
- 所有代码在模块作用域内运行,不会污染其他文件
- require 得到的值是值的拷贝,即你引用其他 JS 文件的变量,修改操作了也不会影响其他文件
缺点: - 应用层面。在 index.html 中做 var index = require(’./index.js’) 操作报错,因为它最终是后台执行的,只能是 index.js 引用 index2.js 这种方式。
- 同步加载问题。CommonJS 规范中模块是同步加载的,即在 index.js 中加载 index2.js,如果 index2.js 卡住了,那就要等很久
AMD 规范
- 适用客户端
- 等待加载(同步加载问题)。
- 可以采用异步方式加载模块。AMD 是 Asynchronous Module Definition 的缩写,也就是 “异步模块定义”,记住这个 async 就知道它是异步的了
CMD 规范
CMD是 seajs 推崇的规范,CMD 则是依赖就近,用的时候再 require。
AMD 和 CMD 最大的区别是对依赖模块的执行时机处理不同,注意不是加载的时机或者方式不同,二者皆为异步加载模块
ES6 Modules 规范
优点:
- export 命令和 import 命令可以出现在模块的任何位置,只要处于模块顶层就可以。 如果处于块级作用域内,就会报错,这是因为处于条件代码块之中,就没法做静态优化了,违背了 ES6 模块的设计初衷。
- import 命令具有提升效果,会提升到整个模块的头部,首先执行
ES6 Modules 规范和CommonJS 规范区别
- CommonJS 模块是运行时加载,ES6 Modules 是编译时输出接口
- CommonJS 输出是值的拷贝;ES6 Modules 输出的是值的引用,被输出模块的内部的改变会影响引用的改变
- CommonJs 导入的模块路径可以是一个表达式,因为它使用的是require() 方法;而 ES6 Modules 只能是字符串
- CommonJS this 指向当前模块,ES6 Modules 的 this 指向 undefined
- ES6 Modules 中没有这些顶层变量:arguments、require、module、exports、__filename、__dirname