使用nodejs也有很長一段的時(shí)間了琳骡,但卻感覺自己并沒有太多的積累澳盐。有時(shí)候會問自己祈纯,“你學(xué)了這么久了,比起初學(xué)者你強(qiáng)在哪呢叼耙?”
或許只是幾個常用的API調(diào)用的更熟練一些吧腕窥。學(xué)習(xí)的路上還是要腳踏實(shí)地,穩(wěn)步前進(jìn)筛婉。
nodejs中簇爆,加載一個模塊通過require()
方法,例如require('fs')
爽撒。這個方法接受模塊的標(biāo)識符入蛆,可以加載的模塊分為3種:
- node提供的核心模塊。
- 路徑形式的文件模塊
- 自定義模塊
核心模塊在node源代碼的編譯過程中已經(jīng)編譯為二進(jìn)制代碼硕勿,加載速度最快哨毁。加載文件模塊時(shí),標(biāo)識符是一個可以省略文件后綴名的文件路徑源武。node根據(jù)標(biāo)識符中的路徑查找文件扼褪,如果文件后綴名省略想幻,node會依次嘗試.js
, .json
, .node
,每一種后綴名都對應(yīng)一種不同的加載方式话浇。通過require.extensions
可以看到已有的文件加載方式脏毯,也可以自定義指定格式的加載方式。比如下面的代碼定義了.txt
文件的加載方式凳枝。
require.extensions['.txt'] = function (module, filename) {
var fs = require('fs')
var res = fs.readFileSync(filename)
module.exports = res.toString()
}
加載自定義模塊的標(biāo)識符與核心模塊的類似抄沮,不過核心模塊具有更高的優(yōu)先級。所以自定義模塊不能與核心模塊重名岖瑰。在加載自定義模塊時(shí)叛买,會依次查找當(dāng)前目錄下的node_modules
,父目錄下的node_modules
蹋订,……率挣,根目錄下的node_modules
。通過module.paths
查看所有需要查找的路徑露戒。
require()
不僅可以加載文件椒功,還可以加載一個包,即通過標(biāo)識符查找到的是一個目錄智什。它會加載該目錄下package.json
中main
指定的文件动漾。如果加載失敗,則繼續(xù)查找目錄下的index
荠锭,即index.js
, index.json
, index.node
被加載后的文件會被緩存旱眯,再次加載時(shí)文件不會再次執(zhí)行,而是從緩存中讀取证九。已經(jīng)緩存的文件可以通過require.cache
查看删豺。也可以在此處刪除緩存。
在加載模塊時(shí)愧怜,node會向模塊提供幾個變量呀页,exports
, module
, require
, __dirname
, __filename
。其中exports
, module
, require
為模塊提供加載模塊拥坛,導(dǎo)出內(nèi)容的功能蓬蝶,__dirname
為當(dāng)前文件所在目錄的絕對路徑,__filename
為當(dāng)前文件的絕對路徑