天天一篇文章來記錄記錄本身的成長吧。大二,該靜心了。加油~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); }
這種模式的有點事模塊能夠經過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)
固然模塊的內容不止這麼一點點,剩下的之後再補充吧。