JavaScript模块化CommonJS/AMD/CMD/UMD/ES6Module的区别 (2)

这里define是一个全局函数,用来定义模块,并通过exports向外提供接口。之后,如果要使用某模块,可以通过require来获取该模块提供的接口。最后使用某个组件的时候,通过seajs.use()来调用。

通过exports暴露接口。这意味着不需要命名空间了,更不需要全局变量。

通过require引入依赖。这可以让依赖内置,我们只需要关心当前模块的依赖。关注度分离

CMD推崇依赖就近,延迟执行。在上面例子中,通过require引入的模块,只有当程序运行到此处的时候,模块才会自动加载执行。

同时推出了spm(static package manager)的打包方式,听说支付宝的项目在使用。

UMD && webpack

UMD文档
UMD(Universal Module Definition - 通用模块定义)模式,该模式主要用来解决CommonJS模式和AMD模式代码不能通用的问题,并同时还支持老式的全局变量规范。

// 使用Node, AMD 或 browser globals 模式创建模块 (function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD模式. 注册为一个匿名函数 define(['b'], factory); } else if (typeof module === 'object' && module.exports) { // Node等类CommonJS的环境 module.exports = factory(require('b')); } else { // 浏览器全局变量 (root is window) root.returnExports = factory(root.b); } }(typeof self !== 'undefined' ? self : this, function (b) { // 以某种方式使用 b //返回一个值来定义模块导出。(即可以返回对象,也可以返回函数) return {}; }));

判断define为函数,并且是否存在define.amd,来判断是否为AMD规范,

判断module是否为一个对象,并且是否存在module.exports来判断是否为CommonJS规范

如果以上两种都没有,设定为原始的代码规范。

这种模式,通常会在webpack打包的时候用到。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspzwz.html