模块规范(CommonJS、AMD、CMD)

CommonJS规范

应用于服务端,模块同步加载 — nodejs/webpack;

  • 引用:require(module);
  • 导出:exportsmodule.exports
  • 全局对象:global对象 — 用于模块间共享变量;
  • 模块对象:module对象 — 表示当前对象,存在于每个模块内部;
    注:浏览器不兼容CommonJS的根本原因是缺少以上四个nodejs环境的变量,只要能提供这些对象—通过立即执行函数提供,浏览器就能加载CommonJS模块;
// 浏览器环境
var module = {
  exports: {}
};

(function(module, exports) {
  exports.multiply = function (n) { return n * 1000 };
}(module, module.exports))

var f = module.exports.multiply;  // f(5) = 5000;

AMD规范(异步模块定义)

  1. 背景
    CommonJS规范不适合于浏览器环境:
  • require()是同步的:
    • 服务器:所有的模块在本地磁盘,同步加载等待时间是硬盘的读取时间;
    • 浏览器:模块在服务端,等待时间取决于网速的快慢,可能要等很长时间,浏览器处于假死状态;
  1. AMD
  • require([module], callback):异步方式加载依赖的模块,所有依赖模块加载完后执行回调函数;
    require(['moduleA'、‘moduleB’、‘moduleC’],function(moduleA,moduleB,moduleC){ ... })
  • RequireJS库:
    • 实现js文件的异步加载,避免网页失去响应;
    • 管理模块之间的依赖性,便于代码的编写和维护;
  • 模块编写规范
    • define([module], callback):模块写在define()中;
//math.js
define(function(){
var add = function(x, y){
return x+y;
}
return {
add: add //导出模块
}
})

CMD规范(通用模块定义)

与AMD规范类似,区别是:

  • AMD规范:依赖置前:预先加载所有的依赖,知道使用时才执行 — define([module], function(){})
  • CMD规范:依赖就近 :直到使用时才加载依赖;
define(function(reuqire, exports, module){
var module = require('xx'); //当需要模块时才require();
 })

ES6的Module(支持服务器和浏览器)

区别

  • CommonJS、AMD、CMD属于运行时加载:只有在运行时才能确定输出接口,获取到模块生成一个对象;
  • ES6属于编译时加载:编译时确定输出接口,静态加载—支持静态分析,从而提前检查代码bug等;
  • CommonJS模块的顶层this指向当前模块,ES6模块中的this指向undefined
    让浏览器兼容ES6写法

    规范总结
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容