欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CommonJs、AMD、CMD模块化规范

程序员文章站 2022-03-04 13:36:57
...
    /**
     * 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;
    }));