標籤:style blog http color io os 使用 ar sp
每天一篇文章來記錄記錄自己的成長吧。大二,該靜心了。加油~
好了,廢話不多說,今天說說nodejs中的模組化.(注:此文為自己對書nodejs實戰的總結)
nodejs一個重要的特性就是模組化,模組就是node.js對常用功能進行分組的方式。而且,node無需真正辨別模組到底是我們自己編寫的還是從外部倉庫中擷取的。這樣我們只需要一個額外的json文檔和一兩行代碼,我們就能引用別人的代碼或者別人引用我們的代碼,是不是很酷~。
好,下面我們來編寫一個簡單的模組:
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對象來暴露其他的函數和類。
第二種模式就是建構函式模式,即直接模式,現在我們函數不變,用建構函式代碼就應是這樣:
module.exports = Hello;
注意我們在使用的時候就應該把代碼變一下:
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)
當然模組的內容不止這麼一點點,剩下的以後再補充吧。
Node.js中的模組化