nodeJSにおけるexportsとmopdule.exportsの違い

6776 ワード

各node.js実行ファイルは自動的にmoduleオブジェクトを作成します.同時に、moduleオブジェクトはexportsという属性を作成します.初期化の値は{}です.
 module.exports = {};
Node.jsは機能関数を簡単に導出するために、node.jsは自動的に以下のような語句を実現します.
foo.js
 exports.a = function(){

 console.log('a')

 }



 exports.a = 1 
test.js
 var x = require('./foo');



 console.log(x.a)
ここを見て、みんなが答えを見たと信じています.exportsはmodule.exportsを引用した値です.module.exportが変更された場合、exportsは変更されません.モジュールがエクスポートされた時、本当にエクスポートされた実行はmodule.exportsではなく、exportsです.
次の例を見てみます.
foo.js
 exports.a = function(){

  console.log('a')

 }



 module.exports = {a: 2}

 exports.a = 1 
test.js
 var x = require('./foo');



 console.log(x.a)
レスリング:
 2
exportsはmodule.exportsが変更された後、失効します.
初めはちょっと広くて明るいですか?下にはオープンソースモジュールの中によく見られるいくつかの使用方法があります.
璣璣module.export=View
function View(name, options) { 

   options = options || {};

   this.name = name;

   this.root = options.root;

   var engines = options.engines;

   this.defaultEngine = options.defaultEngine;

   var ext = this.ext = extname(name);

   if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no         extension was provided.');

   if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') +     this.defaultEngine);

   this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express);

   this.path = this.lookup(name);

 }



 module.exports = View;
javascriptには、関数は対象であり、Viewは対象であり、module.export=Viewは、全体のviewオブジェクトを導出するのに相当する言葉があります.外のモジュールがそれを呼び出すと、Viewのすべての方法を呼び出すことができます.ただし、Viewの静的な方法である場合にのみ呼び出しが可能であり、prototypeの作成方法は、Viewのプライベートな方法であることに注意が必要である.
foo.js
 function View(){



 }



 View.prototype.test = function(){

  console.log('test')

 }



 View.test1 = function(){

  console.log('test1')

 }
module.export=View
test.js
 var x = require('./foo');



 console.log(x) //{ [Function: View] test1: [Function] }

 console.log(x.test) //undefined

 console.log(x.test1) //[Function]

 x.test1() //test1
璜璜var ap=export=module.export={}
実は、原理を知ったら、このような書き方はちょっと冗長です.実は保証のために、モジュールの初期化環境は清潔です.同時に私達にも便利です.module.exportsの指す対象を変えてもexportsの特性をそのまま適用できます.
 exports = module.exports = createApplication;



 /**

  * Expose mime.

  */



 exports.mime = connect.mime;
例では、module.exports = createApplicationはmodule.exportsを変更し、exportを失効させ、export=module.exportの方法を通じて、元の特徴を回復させる.
璣璣啝exports.init=function()
これが一番簡単で、直接モジュールinitをエクスポートする方法です.
ヽoo.ツ=new Mongoose.
集多機能は一つですが、上記に述べたように、皆さんは答えを出せないはずです.
 
 
 
https://cnodejs.org/topic/5231a630101e574521e45ef8
 
exportsとmodule.exportsの違いを理解しています.
よりよく理解するために  exports 和  module.exports 私たちはまずjsの基礎を補います.例:
app.js
var a = {name: 'nswbmw 1'};

var b = a;



console.log(a);

console.log(b);



b.name = 'nswbmw 2';

console.log(a);

console.log(b);



var b = {name: 'nswbmw 3'};

console.log(a);

console.log(b);
アプリ.jsを実行した結果:
D:\>node app

{ name: 'nswbmw 1' }

{ name: 'nswbmw 1' }

{ name: 'nswbmw 2' }

{ name: 'nswbmw 2' }

{ name: 'nswbmw 2' }

{ name: 'nswbmw 3' }



D:\>
aはオブジェクトであり、bはaに対する参照であり、aとbは同じオブジェクト、つまりaとbは同じブロックのメモリアドレスを指すので、前の二つの出力は同じです.bを修正すると、つまりaとbは同じメモリアドレスを指す内容が変更されたので、aも体現しているので、第三四の出力は同じです.bを完全にカバーすると、bは新しいメモリアドレスを指しています(元のメモリブロックを修正していません).aは元のメモリブロックを指しています.つまり、aとbはもう同じメモリを指していません.つまり、aとbはもう関係がないので、最後の二つの出力は違っています.
上記の例が分かりましたら、本題に入ります.私たちは3時まで知っています.  exports 和  module.exports の違いがあります
  • exports はい、指します  module.exports の引用
  • module.exports 初期値は空のオブジェクトです.  {}です.ですから  exports 初期値も  {}
  • require() 帰るのは  module.exports ではなく  exports
  • だから:
  • 私達は
      var name = 'nswbmw';
    
      exports.name = name;
    
      exports.sayName = function() {
    
        console.log(name);
    
      }
    を通してあげます.  exports 賦課は実は与えるものです  module.exports この空のオブジェクトには二つの属性が追加されています.上のコードは
      var name = 'nswbmw';
    
      module.exports.name = name;
    
      module.exports.sayName = function() {
    
        console.log(name);
    
      }
  • に相当します.
  • 私達は普通このように使います.  exports 和  module.exportsの簡単な例では、円の面積を計算します.exportap.js
      var circle = require('./circle');
    
      console.log(circle.area(4));
    circle.js
      exports.area = function(r) {
    
        return r * r * Math.PI;
    
      }
    を使用して、module.exportap.js
      var area = require('./area');
    
      console.log(area(4));
    ara.js
      module.exports = function(r) {
    
        return r * r * Math.PI;
    
      }
    上の二つの例を使って出力します.なぜこのように書かないのですか?app.js
      var area = require('./area');
    
      console.log(area(4));
    ara.js
      exports = function(r) {
    
        return r * r * Math.PI;
    
      }
    が上記の例を実行するとエラーが発生します.なぜなら、前の例では  exports 属性を追加します.  exports 指したメモリは修正されました.
      exports = function(r) {
    
        return r * r * Math.PI;
    
      }
    は正しいです.  exports 上書きしました.つまり  exports 新しいメモリを指しています.つまり、円面積を計算する関数です.  exports 和  module.exports もう同じメモリを指しません.つまりこの時です.  exports 和  module.exports 連絡がないということは  module.exports 指しているメモリは何も変わっていません.まだ空のオブジェクトです.  {} ,つまり、ara.jsは空いているオブジェクトを導出しました.だから、ap.jsでara(4)会報を呼びます.  TypeError: object is not a function のエラーですから、一つの言葉をまとめます.モジュールにエクスポートしたいのは対象です.  exports 和  module.exports どちらも使えます  exports 新しいオブジェクトに上書きすることもできません.オブジェクト以外のインターフェースをエクスポートするには、上書きするしかありません.  module.exports .
  • 私達はよくこのような書き方を見ます.
      exports = module.exports = somethings
    の上のコードは
      module.exports = somethings
    
      exports = module.exports
    の原因に相当します.  module.exports = somethings はい、そうです  module.exports 上書きしました.  module.exports 和  exports の関係が破断されました. 新しいメモリブロックを指しますが、  module.exports 元のメモリブロックを指します.  exports 和  module.exports それとも同じメモリを指していますか?それとも同じ「対象」を指していますか?  exports .