/** * CommonJS 模块化规范 * CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作 */ /*-------Node.js遵循Commonjs规范---------*/ //写法1. var exports=module.exports; exports.name="leyi"; exports.fn=function(){ return 'hello world!' }; //写法2. module.exports={ "name":'leyi', "fn":function(){ return 'hello world!' } }; //写法3. module.exports=function(){ this.name='leyi'; this.fn=function(){ return 'hello world!' } }; /** * AMD 模块化规范 -推崇依赖前置 * AMD规范则是非同步加载模块,允许指定回调函数。由于Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘, * 所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用。 * 但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用AMD规范。 */ /*-------require.js遵循的AMD规范---------*/ //依赖一开始写好,默认推荐写法如下 define(['./aaa', './bbb'], function(a, b) { a.xxx(); b.xxx(); }); //AMD规范也支持Commonjs规范的写法,跟下面的CMD写法一样,define写成这样 define(function(require,exports,module){ //... }); /** * CMD 模块化规范 -推崇依赖就近 * 代码在运行时,首先是不知道依赖的,需要遍历所有的require关键字,找出后面的依赖。 * 具体做法是将function toString后,用正则匹配出require关键字后面的依赖。 */ /*-------sea.js遵循的CMD规范---------*/ define(function(require,exports,module){ var aaa=require('./aaa'); aaa.xxx(); var bbb=require('./bbb'); bbb.xxx(); exports.fn=function(){ aaa.xxx(); } }); /*兼容多种模块规范的写法*/ !(function(moduleName,fn){ //上下文为amd或cmd环境 if(typeof define === 'function'){ define(fn); //上下文为commonjs环境 }else if('undefined' !== typeof module && !!module && !!module.exports){ module.exports=fn(); }else{ //挂载到全局作用域上 this[moduleName]=fn(); } }('moduleName',function(){ var obj={"name":"leyi"} return obj; }));
来源:https://www.cnblogs.com/leyi/p/6534647.html