+
95
-

AMD、CMD、UMD、CommonJS、ES Module有哪些不同?

请问AMD、CMD、UMD、CommonJS、ES Module有哪些不同?代码的写法是否一样?

网友回复

+
15
-

1、CommonJS

说到CommonJS,那就的从他的出发点说起了,commonjs的出发点是js没有完善的模块系统。标准库较少,缺少包管理工具,而在node.js兴起之后。能让js在任何地方运行,特别是服务端,也能具备开发大型项目的能力,所以commonjs也就应用而生了。node.js是commonjs的最佳实践者。他有四个重要的环境变量为模块化的实现提供支持:module、exports、require、global.实际使用时,用module.exports定义当前模块对外输出的接口(不推荐直接使用exports),用require加载模块。 commonjs用同步的方式加载模块,在服务端,模块文件够存储在本地磁盘,读取会非常快。所以这样做不会有问题。但是在浏览器端,限制于网络等原因,更合理的加载方式应该是异步加载。 暴露模块:module.exports = value;或者exports.xxx = value; 引入模块:const xxx = require('xxxx') commonjs规范:

一个文件就是一个模块,拥有单独的作用域;

普通方式定义的变量、函数、对象属于该模块内;

通过require来加载模块;

通过module.exports或者exports来暴露模块中的内容;

注意: 当module.exports和exports同时存在的时候,module.exports会覆盖exports;

当模块内全都是exports是,其实就等同于module.exports;

exports其实就是module.exports的子集;

所有代码都是运行在模块作用域,不会污染全局作用域;

模块可以被多次加载,但是只是会在第一次运行的时候加载。然后运行结果就会被缓存了。以后的加载就直接读取缓存的结果;

模块加载的顺序是按照代码出现的顺序同步加载的;

__dirname代表当前模块所在的文件路径

__filename代表当前模块文件所在的文件路径+文件名

2、AMD Asynchronous Module Definition,异步加载模块。他是在一个在浏览器端模块化的开发规范。不是原生js的规范。使用AMD规范进行页面需求开发,需要用到对应的函数库,require.js。 AMD采用异步加载的模块的方式。模块的加载并不会影响到后面语句的执行。所有以来这个模块的语句都定义在一个回掉函数中,等到加载完成之后,这个回掉函数才会执行。 使用require.js来实现AMD规范的模块化:用require.config()指定引用路径。用define()来定义模块用require来加载模块。
define('moduleName',['a','b'],function(ma, mb) {
return someExportValue;
})

require(['a', 'b'], function(m...

点击查看剩余70%

我知道答案,我要回答