Node.js中的模組化

來源:互聯網
上載者:User

標籤: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中的模組化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.