commonjs、amd、cmd和umd等五花八门的名称,都是js的模块化规范标准。
在没有模块化的时代,我们一般是这么写代码的:
<script src="module1.js"></script>
<script src="module2.js"></script>
<script src="libraryA.js"></script>
<script src="module3.js"></script>
...
...
...
模块把接口暴露到全局对象下(比如window),各个模块可以通过全局对象访问各个依赖的接口,但是也存在一些问题:
1、变量污染;
2、脚本加载的依赖顺序;
模块化方案帮我们解决了以上难题,但其标准并不一致。
commonjs
一个模块可以通过exports或者module.exports导出API,然后通过require同步引入。注意是同步哦,因此适用于node服务端。
而浏览器端一般是异步加载,因此诞生出两种异步方案:amd和cmd。
amd和cmd
amd是requirejs,cmd是seajs,二者差别不大,都是define一个模块,然后通过require加载。
umd
umd就是同步和异步模块加载的兼容,实现起来也比较简单,加个判断就行。webpack就是干这事的。
(function (root, factory) {
if (typeof define === "function" && define.amd) {
// AMD
define(["jquery"], factory);
} else if (typeof exports === "object") {
// Node, CommonJS之类的
module.exports = factory(require("jquery"));
} else {
// 浏览器全局变量(root 即 window)
root.returnExports = factory(root.jQuery);
}
}(this, function ($) {
// 方法
function test(){};
// 暴露公共方法
return test;
}));
ES6 module
其实我们常用的是es6的module规范,通过export导出模块,然后import加载。但因兼容性问题,目前都是结合babel和webpack来使用的。
网友评论