我从2017年开始接触nodejs,到现在用了一年多了,觉得我有必要写点东西出来,记录自己的积累的知识体系,以便更好的掌握nodejs。
nodejs专题不是按照严格的学习历程书写,纯属个人划分的等级。
认识AMD、UMD、CommonJS
AMD(Asynchromous Module Definition - 异步模块定义)
AMD是RequireJS
在推广过程中对模块定义的规范化产出。AMD是异步加载模块,推崇依赖前置。
define('module1', ['jquery'], ($) => {
});
可能有的人还听过CMD(Common Module Definition - 公共模块定义),CMD是SeaJS
在推广过程中对模块定义的规范化产出。对于模块的依赖,CMD是延迟执行,推崇依赖就近。目前很少有人会提到CMD,已经被AMD同化了,所以目前流行的说法只有AMD、UMD和CommonJS。
再扩展一点知识吧,使用webpack开发一个工具库时,会配置libraryTarget属性,它的可选值有amd、umd、commonjs。如果libraryTarget: ‘amd’或者libraryTarget: ‘commonjs’,只有nodejs环境才可以使用,浏览器无法使用 ,而libraryTarget: ‘umd’时,既可以在nodejs中使用又可以在浏览器引用使用。
如果libraryTarget: ‘umd’,浏览器的识别顺序是:
先判断是否支持Node.js的模块(exports)是否存在,存在则使用Node.js模块模式。
再判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。
否则采用浏览器全局引用
// umd打包后的基本格式
(function (window, factory) {
if (typeof exports === 'object') {
module.exports = factory();
} else if (typeof define === 'function' && define.amd) {
define(factory);
} else {
window.eventUtil = factory();
}
})(this, function () {
// module ...
});
UMD(Universal Module Definition - 通用模块定义)
UMD又是个什么玩意呢?UMD是AMD和CommonJS的一个糅合。AMD是浏览器优先,异步加载;CommonJS是服务器优先,同步加载。
既然要通用,怎么办呢?那就先判断是否支持node.js的模块,存在就使用node.js;再判断是否支持AMD(define是否存在),存在则使用AMD的方式加载。这就是所谓的UMD。
((root, factory) => {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof exports === 'object') {
var $ = requie('jquery');
module.exports = factory($);
} else {
root.testModule = factory(root.jQuery);
}
})(this, ($) => {
});
CommonJS
CommonJS是服务端模块的规范,由于Node.js被广泛认知,也可理解为Node.js默认支持的就是CommonJS规范。
根据CommonJS规范,一个单独的文件就是一个模块。加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的module.exports对象。
moudle.exports = {
a: 1
};
var f1 = require('./file1');
var v = f1.a + 2;
module.exports ={
v: v
};
CommonJS 加载模块是同步的,所以只有加载完成才能执行后面的操作。像Node.js主要用于服务器的编程,加载的模块文件一般都已经存在本地硬盘,所以加载起来比较快,不用考虑异步加载的方式,所以CommonJS规范比较适用。但如果是浏览器环境,要从服务器加载模块,这时就必须采用异步模式。所以就有了 AMD CMD 解决方案。
总结
说了这么多,大家可能有了基础的认识,也解答了很多人的疑惑。
下一节给大家讲解一下CommonJS和ES6在Node.js中的使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)