NODE.JS學習的常見誤區及四大名著
前段時間由於不滿於社區里很多人對於NODE.JS的種種誤解而寫了一篇文章名為:
NODE.JS之我見:http://www.cnblogs.com/pugang/p/4374681.html
收到了很多兄弟的熱情回復和激烈討論,在此深表感謝,有的朋友覺得我寫的比較粗獷,沒有給出具體的性能分析和對比,在此我想說的是其實好多東西的性能分析,根本就不用我寫到博客上,其一是如果我寫了,很多人同樣會覺得不客觀,不中立,其二是網上很多中立的機構,隨便搜索一下,對比太多了,就好比NODE.JS和Nginx的對比,網上客觀的分析太多了,只要你能google。
近兩年的NODE.JS雄起讓很多人覺得JavaScript就要統一全棧了,網上這種言論充斥着各大論壇,仿佛計算機科學里面唯一最NB的就只有JavaScript,其他的只是都是shit,首先需要澄清的是,我並不是憤青,也沒有鄙視前端工程師的意圖,但是我始終認為,網絡上應該有人把一些技術的來龍去脈說清楚,不要輕信謠傳,因為實踐是檢驗整理的唯一標准。
那么JavaScript在NODE.JS里面到底是一個什么地位呢?NODE.JS到底是什么呢?我先用一個形象的比喻來說一下,說完了我會稍加分析,懂球的看看是不是這么個道理。JavaScript之比於NODE.JS就像狐狸和老虎的關系,這里面的老虎是C\C++,而NODE.JS只不過是給老虎批了一層薄薄的皮,大家一定都聽過狐假虎威,狐狸之所以NB是因為背后站着老虎,而老虎的NB不只是一張皮,是來自於骨子里面的NB。
另一個誤區是NODE.JS是單線程的,異步IO,所以效率奇高,非一般服務器所能比擬,當NODE.JS跑起來的時候我建議你抓取一個.dump文件看一下,NODE.JS里面到底有多少個線程,單線程的東西能作出異步IO么?給人的感覺是NODE.JS已經可以跨越OS而存在了,OS本身也做不到的事情NODE.JS卻可以做到,據筆者所知,生產環境中的現有異步IO超過99%都是以多線程或者線程池模擬出來的,所以不要相信這樣的謠傳。來看下面的簡單NODE.JS文件IO示例:
var fs = require('fs' ); var http = require('http' ); http.createServer(function(request, response) { var newFile = fs.createWriteStream("readme_copy.md"); request.pipe(newFile); request.on('end' , function() { response.end('uploaded!' ); }); }).listen(8080);
這樣一個簡單的文件IO恐怕最少也要兩個線程才能完成,一個線程用於執行JavaScript,另一個用於模擬異步IO。所以在這里得出的結論是JavaScript完全不NB,真正NB的是C\C++,也許你又說了,那為什么C\C++沒有取得NODE.JS的火爆程度和高性能,那只是你不知道,Nginx就是一個事實的證明,Nginx的性能可能要比NODE.JS要高一些,純C打造的, 那為什么當時NODE當時設計的時候沒有選用純C呢?網上有人寫文章說是作者覺得C太難了,怕好多人接受不了,而且C的標准庫是同步的IO,會讓人誤用。
另一個常見的誤解是前端的JavaScript和NODE.JS里面的JavaScript是一個東西,其實完全不然,雖然語法一樣,但是僅此而已,前端的JavaScript只能操作瀏覽器的一畝三分地,而后端的JavaScript跟像是C的代言人,傳說中的狐假虎威,C在OS上能做的事情,他基本都可以做到。
下面說說NODE.JS學習的四大名著。
我一般很少推薦國人寫的書,因為好多人寫的書浮躁,生猛,不自成體系,以吹NB為樂,以讓別人看不懂為榮,包括翻譯的書,但是在NODE.JS上我第一本要推薦的是朴靈寫的<深入淺出NODE.JS>, 看得出來朴靈服務端C代碼寫的不是很多,但是至少他把NODE.JS講的很清楚而且確實是懂球的,基本上都是對的,這一點就非常難得,質量上乘,堪比美帝,行文中還可以看出此作者比較謙遜。
我要推薦的另外3本書是如下3本,不多解釋了,大家去國外的論壇圈子里轉轉,或者去亞馬遜豆瓣看看書評就懂了。
<Pro Node.js for Developers>
<PROFESSIONAL Node.js ® BUILDING JAVASCRIPT-BASED SCALABLE SOFTWARE>
<Single Page Web Applications>