当前文章数量: 555 篇, Author: 二师兄

CommonJS,AMD,CMD,UMD的关系(一)

2022-05-06 19:17

CommonJS, AMD,CMD,ESM已经认识的时间不短了, 一直没来得及整理他们的关系及区别, 这里简要整理一意思CommonJS, AMD,CMD,ESM已经认识的时间不短了, 一直没来得及整理他们的关系及区别, 这里简要整理一下

CommonJS

CommonJS 是一种同步执行的模块规范, NodeJS 是 CommonJS规范的主要实践者,在NodeJs中, 一个文件就是一个模块,有自己的作用域, 在文件中对外暴露出指定的变量或者函数, 它主要提供四个关键字global, require, module, exports

全局变量

上面说过每个模块都有自己的作用域, 作用域内的变量和函数,如果没有主动暴露出去, 在模块外是访问不到模块的, global存在于整个NodeJS环境内, 它里面包含了很多默认的属性, 下面的module,exports其实都属于global的属性,

也可以通过它用来声明一个全局的属性, 这个属性可以通过任何一个模块访问到

1
global._name = 'zhangsan';

对外暴露变量或者函数

module.exports用来把模块内的指定变量或函数暴露出去

1
2
module.exports.a = 1;
module.exports.add = function(){};

至于exports, 它相当于module.exports的一个语法糖, 也就是说上面的代码完全可以这么写:

1
2
exports.a = 1;
exports.add = function(){};

但是千万不要像这么写:

1
2
3
4
5
6
7
8
9
exports = {
    a:1,
    add: function(){}
}
// 或者
module.exports = {
    a:1,
    add: function(){}
}

因为module.exports指向了一个特殊的引用, 这种写法相当于修改了它的引用地址, 会导致模块异常

引用模块

require用来引入一个模块

1
const path = require('path');

前面说CommonJS是同步执行的模块规范, 意思就是它会在执行真实逻辑代码之前, 会加载所有通过require引入的模块. NodeJS更多应用于服务器环境, 通过require引入的模块大都是本机内的文件, 也就是IO操作, 即便是同步执行, 对代码的执行速度影响很小

但在浏览器中就不行了 , 第一, 浏览器中的一些资源可能需要通过网络获取, 在这个过程中, 不应当阻止用户的其他行为,第二, 在浏览器中加载的模块文件, 应当根据实际需要从网路获取, 而不是一股脑的把所有的模块全部拿出来, 会造成很大的资源浪费. 所以AMD模块规范由此而生, 后续请参考下一篇

目录