1.nodejs簡介:html
1.Node不是js應用,而是js運行平臺。客戶端js經過瀏覽器和v8引擎聯繫到了一塊兒,服務器端js用Node和v8又牽起了小手,因此說Node是運行平臺,相似於客戶端的瀏覽器。Node採用c++語言編寫,v8引擎也是c++寫的。Node爲神馬用c++寫呢?這是個有趣的故事,詳見《深刻淺出Nodejs》.node
2.模塊機制:c++
2.1.說模塊機制以前,先說下CommonJS.CommonJS是一種規範。根據CommonJS規範,一個單獨的文件就是一個模塊。每個模塊都是一個單獨的做用域,也就是說,在該模塊內部定義的變量,沒法被其餘模塊讀取,也避免了污染全局變量。es6
爲何會有CommonJS規範?由於原來js規範比較薄弱,不利於js大規模應用:主要有如下的缺陷:web
2.1.1:js沒有模塊系統,沒有原生的支持密閉做用域或依賴管理。數據庫
2.1.2:js沒有標準庫,除了核心庫之外,沒有文件系統的API,沒有IO流API.npm
2.1.3:js沒有標準接口,沒有web server 或者數據庫的統一接口。json
2.1.4:js沒有包管理系統,不能自動加載和安裝依賴。瀏覽器
因而乎就有了CommonJS規範,就是爲了解決以上問題,Node.js就是這種規範的實現。Node自身實現了require方法做爲其引入模塊的方法,同時NPM也是基於這種規範。緩存
拓展:說到規範,還有AMD[Asynchronous Module Definition],CMD[Common Module Definition].爲神馬會有AMD,CMD?緣由:
require是同步的。模塊系統須要同步讀取模塊文件內容,並編譯執行以獲得模塊接口。這在服務器端實現很簡單,然而, 想在瀏覽器端實現問題卻不少。
瀏覽器端,加載JavaScript最佳、最容易的方式是在document中插入script 標籤。但腳本標籤天生異步,傳統CommonJS模塊在瀏覽器環境中沒法正常加載。
解決思路之一是,開發一個服務器端組件,對模塊代碼做靜態分析,將模塊與它的依賴列表一塊兒返回給瀏覽器端。 這很好使,但須要服務器安裝額外的組件,並所以要調整一系列底層架構。另外一種解決思路是,用一套標準模板來封裝模塊定義,可是對於模塊應該怎麼定義和怎麼加載,又產生的分歧:因而乎有了AMD CMD.
AMD:
它是一個在瀏覽器端模塊化開發的規範.因爲不是JavaScript原生支持,使用AMD規範進行頁面開發須要用到對應的庫函數---RequireJS.
requireJS主要解決兩個問題:
1.多個js文件可能有依賴關係,被依賴的文件須要早於依賴它的文件加載到瀏覽器
2.js加載的時候瀏覽器會中止頁面渲染,加載文件越多,頁面失去響應時間越長
CMD:CMD規範是國內發展出來的,就像AMD有個requireJS,CMD有個瀏覽器的實現SeaJS,SeaJS要解決的問題和requireJS同樣,只不過在模塊定義方式和模塊加載(能夠說運行、解析)時機上有所不一樣
AMD,CMD區別:
最明顯的區別就是在模塊定義時對依賴的處理不一樣
1.AMD推崇依賴前置,在定義模塊的時候就要聲明其依賴的模塊
2.CMD推崇就近依賴,只有在用到某個模塊的時候再去require
【詳見:http://blog.csdn.net/jackwen110200/article/details/52105493】
2.2模塊的簡單定義及應用:
寫一個circle.js
1 var PI=Math.PI; 2 exports.area=function(r){ 3 return PI*r*r; 4 } 5 exports.zhouchang=function(r){ 6 return 2*PI*r; 7 }
寫一個testCircle.js
1 var circle=require("./circle"); 2 console.log("erea:"+circle.area(1)+"zhouhcang:"+circle.zhouchang(1));
執行結果:
require是導入;exports是導出,內部方法原理是由node自身實現的,在es6以前node導入導出用這兩個實現,es6出現後,export;import成爲主流。
ES6發佈的module並無直接採用CommonJS,甚至連require都沒有采用,也就是說require仍然只是node的一個私有的全局方法,module.exports也只是node私有的一個全局變量屬性。
2.3 模塊的載入策略:
2.3.1:載入內置模塊:
內置模塊被編譯爲二進制形式,引用時直接使用名字而非文件路徑。
1 var http=require("http");
當第三方的模塊和內置模塊同名時,內置模塊將覆蓋第三方同名模塊.
2.3.2:載入文件模塊:
1 var a=require("./a");
實際上文件模塊又分三類:
.js。經過fs模塊同步讀取js文件並編譯執行;
.node。經過c/c++編寫的;
.json。讀取文件,調用jSON.parse解析加載。
另外還有其餘載入模塊方式:載入文件目錄模塊;載入node_modules裏的模塊;自動緩存已載入模塊;
[詳見:http://www.cnblogs.com/snandy/p/3445550.html]
2.4:require方法中的文件查找策略:
優先級:緩存的>原生的模塊>文件模塊;絕對路徑速度>相對路徑速度.
2.5:包結構:
CommonJS爲package.json文件定義了以下一些必須的字段:
name:包名,須要在npm上惟一。
description:包簡介;
version:版本;
bugs:一個能夠提交bug的url地址。
licenses:包所使用的許可證。
dependencies:當前包須要的依賴。這個屬性很重要,npm會經過這個屬性幫忙自動加載依賴的包。
scripts:npm在對包進行安裝或者卸載的時候須要進行一些編譯或者清除的工做,scripts字段的對象指明瞭在進行操做時運行哪些文件,或者執行哪條命令。
若是你完善了本身的js庫,使之實現了標準規範,那麼就能夠在npm上發佈本身的包。
參考內容:http://blog.csdn.net/jackwen110200/article/details/52105493
http://www.cnblogs.com/snandy/p/3445550.html
《深刻淺出Nodejs》