這部分主要總結深刻淺出Node.js的第二章 javascript
一)CommonJsjava
1.1CommonJs模塊定義node
二)Node的模塊實現json
2.1模塊分類後端
2.2.2 文件定位服務器
2.3 模塊編譯函數
一) CommonJs 在CommonJs的官網上寫着這樣一句話 javascript:not just for browsers any more CommonJs是一種規範,它涵蓋了模塊.二進制.Buffer.文件系統.包管理等,node就是借鑑了CommonJs的Modules規範實現了一套很是易用的模塊系統
1.1 CommonJs模塊的定義 主要分模塊引用.模塊定義.模塊標識 CommonJs的模塊導入導出機制可使用戶沒必要考慮變量污染等問題
/*模塊引入*/
var math = require("math"); /*模塊標識 傳遞給require的參數*/ /*模塊定義*/ exports.add = function(a,b) { return a + b; }
二)Node的模塊實現 在Node中對規範進行了必定的取捨,也增長了必定自身須要的特性 node中引入模塊主要分爲3個步驟
2.1 Node中的模塊分類 在node中模塊分爲兩類 Node提供的模塊,核心模塊. 用戶編寫的模塊,文件模塊
不管是核心仍是文件模塊 Node都會採用緩存優先的策略,不一樣於瀏覽器中緩存的是文件,Node中緩存的是編譯和執行以後的對象
2.2.1 路徑分析 node中根據require()中傳入的標識符,來進行模塊的查找和定位,對不一樣類型的標識符查找定位的方式會有一些區別 標識符只要分爲下面幾類
2.3 模塊編譯 在node中文件模塊都是對象.相似下面的定義 在定位到具體的文件後,node會建立一個模塊對象,而後載入和編譯
function Module(id,parent) { this.id = id; this.exports = {}; this.parent = parent; if(parent && parent.children) { parent.children.push(this); } this.filename = null; this.loaded = false; this.children = []; }
在引入模塊的時候,對不一樣擴展名的文件node的載入方式也不一樣
在編譯的過程當中,node會對獲取到的內容進行封裝 相似於下面的樣子
(function(exports,require,module,__filename,__dirname){ /** * 你的js代碼 */ })
這樣模塊之間就進行了做用域的隔離 而後經過vm原生模塊的runInThisContext()方法執行返回一個function對象 而後將以前的模塊對象的exports,require()方法,module,文件路徑等信息傳入給函數執行,執行以後將exports屬性返回給調用方,而且將編譯後的結果根據路徑索引緩存到Module._cache上
簡單理解就是exports是module.exports的引用 具體看 exports和module.exports的區別
define(id?,dependencies?,factory)
這裏的factory就是實際代碼的內容 在AMD中須要顯示的定義一個模塊,在node中這個過程是隱式包裝
;(function(name,definition){ var hasDefine = typeof define === 'define', hasExports = typeof module !== 'undefined' && module.exports; if(hasDefine) { //AMD CMD define(definition); } else if(hasExports){ //node環境 module.exports = definition() } else { //掛在在window this[name] = definition(); } })(name,function(){ var obj = {}; retuen obj; });