Node.js 的模塊知識(shí)匯總
在寫 Node.js 應(yīng)用程序的時(shí)候,你確實(shí)可以把所有代碼放在巨大原 index.js 文件中,不在乎你的應(yīng)用程序會(huì)變得多大多復(fù)雜。Node.js 解釋器不會(huì)在意這個(gè)事情。但在代碼組織方面,你很快就會(huì)陷入混亂,不能理解代碼,而且難以調(diào)試。所以,作為一個(gè)人,你應(yīng)該關(guān)心代碼的結(jié)構(gòu)。這就是使用模塊的原因。
你可以把 Node.js 模塊當(dāng)作 JavaScript 庫(kù) —— 是整體代碼中你想放在一起的某個(gè)部分(比如,函數(shù)集),你會(huì)想把這部分代碼相對(duì)獨(dú)立于代碼庫(kù)中的其它部分,可以把事情區(qū)分清楚。
就們我們把襪子放在衣柜一個(gè)抽屜,把襯衣放在衣柜的另一個(gè)抽屜 —— 我們可以把它們組成一天的著裝 ——在代碼庫(kù)中,我們將不同的部分保存在不同的模塊中,然后將它們有條不紊地合并成一個(gè)應(yīng)用程序。
內(nèi)建模塊
即使我們不創(chuàng)造任何 Node.js 模塊,也有模塊可用,因?yàn)?Node.js 環(huán)境提供了內(nèi)建模塊。我們已經(jīng)遇到過一個(gè)模塊,就是在博客中尋找如何使用內(nèi)建的 SHATWG URL 解析器的時(shí)候。
在我們自己的代碼文件中,我們需要使用已經(jīng)存在但是在別處聲明的代碼 —— 這種情況下,URL類是 Node.js 內(nèi)置模塊url中的一部分。
var URL = require('url').URL;
require('url')讓我們可以訪問url模塊。這個(gè)模塊定義在哪里,是怎么定義的,對(duì)我們來說完全不透明 —— 我們所需要知道的只是它的名稱 ——url—— 以及它公開的屬性,比如URL。
其它內(nèi)建的模塊直接導(dǎo)出我們需要的屬性(通常是 JavaScript 對(duì)象)。以http模塊為例:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('Hello World!');
}).listen(8080);
這里,請(qǐng)求http模塊讓我們可以直接訪問http對(duì)象,我們可以直接使用其方法,比如createServer。
Node 初學(xué)者這本書講述了如何使用 Node.js 寫一個(gè)完整的 Web 服務(wù)器,它就是使用的內(nèi)建http模塊。
外部模塊
內(nèi)建模塊隨 Node.js 發(fā)布,它可以解決很多開發(fā)問題,而不需要為每個(gè)應(yīng)用發(fā)明新的輪子,但是真正促進(jìn) Node.js 編程能力的是由來自 Node.js 社區(qū)的開源模塊構(gòu)建起來的龐大生態(tài)系統(tǒng)。這些模塊也可以集成到我們的代碼庫(kù)中,但是由于它們不是內(nèi)置的,并且不會(huì)隨每次安裝Node.js 一起安裝,所以只在是我們的代碼中require是不夠的。我們需要先安裝包含外部模塊的代碼庫(kù),由于 NPM,Node Package Manager(Node 包管理器) 的存在,這很容易。
請(qǐng)參博客文章,它以如何使用 async 庫(kù)為例來介紹如何使用外部模塊。
此外,Node工匠書還使用了一個(gè)章節(jié)來介紹了使用 NPM 的細(xì)節(jié)。
創(chuàng)建你自己的模塊
內(nèi)建模塊和外部模塊都是別人提供的,但它們不會(huì)妨礙你創(chuàng)建自己的 Node.js 模塊。
下面的例子創(chuàng)建了一個(gè)名為myRandom的模塊,它會(huì)提供了一個(gè)輔助函數(shù),用于返回 0 到 10 之間的數(shù)。
文件myRandom.js:
function getRandom(min, max) {
return Math.random() * (max - min) + min;
}
exports.between1and10 = function() {
return getRandom(1, 10);
};
你應(yīng)該把代碼放在自己的myRandom.js文件中。由于此文件存在,并通過exports向外提供屬性,另一個(gè)文件index.js可以使用導(dǎo)出的功能:
文件index.js:
var myRandom = require('./myRandom.js');
console.log(myRandom.between1and10());
require再次發(fā)揮作用,它讓本地myRandom模塊中導(dǎo)出的屬性生效 —— 在這里是指between1and10函數(shù)。
注意:雖然模塊系統(tǒng)允許公開模塊的功能,但它也允許隱藏在模塊之外不會(huì)用到的功能,只要不通過exports導(dǎo)出就好。即使index.js文件請(qǐng)求了myRandom.js文件,它也不能訪問未導(dǎo)出的getRandom函數(shù):
var myRandom = require('./myRandom.js');
console.log(myRandom.getRandom(5, 99));
這會(huì)導(dǎo)致 TypeError: myRandom.getRandom is not a function.
通過將實(shí)現(xiàn)細(xì)節(jié)隱藏在模塊中,只暴露出需要在其它代碼中使用的部分,可以很好的組織你的代碼。
相關(guān)文章
使用Nodejs開發(fā)微信公眾號(hào)后臺(tái)服務(wù)實(shí)例
這篇文章主要介紹了使用Nodejs開發(fā)微信公眾號(hào)后臺(tái)服務(wù)實(shí)例,在這個(gè)實(shí)例中,主要使用到了express, wechat, mongodb, monk等模塊,需要的朋友可以參考下2014-09-09
總結(jié)Node.js中9種fs模塊文件操作方法(文件夾遞歸刪除知識(shí))
這篇文章主要介紹了總結(jié)Node.js中9種fs模塊文件操作方法(文件夾遞歸刪除知識(shí)),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07
Node中node_modules文件夾及package.json文件的作用說明
這篇文章主要介紹了Node中node_modules文件夾及package.json文件的作用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Node.js應(yīng)用程序遇到了內(nèi)存溢出的問題解決方案
文章介紹了Node.js應(yīng)用程序內(nèi)存溢出的原因,包括內(nèi)存泄漏、大型數(shù)據(jù)集處理、無限循環(huán)或遞歸、并發(fā)問題和外部?jī)?nèi)存分配,文章還提供了優(yōu)化代碼、分批處理數(shù)據(jù)和增加內(nèi)存限制的解決方案,感興趣的朋友跟隨小編一起看看吧2025-01-01
Node連接mysql數(shù)據(jù)庫(kù)方法介紹
本篇文章主要介紹了Node連接mysql數(shù)據(jù)庫(kù)方法介紹。詳細(xì)的介紹了怎樣連接和操作數(shù)據(jù)庫(kù),并舉例說明,有興趣的可以了解一下。2017-02-02
Egret引擎開發(fā)指南之創(chuàng)建項(xiàng)目
Egret Engine(白鷺引擎)是一款使用TypeScript語言構(gòu)建的開源免費(fèi)的移動(dòng)游戲引擎。白鷺引擎的核心定位是開放,高效,優(yōu)雅。通過它,你可以快速地創(chuàng)建HTML5類型的移動(dòng)游戲,也可以將游戲項(xiàng)目編譯輸出成為目標(biāo)移動(dòng)平臺(tái)的原生游戲應(yīng)用。2014-09-09
Node.js和MongoDB實(shí)現(xiàn)簡(jiǎn)單日志分析系統(tǒng)
這篇文章主要介紹了Node.js和MongoDB實(shí)現(xiàn)簡(jiǎn)單日志分析系統(tǒng),本文給出了服務(wù)器端、客戶端、圖表生成、Shell自動(dòng)執(zhí)行等功能的實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-04-04
node.js使用cluster實(shí)現(xiàn)多進(jìn)程
本文給大家詳細(xì)介紹了nodejs使用cluster模塊實(shí)現(xiàn)多進(jìn)程的方法和步奏,非常的細(xì)致全面,有需要的小伙伴可以參考下2016-03-03

