Node.js中的模塊化

天天一篇文章來記錄記錄本身的成長吧。大二,該靜心了。加油~node

好了,廢話很少說,今天說說nodejs中的模塊化.(注:此文爲本身對書nodejs實戰的總結)json

 

nodejs一個重要的特性就是模塊化,模塊就是node.js對經常使用功能進行分組的方式。並且,node無需真正辨別模塊究竟是咱們本身編寫的仍是從外部倉庫中獲取的。這樣咱們只須要一個額外的json文檔和一兩行代碼,咱們就能引用別人的代碼或者別人引用咱們的代碼,是否是很酷~。ide

 

好,下面咱們來編寫一個簡單的模塊:模塊化

exports.hello_world = function(){
    console.log("Hello World");
}

咱們用mymodule.js文件來保存這段代碼,exports對象是一個特殊的對象,在每一個咱們建立的文件中由Node的文件系統建立,當咱們引用這個模塊時,會做爲require函數的值返回。它被封裝在每一個模塊的module對象中,用來暴露函數,變量或類。使用模塊的方法也很簡單,代碼以下:函數

 

var mm = require('./mymodule');
mm.hello_world();

這樣咱們能夠經過exports對象來暴露任何咱們想要暴露的函數和類。當咱們頻繁的從模塊中返回對象時,咱們會有兩種使用的核心模式:單元測試

第一種就是咱們的工廠模式,看下面一段代碼:測試

function Hello(lang){
    this.language  = lang;
    this.greet() = function(){
        switch(this.language){
            case "en" :return "Hello1";break;
            case "de" :return "Hello2";break;
            case "jp" :return "Hello3";break;
            default:return "No speaka that language";break;
        }
    }
}


//如今咱們用工廠模式來返回咱們Hello類的實例
exports.create_Hello = function(lang){
    return new Hello(lang);
}
View Code

這種模式的有點事模塊能夠經過exports對象來暴露其餘的函數和類。ui

第二種模式就是構造函數模式,即直接模式,如今咱們函數不變,用構造函數代碼就應是這樣:this

module.exports = Hello;

注意咱們在使用的時候就應該把代碼變一下:spa

var hello = require("./mymodule");
var lang = "en";
var obj = new hello(lang);
obj.greet();

但記住在這裏咱們真正惟一暴露的是一個類的構造函數。這和咱們面向對象的思想很接近,可是有個缺點就是咱們不能讓模塊暴露更多的東西。因此咱們常常會用的是咱們的工廠模式。

關於exports和module.exports的區別你們來看這個網址:https://cnodejs.org/topic/52308842101e574521c16e06.

 

咱們知道了想要在一個文件中引入模塊咱們只需使用require函數便可,注意咱們引入的模塊對於引入他們的模塊時私有的。若是a.js加載http模塊,那麼b.js是沒法加載這個模塊的,除非b也引入了http模塊。

下面看看Node.js是怎樣來查找模塊的,其實規則很簡單:

1.當請求的是內置模塊(如http和fs)時,node會直接使用這些模塊

2.當請求的模塊一路徑符(如./  ../  /)開始時,node會找到指定的目錄而且加載他,若是沒有在模塊名中指定.js擴展名,那麼node會首先查找基於同名文件夾的模塊,若是沒有找到,那麼他會添加擴展名.js .json和.node,並嘗試一次加載這些模塊(帶node擴展名的模塊會被編譯成附加模塊)

3.若是沒有路徑符,node會在當前文件夾的node_modules/子文件夾下查找模塊。若是找到,則加載該模塊,不然,node會以本身的方式在當前位置的路徑樹下尋找mode_modules/文件夾,若是還失敗,那麼他會在一些默認的地址下進行搜尋,如/usr/lib和/usr/local/lib文件夾.

4.若是還沒找到就拋出錯誤.

 

之前咱們在引用文件時很容易進入引用文件死循環,可是在node中卻不會這樣。好比我在a.js中引入b.js,在b.js中引入a.js,在main.js中引入a.js,這個在node 中的執行順序是先加載main.js,而後運行 引入a.js,再引入b.js,而後node會檢測到循環並返回一個指向a.js的對象,可是不會再執行此代碼。

 

咱們知道node.js的每一個文件都是一個含有module和exports對象的模塊,這個模塊也能夠很複雜:包含一個目錄用來保存模塊的內容和一個包含包信息的文件。若是咱們想要編寫一系列的支持文件,並將模塊的功能拆散到多個js文件中,甚至包含單元測試,那麼咱們能夠這麼來寫:

1.建立一個文件夾來存放模塊的內容

2.添加一個名爲package.json的文件到文件夾中。文件至少包含當前模塊的名字和一個主要的JS文件(用來一開始加載該模塊)

3.若是Node沒有找到package.json文件或者沒有指定主JS文件,那他就會查找index.js(或者是編譯後的附加模塊index.node)

 

固然模塊的內容不止這麼一點點,剩下的之後再補充吧。

相關文章
相關標籤/搜索