Day8 AMD&CMD&ESModule?| 青训营

64 阅读3分钟

不知道你们会不会遇到这样的场景,在引入文件的时候总是不知道什么时候使用require什么时候使用import,导出的时候什么时候是exports或者module.export?经过一系列的恶补之后,终于理清了这三种异步模块的区别。

AMD(Asynchronous Module Definition)

background

首先我们需要知道,AMD其实是由requireJS提出来的模块化开发,RequireJS解决了前端开发过程中的两大问题,一个是文件之间的依赖问题,一个是浏览器加载多个JS文件时页面失去响应的时间过长。这两个问题导致人们开发出这样的一个框架来。

point

推崇依赖前置,在定义模块的时候就要声明其依赖的模块 使用defined来定义一个模块,用require来加载一个模块

CMD

point

  1. 推崇依赖就近,只有在用到某个模块的时候再去require
  2. 在CMD规范中,使用define函数来定义一个模块,require函数来加载一个模块。
  3. 在define函数中,回调函数的参数可以自定义,但是一般情况下
    1. 第一个参数是require,表示依赖其他模块的方法;
    2. 第二个参数是exports,表示该模块对外输出的方法和属性;
    3. 第三个参数是module,表示该模块自身。
    4. 在回调函数中,我们可以使用require函数来加载其他模块,并将需要输出的方法和属性添加到exports对象上。在require函数中,只需要传入需要加载的模块名称即可。

AMD&CMD总结

AMD和CMD的本质区别其实是他们俩对依赖模块的执行时机有所不同。AMD把依赖提前了js可以方便知道依赖模块是谁,立即加载,而CMD就近依赖,需要使用把模块变为字符串解析一遍才知道依赖了那些模块,这也是很多人诟病CMD的一点,牺牲性能来带来开发的便利性,实际上解析模块用的时间短到可以忽略。

ESModule

ESModule就是我们常说的利用es6语法导出导入。他有一个显著特点就是,按需导入。区别于前面两种,该规范采用静态编译的方式来进行模块化,也就像前面两种规范,ESModule也支持异步加载模块。但是它的语法与前两种规范有很大的不同。

导出

  1. named exports: 命名导出,每次可以导出一个或者多个。
  2. default exports: 默认导出,每次只能存在一个。
//定义模块
export function module() {
  //...
}
 
//使用模块
import { module } from 'module';

在ESModule规范中,使用export关键字来将模块的方法和属性输出,使用import关键字来加载其他模块。

NodeJs规范

在写服务端时比较常用,nodejs推出的模块化规范。他区别于其他三种规范的最大不同在于,他采用的是同步加载。这在我们web使用可能会导致页面变卡等一系列问题。

//定义模块
var module1 = require('module1');
var module2 = require('module2');
 
//使用模块
var module = require('module');