Node.js中的模塊路徑解析規(guī)則和子模塊包
Node.js 是一個(gè)基于Google V8引擎建立的一個(gè)平臺(tái), 用來方便地搭建快速、易于擴(kuò)展的網(wǎng)絡(luò)應(yīng)用。第一版由Ryan Dahl于2009年2月發(fā)布,之后獲得了迅猛的發(fā)展,截止至2014年3月,雖然版本仍未到1.0正式版,但已經(jīng)在商業(yè)環(huán)境中得到很多應(yīng)用。
對(duì)于開發(fā)者來說,NodeJS有很多吸引人的特性,如事件驅(qū)動(dòng)、異步編程、無(wú)阻塞IO,這些特性為它帶來了高效的性能和更少的代碼,因此受到眾多開發(fā)者青睞。
有經(jīng)驗(yàn)的C程序員在編寫一個(gè)新程序時(shí)首先從make文件寫起。同樣的,使用NodeJS編寫程序前,為了有個(gè)良好的開端,首先需要準(zhǔn)備好代碼的目錄結(jié)構(gòu)和部署方式,就如同修房子要先搭腳手架。
模塊路徑解析規(guī)則
require
函數(shù)支持斜杠(/
)或盤符(C:
)開頭的絕對(duì)路徑,也支持./
開頭的相對(duì)路徑。但這兩種路徑在模塊之間建立了強(qiáng)耦合關(guān)系,一旦某個(gè)模塊文件的存放位置需要變更,使用該模塊的其它模塊的代碼也需要跟著調(diào)整,變得牽一發(fā)動(dòng)全身。因此,require
函數(shù)支持第三種形式的路徑,寫法類似于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允許通過NODE_PATH環(huán)境變量來指定額外的模塊搜索路徑。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
包(package)
我們已經(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)額外的工作,讓包使用起來更像是單個(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ù),感覺上整個(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" }
如此一來,就同樣可以使用require('/home/user/lib/cat')
的方式加載模塊。NodeJS會(huì)根據(jù)包目錄下的package.json
找到入口模塊所在位置。
到此這篇關(guān)于Node.js中的模塊路徑解析規(guī)則和子模塊包的文章就介紹到這了,更多相關(guān)Node.js的模塊路徑和子模塊包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHPStorm中如何對(duì)nodejs項(xiàng)目進(jìn)行單元測(cè)試詳解
這篇文章主要給大家介紹了關(guān)于PHPStorm中如何對(duì)nodejs項(xiàng)目進(jìn)行單元測(cè)試的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02Node Mongoose用法詳解【Mongoose使用、Schema、對(duì)象、model文檔等】
這篇文章主要介紹了Node Mongoose用法,結(jié)合實(shí)例形式分析了Mongoose使用、Schema、對(duì)象、model文檔等基本原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-05-05Node.js如何優(yōu)雅的封裝一個(gè)實(shí)用函數(shù)的npm包的方法
這篇文章主要介紹了Node.js如何優(yōu)雅的封裝一個(gè)實(shí)用函數(shù)的npm包的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04使用 Node.js 實(shí)現(xiàn)圖片的動(dòng)態(tài)裁切及算法實(shí)例代碼詳解
這篇文章主要介紹了使用 Node.js 實(shí)現(xiàn)圖片的動(dòng)態(tài)裁切功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09node.js+jQuery實(shí)現(xiàn)用戶登錄注冊(cè)AJAX交互
本篇文章主要介紹了用Node.js當(dāng)作后臺(tái)、jQuery寫前臺(tái)AJAX代碼實(shí)現(xiàn)用戶登錄和注冊(cè)的功能的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-04-04nestjs中異常過濾器Exceptionfilter的具體使用
這篇文章主要介紹了nestjs中異常過濾器Exceptionfilter的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02node自定義安裝更改npm全局模塊默認(rèn)安裝路徑的步驟
有段時(shí)間沒用npm了,新建個(gè)項(xiàng)目,需要改變npm全局包默認(rèn)安裝的路徑,本文就來介紹一下node自定義安裝更改npm全局模塊默認(rèn)安裝路徑的步驟,感興趣的可以了解下2021-09-09