NodeJS的模組原理
最近一直在使用Node JS,在網上看到了一段程式碼我覺得完美的詮釋了Node JS模組載入的原理,其實深究下去,它還詮釋了許多東西:Js模組化程式設計、閉包的真正強大之處等等。閒話不說,先看看這段程式碼:
// - hello.js
void function() {
var mapping = {}, cache = {};
window.define = function(id, func) {
mapping[id] = func
};
window.require = function(id) {
if (!/\.js$/.test(id)) {
id += ".js"
}
if (cache[id]) {
return cache[id]
} else {
return cache[id] = mapping[id]()
}
}
}();
define("js/module/hello.js", function(exports) {
exports = {}; var name = 'Hello Module'
exports.sayHi = function() {
alert("Hi, this is "+ name +" !")
};
return exports
});
// - main.js
var hello = require('js/module/hello');
hello.sayHi();
我稍微改寫了一點程式碼,為了能看得更清楚一些,這段程式碼在全域性物件window上繫結了兩個方法:define和require,寫過Node程式碼的人肯定不會陌生,當我需要一個模組的時候,就會使用require來載入它,可能是原生模組例如http, express等,也可能是自己寫的Js檔案模組用相對路徑載入。Node在實現模組載入的時候,就會使用優先本地查詢node_modules目錄,然後一層層往上找,最後再按環境變數在安裝node的目錄執行全域性模組查詢,PS:
自己寫的業務模組一般都使用相對路徑require('./business')來查詢。當Node找到模組之後,第一次載入會比較緩慢,但是一旦載入就會快取起來,類似我們這裡做的cache和map的作用,再查詢就會快很多。所以Node使用require載入模組第一次是阻塞式的,快取之後就應該是非同步非阻塞式的。
我們之所以可以通過require實現Js的模組化程式設計,完全得益於閉包的存在。閉包可以使得我們在傳遞函式呼叫結束,返回函式物件之後,依然可以訪問其中的區域性變數,就像例子中的name一樣,假如它是一個資料庫Connection物件,或者是一個業務Service物件,那麼通過exports,就可以在其他Js檔案中使用它並且程式碼從檔案上是完全隔離的。
這個例子還說明,不止是在服務端,即使在瀏覽器客戶端,我們同樣可以學習Node的原理,做Js的模組化程式設計,當然這也具體要看專案的複雜程度,並非適用所有場景。
相關文章
- 概述nodejs模組系統核心原理NodeJS
- nodejs 模組的流程NodeJS
- nodejs的stream模組NodeJS
- Nodejs 的 fs 模組NodeJS
- Nodejs教程10:Nodejs的模組化NodeJS
- Nodejs中的stream模組NodeJS
- nodeJs的模組依賴NodeJS
- 理解nodejs模組的scopeNodeJS
- nodejs模組整理NodeJS
- [NodeJs系列]NodeJs模組機制NodeJS
- 【nodejs原理&原始碼賞析(5)】net模組與通訊的實現NodeJS原始碼
- nodejs新建模組,釋出模組NodeJS
- nodejs之-fs模組NodeJS
- nodejs request模組用法NodeJS
- NodeJS之path模組NodeJS
- Nodejs 模組機制NodeJS
- 淺度理解NodeJS的HTTP模組NodeJSHTTP
- nodejs的require模組及路徑NodeJSUI
- nodeJs流的使用及原理NodeJS
- Nodejs如何呼叫Dll模組NodeJS
- 深聊Nodejs模組化NodeJS
- NodeJs VM模組詳解NodeJS
- nodejs主要模組介紹NodeJS
- Nodejs cluster 模組深入探究NodeJS
- Node加密模組bcrypt nodejs加密NodeJS
- nodejs 日誌模組 winston 的使用NodeJS
- 深入理解nodejs Stream模組NodeJS
- nodejs筆記-模組機制NodeJS筆記
- nodejs常用核心模組介紹NodeJS
- 說說Nodejs高併發的原理NodeJS
- Nodejs核心模組之net和httpNodeJSHTTP
- Nodejs教程11:assert(斷言)模組NodeJS
- Nodejs教程12:path(路徑)模組NodeJS
- nodejs學習心得(三)fs模組NodeJS
- NodeJS Events模組原始碼學習NodeJS原始碼
- NodeJS Cluster模組原始碼學習NodeJS原始碼
- nodejs模組載入分析(1).mdNodeJS
- nodejs檢查已安裝模組NodeJS