node.js中module模塊的功能理解與用法實(shí)例分析
本文實(shí)例講述了node.js中module模塊的功能理解與用法。分享給大家供大家參考,具體如下:
node.js中使用CommonJS規(guī)范實(shí)現(xiàn)模塊功能,一個(gè)單獨(dú)的文件就是一個(gè)單獨(dú)的模塊。通過require方法實(shí)現(xiàn)模塊間的依賴管理。
通過require加載模塊,是同步操作。
加載流程如下:
1、找到需要加載的模塊文件。
2、判斷是否緩存過,如果沒有,則讀取模塊文件的內(nèi)容。
3、把讀取到的內(nèi)容,封裝在一個(gè)函數(shù)里運(yùn)行。
(function (exports, require, module, __filename, __dirname) {
//模塊的代碼實(shí)際上在這里
});
4、返回 module.exports 需要導(dǎo)出的內(nèi)容。
exports 表示模塊的導(dǎo)出對象
require 表示require方法
module 表示當(dāng)前模塊對象
__filename 表示當(dāng)前文件的絕對路徑
__dirname 表示當(dāng)前文件夾的絕對路徑
在模塊的內(nèi)部,this 指向的是 當(dāng)前模塊的導(dǎo)出對象
console.log(this === module.exports); console.log(this === exports);
module對象有不少屬性,可以打印出來看看。
console.log(module);
module.id 表示模塊的標(biāo)識符。
module.exports 表示模塊的導(dǎo)出對象。
module.parent 表示當(dāng)前模塊的父模塊,當(dāng)前模塊是誰加載的。
module.filename 表示模塊的絕對路徑。
module.loaded 表示是否加載完成。
module.children 表示當(dāng)前模塊加載了哪些模塊。
module.paths 表示模塊的搜索路徑,路徑的多少取決于目錄的深度。
node.js通過require方法加載文件是同步的,為了提高效率,會緩存已經(jīng)加載過的文件。
console.log(require.cache);
緩存的key是模塊的絕對路徑,value是module對象。
require.resolve獲取模塊的絕對路徑,但并不會加載模塊。
console.log(require.resolve('./01.js'));
require.main獲取入口模塊
console.log(require.main);
require.extensions獲取模塊支持的擴(kuò)展名
node.js中模塊文件分三種:
1、.js模塊
2、.json文件模塊
3、.node C++擴(kuò)展二進(jìn)制模塊
console.log(require.extensions);
node.js通過require加載文件時(shí),比如 require('./user') 會先找 user 文件,然后沒找到,再找 user.js,再找 user.json,再找 user.node。
node.js的模塊分類:
1、核心模塊,編譯二進(jìn)制,加載速度最快,像 fs,http,events等。
2、文件模塊,保存在硬盤上,加載速度比較慢,通過名稱或路徑來加載。
3、第三方模塊,只指定名稱則從node_modules目錄下加載,查詢的路徑包括module.paths和全局目錄。
全局目錄:
windows中:環(huán)境變量NODE_PATH指定的路徑。
linux中:$HOME/.node_modules和$HOME/.node_libraries目錄
文件模塊查找的規(guī)則,比如 require('./user') :
1、判斷加載的文件是否以絕對路徑加載的。
2、如果是絕對路徑,則直接加載絕對路徑的文件。
3、如果不是,判斷文件有沒有以 './' ,'../' 開頭,如果有則找到該相對路徑,如果沒有則通過modules.paths和全局目錄獲取路徑。
4、嘗試在第3步中的路徑下查找 user 文件。
5、如果沒有找到,則嘗試加擴(kuò)展名( user.js,user.json,user.node)進(jìn)行查找。
6、如果還沒有,嘗試根據(jù)包進(jìn)行查找,user 目錄下,包文件描述 package.json 中 main 配置的文件進(jìn)行加載。
7、如果沒有 package.json,則查找 user 目錄下, index.js 和 index.node。
8、如果還沒有,則找下一個(gè)modules.paths。
9、最后還是沒有找到,則文件加載失敗。
希望本文所述對大家node.js程序設(shè)計(jì)有所幫助。
相關(guān)文章
使用NVM實(shí)現(xiàn)不同nodejs版本的自由切換
在工作中,我們可能需要同時(shí)進(jìn)行多個(gè)不同NodeJS版本的項(xiàng)目開發(fā),這種情況下,對于維護(hù)多個(gè)版本的node將會是一件非常麻煩的事情,NVM就是為解決這個(gè)問題而產(chǎn)生的,本文給出了下載、安裝及使用方法,需要的朋友可以參考下2024-02-02
理解nodejs的stream和pipe機(jī)制的原理和實(shí)現(xiàn)
本篇文章主要介紹了理解nodejs的stream和pipe機(jī)制的原理和實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
node.js中的模塊化標(biāo)準(zhǔn)CommonJS與自定義模塊
這篇文章介紹了node.js中的模塊化標(biāo)準(zhǔn)CommonJS與自定義模塊,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
nodejs服務(wù)內(nèi)存泄露排查過程和優(yōu)化方法
在開發(fā)和部署Node.js應(yīng)用程序時(shí),內(nèi)存泄露是一個(gè)常見的挑戰(zhàn),本文將探討如何對于一個(gè)陌生項(xiàng)目進(jìn)行內(nèi)存排查和優(yōu)化的方法,文章通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
node.js利用express自動搭建項(xiàng)目的全過程
這篇文章主要給大家介紹了關(guān)于node.js利用express自動搭建項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
node基于express框架操作Mysql數(shù)據(jù)庫的步驟
這篇文章主要介紹了node基于express框架操作Mysql數(shù)據(jù)庫的步驟,文章給大家提到安裝mysql模塊和配置mysql模塊的步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03

