最近寫的文章收到許多朋友的反饋,感謝你們的支持和建議,讓我對堅持寫博客充滿熱情,一個月一篇文章確實有點少,因此之後盡力多作分享,作好的分享,但願能對朋友們有用。html
到新公司的這段時間學到了不少新東西,有好多東西須要去總結去探索,不過事情得一件一件來,今天我們先從Node開始。注:之後出現的Node即node.js。前端
先搞點前戲熱熱場 - 爲何寫這篇文章:node
1.前段時間單位有新項目啓動,服務端要作的工做很少也不算麻煩,就是處理一些中間層的服務,並且咱們團隊裏面個個都會JavaScript,領導就決定試試服務器端的JavaScript,結果本人有幸被派去研究了幾天Node,懷着雞凍的心情開始了node.js的篇章,這篇文章也就是爲這幾天研究的總結。linux
2.一個JavaScript工程師若是沒聽過node.js那麼我想你是否是錯過了什麼,每一個優秀的前端工程師都有必要去了解後臺處理流程,那麼若是又能從JavaScript出發,豈不是一件很美妙的事麼。git
3.互聯網的火熱使得JavaScript風光無限,且服務端的JavaScript也並非什麼新技術了,相關的框架也有很多,只是node.js的成功讓他爆發式的出如今咱們的視線中,讓不少前端工程師看到了從前端寫到後端的另外一種實現但願。注:node.js 是一個容許開發人員使用 JavaScript 語言編寫服務器端代碼的框架。程序員
4.今年8月曾在某大公司最後一輪(第五輪)的面試被問到Node.js的問題,相對應的回答那是至關之糟糕,結果怎樣大家懂的,感受這個問題是致使沒有經過的關鍵點之一...那家公司是我在讀大學的時候就無比嚮往的公司,如今回想起那次經歷和過程,談不上可惜,畢竟我真的盡力了 - 其實這篇文章更多的也是爲了完成本身一個小小的心結...好吧,又扯遠了。web
5.歡迎各類轉載,不過請註明出處,謝謝。
面試
Node是個啥?redis
寫個東西仍是儘可能面面俱到吧,因此有關基本概念的東西我也從網上選擇性的拿了些下來,有些地方針對本身的理解有所改動,對這些概念性的東西有過了解的可選擇跳過這段。chrome
1.Node 是一個服務器端 JavaScript 解釋器,但是真的覺得JavaScript不錯的同窗學習Node就能輕鬆拿下,那麼你就錯了,總結:水深不深我還不知道,不過確實不淺。
2.Node 的目標是幫助程序員構建高度可伸縮的應用程序,編寫可以處理數萬條同時鏈接到一個物理機的鏈接代碼。處理高併發和異步I/O是Node受到開發人員的關注的緣由之一。
3.Node 自己運行Google V8 JavaScript引擎,因此速度和性能很是好,看chrome就知道,並且Node對其封裝的同時還改進了其處理二進制數據的能力。所以,Node不只僅簡單的使用了V8,還對其進行了優化,使其在各類環境下更加給力。(什麼是V8 JavaScript 引擎?請「百度知道」)
4.第三方的擴展和模塊在Node的使用中起到重要的做用。下面也會介紹下載npm,npm就是模塊的管理工具,用它安裝各類 Node 的軟件包(如express,redis等)併發布本身爲Node寫的軟件包 。
安裝Node
在這簡單說說在window7和linux兩種環境下安裝Node。安裝的時候必定要注意Python的版本,屢次由於Python版本的問題安裝失敗,建議2.6+的版本,低版本會出現Node安裝錯誤,查詢Python版本可在終端中輸入:pyhton -v
1.先介紹linux下的安裝吧,Node在Linux環境下的安裝和使用都很是方便,建議在Linux下運行Node,^_^...我使用的是Ubuntu11.04
a.安裝依賴包:50-100kb/s大概每一個包一分鐘就能下載安裝完成
sudo apt- install g++ curl libssl-dev apache2-utils sudo apt- install git-core
b.在終端一步步運行一下命令:
git clone git: cd node ./configure make sudo make install
安裝順利的話到這一步Node就算安裝成功了,2M的網絡用了共計12分鐘。
注:若是不用git下載也能夠直接下載源碼,不過這樣下載安裝須要注意Node版本問題。使用git下載安裝是最方便的,因此推薦之。
2.在Windows下使用Cygwin安裝Node,這個方式不太推薦,由於真的須要較長時間和較好的人品。個人系統是 win7旗艦版
Cygwin是一個在windows平臺上運行的unix模擬環境,下載地址:http://cygwin.com/setup.exe。
下載好Cygwin後開始安裝,步驟:
a.選擇下載的來源 - Install from Internet
b.選擇下載安裝的根目錄
c.選擇下載文件所存放的目錄
d.選擇鏈接的方式
e.選擇下載的網站 - http://mirrors.163.com/cygwin
f.麻煩就麻煩在這步,考驗人品的時候到了。須要的下載安裝時間不肯定,反正須要比較長的時間(超過20分鐘),偶爾會出現安裝失敗的狀況。單擊一下各個程序包前面的旋轉箭頭圖標選擇你想要的版本,選中時會出現了"x"號表示已經選中了該程序包。選擇須要下載的程序包:
Devel包: gcc-g++: C++ compiler gcc-mingw-g++: Mingw32 support headers and libraries GCC C++ gcc4-g++: G++ subpackage git: Fast Version Control System – core files make: The GNU version of the ‘make’ utility openssl-devel: The OpenSSL development environment pkg-config: A utility used to retrieve information about installed libraries zlib-devel: The zlib compression/decompression library (development) Editor包:vim: Vi IMproved – enhanced vi editor Python包:把Default切換成install狀態便可 Web包: wget: Utility to retrieve files the WWW via HTTP and FTP curl: Multi-protocol file transfer command-line tool
上個截圖,如下載zlib-devel爲例:
其上幾步走完纔算把環境搭建完成,但是如今尚未到安裝Node,還須要在Cywgin的ASH模式下執行rebaseall,步驟以下:
a. cmd命令行
b. 進入cygwin安裝目錄下的bin子目錄
c. 運行ash進入shell模式
d. ./rebaseall -v
e. 沒有錯誤就關閉命令行窗口
好了,如今到下載安裝Node了,啓動Cygwin.exe後輸入:
$ wget http: $ tar xf node-v0..tar.gz $ cd node-v0. $ ./configure $ make $ make install
3.直接下載node.exe文件
nodejs.org下載較慢因此我在網盤上傳了一個,下載地址:http://www.everbox.com/f/VhyL6EiGF5Lm3ZSRx85caFDIA5
據說有不太穩定的問題,不過你假如只是想先在windows下了解Node,我的感受這個方法比你裝個Cygwin好不少。
注:本來不太想寫安裝Node這段,但是爲了這篇文章的全面性仍是寫了,沒想到一寫就是那麼長一段了...茶几了
「Hello World」 - 爲何每次見到這句心情都會小激動,不解...
首先,建立個hello.js的文件,在文件中copy以下代碼:
http = require('http'); http.createServer( (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, "127.0.0.1"); console.log('Server running at http://127.0.0.1:1337/');
代碼邏輯:
a. 全局方法require()是用來導入模塊的,通常直接把 require() 方法的返回值賦值給一個變量,在 JavaScript 代碼中直接使用此變量便可 。require("http") 就是加載系統預置的 http 模塊
b. http.createServer 是模塊的方法,目的就是建立並返回一個新的web server對象,而且給服務綁定一個回調,用以處理請求。
c. 經過 http.listen() 方法就可讓該 HTTP 服務器在特定端口監聽。
d. console.log就不用多說了,瞭解firebug的都應該知道,Node實現了這個方法。
注: 想了解具體細節請查看文檔 cnodejs.org/cman/all.html#http.createServer
接着運行Node服務器,執行hello.js代碼,成功啓動會看見console.log()中的文本。有圖有真相:
npm的下載和使用
除Node自己提供的API外,如今有很多第三方模塊可極大的提升開發效率,npm就是Node的軟件包管理器,能夠用它安裝所需軟件包併發布本身爲nodejs寫的軟件包。官網地址:npmjs.org
安裝只須要在終端寫入一行代碼:
curl http://npmjs.org/install.sh | sh
npm安裝node擴展包一樣是一行代碼:
npm install <包名> //例:npm install express
注:若是安裝模塊的過程當中報域名錯誤的話,請清空緩存 >npm cache clean 或重啓計算機便可。
理解Node的模塊概念
在Node中,不一樣的功能組件被劃分紅不一樣的模塊。應用能夠根據本身的須要來選擇使用合適的模塊。每一個模塊都會暴露一些公共的方法或屬性。模塊的使用者直接使用這些方法或屬性便可,對於內部的實現細節就能夠不用瞭解。除了Node自己提供的API外,開發人員也能夠利用這個機制來將應用拆分紅多個模塊,以提升代碼的可複用性。
1.如何使用模塊?
在Node中使用模塊是很是方便的,在 JavaScript 代碼中能夠直接使用全局函數 require() 來加載一個模塊。
在剛剛」Hello World"的例子中,require("http") 能夠加載系統預置的 http 模塊;模塊名稱以 "./" 開始的,如 require("./myModule.js") 用來加載與當前 JavaScript 文件同一目錄下的 myModule.js 模塊。
2.本身如何開發模塊?
剛剛介紹使用require()導入模塊的時候,模塊名稱以 "./" 開始的這種,就是本身開發的模塊文件。須要注意的就是JS文件的系統路徑。
代碼中封裝了模塊的內部處理邏輯,一個模塊通常都會暴露一些公開的方法或屬性給其餘的人使用。模塊的內部代碼須要把這些方法或屬性給暴露出來。
3.來一套簡單的例子。先建立一個模塊文件如myModule.js,就一行代碼
console.log('Hi Darren.')
而後建立一個test.js文件,導入這個JS文件,執行node看到結果
如今Node社區中已有很多第三方的模塊,但願能有更多人經過學習Node,加入到這個你們庭中,爲Node社區來添磚加瓦。先謝謝之,我們繼續。
4.來一個深點的例子。這個例子中將會針對 私有和共有 進行介紹。先建立一個myModule.js,代碼以下:
name = "Darren"; .location = "Beijing"; .showLog = (){ console.log('Hi Darren.') };
代碼中出現了三種類型,分別是: 私用屬性,共有屬性和共有方法,再建立一個test.js,執行Node
結果高亮的地方很清楚的告訴咱們,私有方法咱們在模塊之外是取不到的,因此是undefined。共有屬性和共有方法的聲明須要在前面加上 this 關鍵字。
Node能作什麼和它的優點
Node核心思想: 1.非阻塞; 2.單線程; 3.事件驅動。
在目前的web應用中,客戶端和服務器端之間有些交互能夠認爲是基於事件的,那麼AJAX就是頁面及時響應的關鍵。每次發送一個請求時(無論請求的數據多麼小),都會在網絡裏走一個來回。服務器必須針對這個請求做出響應,一般是開闢一個新的進程。那麼越多用戶訪問這個頁面,所發起的請求個數就會愈來愈多,就會出現內存溢出、邏輯交錯帶來的衝突、網絡癱瘓、系統崩潰這些問題。
Node的目標是提供一種構建可伸縮的網絡應用的方案,在hello world例子中,服務器能夠同時處理不少客戶端鏈接。
Node和操做系統有一種約定,若是建立了新的連接,操做系統就將通知Node,而後進入休眠。若是有人建立了新的連接,那麼它(Node)執行一個回調,每個連接只佔用了很是小的(內存)堆棧開銷。
舉一個簡單的異步調用的例子,把test.js和myMydule.js準備好了,^_^。把如下代碼拷貝到test.js中並執行:
fs = require(); fs.readFile(, function (err, data) { (err) err; console.log(); }); console.log();
所謂的異步,你們應該都能想獲得運行時會先打先顯示"async",再顯示"successfully"。
Node是無阻塞的,新請求到達服務器時,不須要爲這個請求單獨做什麼事情。Node僅僅是在那裏等待請求的發生,有請求就處理請求。
Node更擅長處理體積小的請求以及基於事件的I/O。
Node不只僅是作一個Web服務的框架,它能夠作更多,好比它能夠作Socket服務,能夠作比方說基於文件的,而後基於像一些比方說能夠有子進程,而後內部的,它是一個很完整的事件機制,包括一些異步非注射的解決方案,而不只僅侷限在網絡一層。同時它可能,即便做爲一個Web服務來講,它也提供了更多能夠深刻這個服務內核、核心的一些功能,比方說Node使用的Http Agent,這塊就是它能夠更深刻這個服務內核來去作一些功能。
Node事件流概念
由於Node 採用的是事件驅動的模式,其中的不少模塊都會產生各類不一樣的事件,可由模塊來添加事件處理方法,全部可以產生事件的對象都是事件模塊中的 EventEmitter 類的實例。代碼是全世界通用的語言,因此咱們仍是用代碼說話:
events = require(); emitter = events.EventEmitter(); emitter.on(, function(msg) { console.log(msg); }); emitter.emit(, );
簡單的分析這段:
1. 使用require()方法添加了events模塊並把返回值賦給了一個變量
2. new events.EventEmitter()這句建立了一個事件觸發器,也就是所謂的事件模塊中的 EventEmitter 類的實例
3. on(event, listener)用來爲某個事件 event 添加事件處理方法監聽器
4. emit(event, [arg1], [arg2], [...]) 方法用來產生事件。以提供的參數做爲監聽器函數的參數,順序執行監聽器列表中的每一個監聽器函數。
EventEmitter 類中的方法都與事件的產生和處理相關:
1. addListener(event, listener) 和 on(event, listener) 這兩個方法都是將一個監聽器添加到指定事件的監聽器數組的末尾