felayman---nodejs的幾種模組載入方式

來源:互聯網
上載者:User

標籤:c   style   class   blog   code   java   

nodejs的幾種模組載入方式

一.直接在exports對象中添加方法

1.首先建立一個模組(module.js)module.js

exports.One = function(){console.log('first module');};
2.load.js

var module  =require('./module');module.One();
這樣我們就可以在引入了該模組後,返回一個exports對象,這裡是指module對象,其實都只是兩個引用或者控制代碼,只是都指向了同一個資源,在load.js裡,module的名字可以是任意取的,因為它僅僅是指向require(‘./module‘);返回後的一個執行個體對象的引用,在load.js檔案裡的module和在module.js裡的exports對象是同一個東西.因此上述兩個檔案可以用一個檔案來表示:

exports.One = function(){console.log('first module');};exports.One();
其運行結果是一致的,這裡我們可以很清晰的看到,我們在使用require(‘./xxxx‘)後其實返回的總是在xxxx.js檔案中的exports對象的引用,這個引用的名字我們可以任意取,但是為了規範我們還是最好取符號某些非標準規定(後面說道),但是這樣會有不妥的地方,因為它是始終指向exports的執行個體對象,也就是說,我們雖然有了這個模組,但是這個模組我們只能使用一次,這取決於rquire(‘./module‘)只會加在一次該模組.比如我們修改上述代碼,

module.js

var name ;exports.setName = function(oName){name = oName;};exports.getName  = function(){console.log(name);};

load.js

var module1  = require('./module');module1.setName("felayman1");module1.getName();var module2  = require('./module');module2.setName("felayman2");module2.getName();module1.getName();
我們可以看到,雖然我們使用了兩次require(‘./module‘);,但是當我們修改module2後,module1的內容也被修改,這恰恰說明了,module1和module2是指向的同一個對象.有時候這並不影響我們的程式,但是如果我們的module是Person呢?我們希望我們require(‘./person‘)後返回的是不同的對象.因此,這種方式是有缺陷的,儘管很方便,這種方式在大部分nodejs的模組中都是很常見,比如fs模組,http模組等.

二.將模組中的函數掛載到exports對象的屬性上

person.js

<span style="font-family:Courier New;font-size:18px;">function Person{<span style="white-space: pre; "></span>var name;<span style="white-space: pre; "></span>this.setName = function(theName){<span style="white-space: pre; "></span>name = theName;<span style="white-space: pre; "></span>};<span style="white-space: pre; "></span>this.sayHello = function(){<span style="white-space: pre; "></span>console.log('Hello',name);<span style="white-space: pre; "></span>};}exports.Person = Person;</span><span style="font-size:24px;font-family: 'Microsoft YaHei'; "></span>
load.js
var Person  = require('./person').Person;var person1 = new Person();person1.setName("felayman1");person1.sayHello();var person2 = new Person();person2.setName("felayman2");person2.sayHello();person1.sayHello();



這樣我們可以看到,我們就可以引入一個函數了,我們把在person.js檔案中的Person函數設定為eports對象的一個屬性,我們只需要在load.js檔案中引入該屬性,就可以擷取到多個該函數的執行個體,在nodejs中的EventEmitter就是基於這種方式,但是這樣我們總是在使用 require(‘./person‘).Person;這樣的寫法有點太複雜,因此nodejs允許我們使用其他更簡潔的方式,利用全域變數--module,這樣我們在其他檔案中引入其他模組的時候,就更方便了.


三.利用全域變數module

person.js

<span style="font-family:Courier New;">function Person(){var name;this.setName = function(theName){name = theName;};this.sayHello = function(){console.log('Hello',name);};}// exports.Person = Person;module.exports = Person;</span>
load.js

var Person  = require('./person');var person1 = new Person();person1.setName("felayman1");person1.sayHello();var person2 = new Person();person2.setName("felayman2");person2.sayHello();person1.sayHello();
這樣一修改,我們就在使用require函數的時候就方便了,如果覺得這裡難以理解,我們可以把兩個檔案裡文法放到一起:

var Person  = require('./person');
module.exports = Person;
這樣,我們就可以看出,其實就是這樣
var Person =  Person.  

因為上述我們都已經說過,require(‘./person‘)其實就是module.exports 對象的,這裡的module我們不用太在意,就跟javascript中的window一樣,是一個全域變數,即module.exports =exports就類似於window.alert() =alert()差不多的效果,這樣我們就能看出,我們再次使用require(‘./person‘)的時候其實就是匯入了我們所需要的exports對象的屬性函數模板了,這樣我們也可以多次執行個體化我們所需要的對象了.這種方式是綜合了前兩種的方法,因此也是官方推薦的使用方法.















聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.