nodejs從0到1(Node簡介+模塊機制)

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》

相關文章
相關標籤/搜索