node.js module初步理解

轉(zhuǎn)載地址:http://www.cnblogs.com/dolphinX/p/3485260.html

在開發(fā)一個復(fù)雜的應(yīng)用程序的時候,我們需要把各個功能拆分、封裝到不同的文件,在需要的時候引用該文件。沒人會寫一個幾萬行代碼的文件,這樣在可讀性、復(fù)用性和維護性上都很差,幾乎所有的編程語言都有自己的模塊組織方式,比如Java中的包、C#中的程序集等,node.js使用模塊和包來組織,其機制實現(xiàn)參照了CommonJS標準,雖未完全遵守,但差距不大,使用起來非常簡單。
什么是模塊
在node.js中模塊與文件是一一對應(yīng)的,也就是說一個node.js文件就是一個模塊,文件內(nèi)容可能是我們封裝好的一些JavaScript方法、JSON數(shù)據(jù)、編譯過的C/C++拓展等,在關(guān)于node.js的誤會提到過node.js的架構(gòu)


其中http、fs、net等都是node.js提供的核心模塊,使用C/C++實現(xiàn),外部用JavaScript封裝。
創(chuàng)建、加載模塊
模塊在node.js中的概念很簡單,看看如何創(chuàng)建一個我們自己的模塊供開發(fā)復(fù)用。
在node.js中創(chuàng)建模塊非常簡單,一個文件就是一個模塊,所以我們創(chuàng)建一個test.js文件就創(chuàng)建了一個模塊
test.js

var name='';

function setName(n){
    name=n;
} 

function printName(){
    console.log(name);
}

問題是怎么使外部訪問這個module,我們知道客戶端的JavaScript使用script標簽引入JavaScript文件就可以訪問其內(nèi)容了,但這樣帶了的弊端很多,最大的就是作用域相同,產(chǎn)生沖突問題,以至于前端大師們想出了立即執(zhí)行函數(shù)等方式,利用閉包解決。node.js使用exports和require對象來解決對外提供接口和引用模塊的問題。
我們可以把模塊中希望被外界訪問的內(nèi)容定義到exports對象中,對test.js稍作修改就可以了
test.js

var name='';

function setName(n){
    name=n;
} 

function printName(){
    console.log(name);
}

exports.setName=setName;
exports.printName=printName;

這樣我們在相同路徑下創(chuàng)建index.js,使用require引用一下test.js module
index.js

var test=require('./test');

test.setName('Byron');
test.printName();

exports一個對象
有時候我們希望模塊對外提供的使一個對象,修改一下test.js
test.js

var Student=function(){
    var name='';

     this.setName=function(n){
        name=n;
    }; 

    this.printName=function(){
        console.log(name)    ;
    };
};

exports.Student=Student;
這樣我們對外提供了一個Student類,在使用的時候需要這樣

var Student=require('./test').Student;
var student=new Student();
student.setName('Byron');
student.printName();

這樣我們的require語句就可以優(yōu)雅一些了

var Student=function(){
    var name='';

     this.setName=function(n){
        name=n;
    }; 

    this.printName=function(){
        console.log(name)    ;
    };
};

module.exports=Student;

很神奇的樣子,不是說好的exports是模塊公開的接口嘛,那么module.exports是什么東西?
module.exports與exports
事實的情況是醬紫的,其實module.exports才是模塊公開的接口,每個模塊都會自動創(chuàng)建一個module對象,對象有一個modules的屬性,初始值是個空對象{},module的公開接口就是這個屬性——module.exports。既然如此那和exports對象有毛線關(guān)系??!為什么我們也可以通過exports對象來公開接口呢?
為了方便,模塊中會有一個exports對象,和module.exports指向同一個變量,所以我們修改exports對象的時候也會修改module.exports對象,這樣我們就明白網(wǎng)上盛傳的module.exports對象不為空的時候exports對象就自動忽略是怎么回事兒了,因為module.exports通過賦值方式已經(jīng)和exports對象指向的變量不同了,exports對象怎么改和module.exports對象沒關(guān)系了。
大概就是這么過程

module.exports=exports={};
......

module.exports=new Object();

exports=xxx;//和new Object沒有關(guān)系了,最后返回module.exports,所以改動都無效了

一次加載
無論調(diào)用多少次require,對于同一模塊node.js只會加載一次,引用多次獲取的仍是相同的實例,看個例子
test.js

var name='';

function setName(n){
    name=n;
} 

function printName(){
    console.log(name);
}

exports.setName=setName;
exports.printName=printName;

index.js

 var test1=require('./test'),
    test2=require('./test');

test1.setName('Byron');
test2.printName();

執(zhí)行結(jié)果并不是'',而是輸出了test1設(shè)置的名字,雖然引用兩次,但是獲取的是一個實例
require搜索module方式
node.js中模塊有兩種類型:核心模塊和文件模塊,核心模塊直接使用名稱獲取,比如最長用的http模塊

var http=require('http');

在上面例子中我們使用了相對路徑 './test'來獲取自定義文件模塊,那么node.js有幾種搜索加載模塊方式呢?
核心模塊優(yōu)先級最高,直接使用名字加載,在有命名沖突的時候首先加載核心模塊
文件模塊只能按照路徑加載(可以省略默認的.js拓展名,不是的話需要顯示聲明書寫)絕對路徑
相對路徑

查找node_modules目錄,我們知道在調(diào)用 npm install <name> 命令的時候會在當前目錄下創(chuàng)建node_module目錄(如果不存在) 安裝模塊,當 require 遇到一個既不是核心模塊,又不是以路徑形式表示的模塊名稱時,會試圖 在當前目錄下的 node_modules 目錄中來查找是不是有這樣一個模塊。如果沒有找到,則會 在當前目錄的上一層中的 node_modules 目錄中繼續(xù)查找,反復(fù)執(zhí)行這一過程,直到遇到根 目錄為止。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Node.js是目前非常火熱的技術(shù),但是它的誕生經(jīng)歷卻很奇特。 眾所周知,在Netscape設(shè)計出JavaScri...
    w_zhuan閱讀 3,732評論 2 41
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,240評論 0 1
  • 1 Node.js模塊的實現(xiàn) 之前在網(wǎng)上查閱了許多介紹Node.js的文章,可惜對于Node.js的模塊機制大都著...
    zlx_2017閱讀 1,500評論 0 1
  • 1 Node.js模塊的實現(xiàn)# 之前在網(wǎng)上查閱了許多介紹Node.js的文章,可惜對于Node.js的模塊機制大都...
    七寸知架構(gòu)閱讀 2,159評論 1 50
  • Node.js是目前非?;馃岬募夹g(shù),但是它的誕生經(jīng)歷卻很奇特。 眾所周知,在Netscape設(shè)計出JavaScri...
    Myselfyan閱讀 4,203評論 2 58

友情鏈接更多精彩內(nèi)容