zoukankan      html  css  js  c++  java
  • module.exports 和 exports(转)

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

    var x = 5;
    var addX = function (value) {
      return value + x;
    };
    module.exports.x = x;
    module.exports.addX = addX;
    

      

    上面代码通过module.exports输出变量x和函数addX

    require方法用于加载模块。

    var example = require('./example.js');
    
    console.log(example.x); // 5
    console.log(example.addX(1)); // 6
    

      

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

    function Module(id, parent) {
      this.id = id;
      this.exports = {};
      this.parent = parent;
      // ...
    

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

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

    var exports = module.exports;
    

      造成的结果是,在对外输出模块接口时,可以向exports对象添加方法。

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

      注意,不能直接将exports变量指向一个值,因为这样等于切断了exportsmodule.exports的联系。

    exports = function(x) {console.log(x)};
    

      

    上面这样的写法是无效的,因为exports不再指向module.exports了。

    下面的写法也是无效的。

    exports.hello = function() {
      return 'hello';
    };
    
    module.exports = 'Hello world';
    

      

    上面代码中,hello函数是无法对外输出的,因为module.exports被重新赋值了。

    这意味着,如果一个模块的对外接口,就是一个单一的值,不能使用exports输出,只能使用module.exports输出。

    module.exports = function (x){ console.log(x);};
    

      如果你觉得,exportsmodule.exports之间的区别很难分清,一个简单的处理方法,就是放弃使用exports,只使用module.exports

    ---------------------------------------------------------------------------------------------------------------------

    require命令

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

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

    如果模块输出的是一个函数,那就不能定义在exports对象上面,而要定义在module.exports变量上面。

    require命令用于加载文件,后缀名默认为.js

    var foo = require('foo');
    //  等同于
    var foo = require('foo.js');
    

      

  • 相关阅读:
    SD卡测试
    测试人员可能会遇到的问题
    HDU 1024 Max Sum Plus Plus
    HDU 1176 免费馅饼
    HDU 1257 最少拦截系统
    HDU 1087 Super Jumping! Jumping! Jumping!
    poj 1328 Radar Installation
    poj 1753 Flip Game
    HDU 1003 Max Sum
    HDU 5592 ZYB's Premutation(BestCoder Round #65 C)
  • 原文地址:https://www.cnblogs.com/caonima-666/p/6893099.html
Copyright © 2011-2022 走看看