commonJS, AMD, CMD区别表格对比

1、对比总览

名称 同步/异步 规范文件 应用场景 加载速度 描述
commonJS 同步 CommonJS NODEJS 平均加载速度最慢 最早版本的js模块化编程规范,同步下载所有依赖后才能继续向下执行
AMD 异步 requireJS 依赖前置 平均加载速度最快 CommonJS的异步js加载模块解决方案,头部加载所有所需依赖
CMD 异步 seaJS 就近加载 平均加载速度适中 CommonJS的异步js加载模块解决方案,使用依赖前就近加载所需依赖

2、解决问题:

以上三种规范都是在解决以下问题:

  • 模块化分装,避免污染全局变量
  • 隐藏实现细节,避免从模块外部修改没有暴漏出来的变量、函数

3、commonJS

  • 一个单独的文件就是一个模块
  • 模块出口唯一 module.exports
  • 加载模块使用require(.js的扩展名可省略)

加载方式:
require是同步的。模块系统需要同步读取模块文件内容,并编译执行以得到模块接口。
在js文件加载中,同步加载会使得页面加载效率很低,于是有了后来的cmd与amd规范。

4、AMD(Asynchronous Module Definition)

意为异步模块定义。对应函数库为大名鼎鼎的RequireJS
语法:

// 定义模块 myModule.js
define(['dependency', function() {
  var name = 'Michael';
  function printName() {
    console.log(name);
  }
  return {
    printName:printName
  };
}];
// 加载模块
require(['myModule'], function(my) {
  my.printName();
});
  • define(id, dependencies, factory);
    • id用来定义模块的标识。可选
    • dependencies 当前模块依赖的模块名称。数组
    • factory模块初始化时执行的函数或对象
  • require([dependencies], function(){});
    • 引用的模块。数组
    • 当加载的函数都加载成功后执行的回调函数。

5、CMD(common module definition)

同为异步模块,只在模块定义方式和模块加载时机略有不同。

推崇理念

  • 一个文件一个模块,经常用文件名作为模块id
  • 推崇依赖就近,一般不在definie的参数中写依赖,在factory中写
// 定义模块 myModule.js
define(function(require, exports, module) {
  var $ = require('jquery.js')
  $('div').addClass('active');
}
// 加载模块
seajs.use(['myModule.js'], function(my) {
});

6、AMD与CMD区别

注:加载模块都是异步的。

在模块定义时对依赖的处理不同

  • AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块
  • CMD推崇就近依赖,只有在用到某个模块的时候再去require
posted @ 2022-12-14 16:27  m2maomao  阅读(32)  评论(0)    收藏  举报