解析Node.js基于模塊和包的代碼部署方式
模塊路徑解析規(guī)則
有經(jīng)驗(yàn)的 C 程序員在編寫(xiě)一個(gè)新程序時(shí)首先從 make 文件寫(xiě)起。同樣的,使用 NodeJS 編寫(xiě)程序前,為了有個(gè)良好的開(kāi)端,首先需要準(zhǔn)備好代碼的目錄結(jié)構(gòu)和部署方式,就如同修房子要先搭腳手架。本章將介紹與之相關(guān)的各種知識(shí)。
模塊路徑解析規(guī)則
我們已經(jīng)知道,require函數(shù)支持斜杠(/)或盤(pán)符(C:)開(kāi)頭的絕對(duì)路徑,也支持./開(kāi)頭的相對(duì)路徑。但這兩種路徑在模塊之間建立了強(qiáng)耦合關(guān)系,一旦某個(gè)模塊文件的存放位置需要變更,使用該模塊的其它模塊的代碼也需要跟著調(diào)整,變得牽一發(fā)動(dòng)全身。因此,require函數(shù)支持第三種形式的路徑,寫(xiě)法類似于foo/bar,并依次按照以下規(guī)則解析路徑,直到找到模塊位置。
內(nèi)置模塊
如果傳遞給 require 函數(shù)的是 NodeJS 內(nèi)置模塊名稱,不做路徑解析,直接返回內(nèi)部模塊的導(dǎo)出對(duì)象,例如 require('fs')。
node_modules 目錄
NodeJS 定義了一個(gè)特殊的 node_modules 目錄用于存放模塊。例如某個(gè)模塊的絕對(duì)路徑是 /home/user/hello.js,在該模塊中使用 require('foo/bar') 方式加載模塊時(shí),則 NodeJS 依次嘗試使用以下路徑。
/home/user/node_modules/foo/bar /home/node_modules/foo/bar /node_modules/foo/bar
NODE_PATH 環(huán)境變量
與 PATH 環(huán)境變量類似,NodeJS 允許通過(guò) NODE_PATH 環(huán)境變量來(lái)指定額外的模塊搜索路徑。NODE_PATH 環(huán)境變量中包含一到多個(gè)目錄路徑,路徑之間在 Linux 下使用:分隔,在 Windows 下使用;分隔。例如定義了以下 NODE_PATH 環(huán)境變量:
NODE_PATH=/home/user/lib:/home/lib
當(dāng)使用 require('foo/bar')的方式加載模塊時(shí),則 NodeJS 依次嘗試以下路徑。
/home/user/lib/foo/bar /home/lib/foo/bar
包
我們已經(jīng)知道了 JS 模塊的基本單位是單個(gè) JS 文件,但復(fù)雜些的模塊往往由多個(gè)子模塊組成。為了便于管理和使用,我們可以把由多個(gè)子模塊組成的大模塊稱做包,并把所有子模塊放在同一個(gè)目錄里。
在組成一個(gè)包的所有子模塊中,需要有一個(gè)入口模塊,入口模塊的導(dǎo)出對(duì)象被作為包的導(dǎo)出對(duì)象。例如有以下目錄結(jié)構(gòu)。
- /home/user/lib/
- cat/
head.js
body.js
main.js
其中 cat 目錄定義了一個(gè)包,其中包含了 3 個(gè)子模塊。main.js 作為入口模塊,其內(nèi)容如下:
var head = require('./head');
var body = require('./body');
exports.create = function (name) {
return {
name: name,
head: head.create(),
body: body.create()
};
};
在其它模塊里使用包的時(shí)候,需要加載包的入口模塊。接著上例,使用 require('/home/user/lib/cat/main')能達(dá)到目的,但是入口模塊名稱出現(xiàn)在路徑里看上去不是個(gè)好主意。因此我們需要做點(diǎn)額外的工作,讓包使用起來(lái)更像是單個(gè)模塊。
index.js
當(dāng)模塊的文件名是 index.js,加載模塊時(shí)可以使用模塊所在目錄的路徑代替模塊文件路徑,因此接著上例,以下兩條語(yǔ)句等價(jià)。
var cat = require('/home/user/lib/cat');
var cat = require('/home/user/lib/cat/index');
這樣處理后,就只需要把包目錄路徑傳遞給 require 函數(shù),感覺(jué)上整個(gè)目錄被當(dāng)作單個(gè)模塊使用,更有整體感。
package.json
如果想自定義入口模塊的文件名和存放位置,就需要在包目錄下包含一個(gè) package.json 文件,并在其中指定入口模塊的路徑。上例中的 cat 模塊可以重構(gòu)如下。
- /home/user/lib/
- cat/
+ doc/
- lib/
head.js
body.js
main.js
+ tests/
package.json
其中package.json內(nèi)容如下。
{
"name": "cat",
"main": "./lib/main.js"
}
如此一來(lái),就同樣可以使用 require('/home/user/lib/cat')的方式加載模塊。NodeJS 會(huì)根據(jù)包目錄下的 package.json 找到入口模塊所在位置。
- 利用OpenVSwitch在多臺(tái)主機(jī)上部署Docker的教程
- 在Docker上開(kāi)始部署Python應(yīng)用的教程
- 在Docker上部署Python的Flask框架的教程
- 在Docker中自動(dòng)化部署Ruby on Rails的教程
- 使用Docker來(lái)加速構(gòu)建Android應(yīng)用的基本部署思路解析
- 基于NodeJS的前后端分離的思考與實(shí)踐(六)Nginx + Node.js + Java 的軟件棧部署實(shí)踐
- 教你在heroku云平臺(tái)上部署Node.js應(yīng)用
- 一行命令搞定node.js 版本升級(jí)
- 跟我學(xué)Nodejs(一)--- Node.js簡(jiǎn)介及安裝開(kāi)發(fā)環(huán)境
- 在Docker快速部署Node.js應(yīng)用的詳細(xì)步驟
相關(guān)文章
詳解使用Visual Studio Code對(duì)Node.js進(jìn)行斷點(diǎn)調(diào)試
這篇文章主要介紹了詳解使用Visual Studio Code對(duì)Node.js進(jìn)行斷點(diǎn)調(diào)試,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
node.js中的console.log方法使用說(shuō)明
這篇文章主要介紹了node.js中的console.log方法使用說(shuō)明,本文介紹了console.log的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12
Node.js Buffer模塊功能及常用方法實(shí)例分析
這篇文章主要介紹了Node.js Buffer模塊功能及常用方法,結(jié)合實(shí)例形式分析了Buffer模塊的各種常用函數(shù)及相關(guān)使用技巧,需要的朋友可以參考下2019-01-01
Nodejs中的計(jì)時(shí)器(setTimeout?setIntervals?etImmediate)使用案例解析
這篇文章主要介紹了Nodejs中的計(jì)時(shí)器(setTimeout?setIntervals?etImmediate)使用案例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
node作為中間服務(wù)層如何發(fā)送請(qǐng)求(發(fā)送請(qǐng)求的實(shí)現(xiàn)方法詳解)
node作為中間服務(wù)層如何發(fā)送請(qǐng)求?下面小編就為大家分享一下發(fā)送請(qǐng)求的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2018-01-01
Node.js 實(shí)現(xiàn)簡(jiǎn)單小說(shuō)爬蟲(chóng)實(shí)例
現(xiàn)在爬蟲(chóng)在很多web項(xiàng)目中都有應(yīng)用,這篇文章主要介紹了Node.js 實(shí)現(xiàn)簡(jiǎn)單小說(shuō)爬蟲(chóng)實(shí)例,有興趣的可以了解一下。2016-11-11

