搜尋

首頁  >  問答  >  主體

node.js - nodejs exports module.exports

nodejs 中经常会看到这样的代码
exports = module.exports = {}
请问 为什么要让 exports = module.exports 呢? 这样做有什么作用呢? 谢谢!!!

巴扎黑巴扎黑2863 天前599

全部回覆(1)我來回復

  • PHPz

    PHPz2017-04-17 15:32:40

    讓這個模組更純粹的寫法。
    module.exports是require()方法調用模組的接口,而exports可以給模組添加更多的方法,而exports返回的是一個實例化對象,指向module.exports
    比如對於一個構造函數來說:
    Person.js

    var Person = function() {
        this.name = 'Samuel';
    }
    
    //通过module.exports
    module.exports = Person;//这里将Person作为模块暴露的接口,传递给require(),使其返回这个Person
    exports.one = 'Shervesi';//这里给Person添加了一个属性,那么通过require()返回的模块也会拥有这个方法

    Use.js

    var P = require('./Person');
    console.log(P.name);//'Samuel'
    console.log(P.one);//'Shervesi',这个属性是Person所不具有的

    因此可以將exports理解為給模組進行最後修飾的方法;
    而module.exports則負責暴露一個接口供require()方法調用,若module.exports沒有被聲明指向,那它就默認的導出exports所指向的對象,如這樣一個場景:
    Person.js

    var Person = function() {
        this.name = 'Samuel';
    }
    module.exports = 'I am a string';//module.exports被声明指向了一个字符串
    exports.one = 'Shervesi';

    User.js

    var P = require('./Person.js');
    console.log(P);//'I am a string'  //这是module.exports所提供的接口指向的
    console.log(P.one);//这里会出现类型错误,因为负责暴露接口的module.exports已经导出了一个字符串,即是一个常量,因此不能携带one属性,exports所修饰的one属性被‘干掉’。
    

    總結:

    • module.exports是模組導出的仲裁,它決定到底導出一個什麼東西,本質上就是提供給require()方法的一個回傳值,因此它可以是任何js基本類型(包括null);

    • exports是給導出模組進行修飾的輔助方法,但受module.exports的仲裁,決定模組是否能具有這個屬性。

    回覆
    0
  • 取消回覆