Node was installed at
/usr/local/bin/node
npm was installed at
/usr/local/bin/npm
Make sure that /usr/local/bin is in your $PATH.
node:硬件V8,軟件語言JS。
異步I/O:效率提高,使用回調函數。
node是高性能的單線程的跨平臺的。適合I/O(異步)密集和cpu密集型場景(V8)。
B/S ,C/S:聯系阿里思考。
使用require()方法引入模塊,模塊標識:小駝峰字符串或者以·或··開頭的相對路徑,或者/開頭的絕對路徑。模塊:核心模塊,文件模塊。
文件模塊:路徑分析,文件定位,編譯執(zhí)行。
對于核心模塊:不用文件定位和編譯執(zhí)行,在node源代碼編譯已經完。而且對于任何模塊都有一個相當于是瀏覽器緩存的概念。
優(yōu)先級:緩存》核心》路徑》自定義模塊
文件定位:可以不要擴展名。
編譯的時候對于不同類型的文件編譯方式不一樣。.js,.json,.node三種,其他文件當做.js處理。
require,exports,module三個關鍵字!
http://blog.csdn.net/cike110120/article/details/12753253
http://www.2cto.com/kf/201401/274825.html
然后是不同語言的編譯:JS,C/C++。
JS:node會對代碼進行包裝,加上必須要的一些屬性,所以也就造成了exports和module.exports共存的情況,實際上兩者的值大多數情況是相同的。
c++執(zhí)行效率更高,但是編程門檻高,這里不多做介紹。
json文件最簡單,json.parse一個方法即可。
JS代碼:首先是轉化為C++代碼,然后編譯JS核心模塊。node的常見方式之一就是C++完成核心,JS實現封裝。node這種復合模式的優(yōu)勢得到體現。node的核心內建模塊都是由C++編寫的。內建模塊(C++)——→核心模塊(JS)—→文件模塊(用戶自定義)
C++在運算方面的效率比JS效率高太多了,所以我們很多時候需要寫C++擴展模塊.node文件,值得注意的是,各個平臺下的.node文件編譯出來是不一樣的,需要重新編譯。P28頁圖是不同平臺的詳細編譯過程。
C++擴展工具:GYP項目生成工具,V8引擎C++庫,libuv庫,node內部庫。
接下來是第三方模塊,包和NPM是將各種模塊聯系在一起的一種機制。PS:require是這之中很關鍵的方法。包就是一個存檔文件,里面有關于這個包得各種信息。這里不想追究太深。NPM可以理解為node的一種工具,gem和ruby,pear和php一樣的關系。目前NPM已經是一個共享平臺。到這里NODE規(guī)范就不看啦。
異步I/O:產生的原因就是比如PHP這種同步阻塞的語言在復雜的環(huán)境中不能很好的并發(fā),用戶體驗就不好了。從M+N到max(M,N)的進化,有一句話,只有后端快速響應,前端體驗才能更好。
一個關鍵詞:輪詢。
輪詢的方式:
read→select→poll→epoll
linux原生:AIO支持面太小,不能利用系統緩存。
NODE的異步I/O的實現:事件循環(huán),tick,觀察者。類比與飯館的流程:廚房,服務員,客戶。
windows:IOCP,請求對象,
一些異步API:setTimeout,setInterval,setImmediate和process.nextTick
異步編程:函數式編程:高階函數:把別的函數作為自己函數的參數類似于f(f(x)).
偏函數用法。
優(yōu)點:異步,V8基礎上性能十分優(yōu)越。
缺點:
1,異常處理上,由于是異步的,所以在出現異常的情況下,難以解決,這里有兩個原則,
1,必須執(zhí)行調用者傳入的回調函數。2,正確傳遞回異常供調用者判斷。
2,函數嵌套過深。
3,阻塞代碼
4,多線程編程
5,異步轉同步。
4.3解決方案:為了解決上面的五個問題,下面介紹一些解決方案。
1事件監(jiān)聽模式:events模塊,監(jiān)聽模式本身沒有異步同步的問題,只是發(fā)布調用多是伴隨事件循環(huán)異步觸發(fā),所以廣泛應用于異步編程。