美文网首页
JS模块化

JS模块化

作者: ozil_oo | 来源:发表于2018-07-31 14:34 被阅读0次

    1.CommonJS规范

    Node 应用由模块组成,采用 CommonJS 模块规范。

    每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。

    // example.js
    var x = 5;
    var addX = function (value) {
      return value + x;
    };
    

    上面代码中,变量x和函数addX,是当前文件example.js私有的,其他文件不可见。

    如果想在多个文件分享变量,必须定义为global对象的属性。

    global.warning = true;
    

    上面代码的warning变量,可以被所有文件读取。当然,这样写法是不推荐的。

    CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。

    module.exports & exports

    Node内部提供一个Module构建函数。所有模块都是Module的实例。

    module.exports属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量。

    为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。

    exports.area = function (r) {
      return Math.PI * r * r;
    };
    
    exports.circumference = function (r) {
      return 2 * Math.PI * r;
    };
    

    重要的话说三遍
    注意:exports不能直接赋值,比如exports = xxxxx
    注意:exports不能直接赋值,比如exports = xxxxx
    注意:exports不能直接赋值,比如exports = xxxxx
    对外输出为单一值,比如module.exports = "hello commonJS"时,就不能用exports

    require

    Node使用CommonJS模块规范,内置的require命令用于加载模块文件。

    require命令的基本功能是,读入并执行一个JavaScript文件,然后返回该模块的exports对象。如果没有发现指定模块,会报错。

    AMD\CMD规范

    CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD规范则是非同步加载模块,允许指定回调函数。由于Node.js主要用于服务器编程,模块文件一般都已经存在于本地硬盘,所以加载起来比较快,不用考虑非同步加载的方式,所以CommonJS规范比较适用。但是,如果是浏览器环境,要从服务器端加载模块,这时就必须采用非同步模式,因此浏览器端一般采用AMD规范。
    AMD也采用require()语句加载模块,但是不同于CommonJS,它要求两个参数:

     require([module], callback);
    
      require(['math'], function (math) {
    
        math.add(2, 3);
    
      });
    

    AMD规范使用define方法定义模块,下面就是一个例子:

    define(['package/lib'], function(lib){
      function foo(){
        lib.log('hello world!');
      }
    
      return {
        foo: foo
      };
    });
    

    requirejs是AMD规范的实现

    seajs是CMD规范的实现

    相关文章

      网友评论

          本文标题:JS模块化

          本文链接:https://www.haomeiwen.com/subject/zhchvftx.html