從接觸Node.js到現在颖变,一路摸爬滾打,雖然也談不上精通陪蜻,但對于如何學習Node.js邦马,還是有一些個人見解的,現在拿出來與大家共勉宴卖。一是對自己的總結滋将,二呢也希望能幫助到大家。
本文將包含以下內容:
- 什么是Node.js
- Node.js的應用場景
- Node.js的學習指南
- 擴展延伸
什么是Node.js
Node.js 是一個基于Chrome JavaScript 運行時建立的一個平臺症昏, 用來方便地搭建快速的随闽, 易于擴展的網絡應用。 Node.js 借助事件驅動肝谭, 非阻塞 I/O 模型變得輕量和高效掘宪,可以完美地處理時時數據, 非常適合 運行在分布式設備 的 數據密集型 的實時應用攘烛。通俗點就是 node.js是一個可以讓javascript運行在后端的上下文環(huán)境+很多方便的現成庫魏滚。
node.js最大的賣點在于完全異步的I/O模型。比于阻塞I/O坟漱,異步I/O模型極大提高web服務的并發(fā)性鼠次,對于I/O密集型應用來說,會有明顯的性能提升芋齿。例如對于大量采用Ajax long-polling的網站(典型的如聊天室腥寇,知乎的通知推送)能帶來很大的提升;因為每一個的long-polling請求都會占用服務器的連接數觅捆,雖然大部分連接處在空閑狀態(tài)赦役,但并發(fā)性不強的web框架最終會被大量的連接耗死。而node.js的異步I/O模型最適合于處理這樣的情形惠拭。
單線程不僅沒有降低吞吐率(因為異步)扩劝,也遠離了死鎖等同步不當導致的問題。node.js可以通過多進程來提高并發(fā)能力职辅;其次單進程多線程的程序往往在內存中共享數據棒呛,而內存不能跨機器訪問,因此限制了擴展到集群的能力域携。但是因為異步也帶來的一些問題:層層嵌套的回調簇秒,異常難以處理。由于程序的模型變成了異步秀鞭,node.js的代碼風格亦偏函數式趋观,對此沒有經驗的需要一定的時間來適應扛禽。因為node.js是基于javascript的,對于想成為全棧道同學皱坛,是個很不錯的選擇编曼。
目前使用Nodejs的公司有 LinkedIn, Yahoo, Paypal, eBay, Walmart,Groupon 還有很多的中小型公司剩辟,國內的公司如雪球掐场、淘寶、網易贩猎、百度等也都有很多項目運行在 Node.js 之上熊户。
Node.js的應用場景
** 適合 **
JSON APIs——構建一個Rest/JSON API服務,Node.js可以充分發(fā)揮其非阻塞IO模型以及JavaScript對JSON的功能支持(如JSON.stringfy函數)
單頁面吭服、多Ajax請求應用——如Gmail嚷堡,前端有大量的異步請求,需要服務后端有極高的響應速度
基于Node.js開發(fā)Unix命令行工具——Node.js可以大量生產子進程艇棕,并以流的方式輸出蝌戒,這使得它非常適合做Unix命令行工具
流式數據——傳統(tǒng)的Web應用,通常會將HTTP請求和響應看成是原子事件欠肾。而Node.js會充分利用流式數據這個特點瓶颠,構建非常酷的應用刺桃。如實時文件上傳系統(tǒng)transloadit
準實時應用系統(tǒng)——如聊天系統(tǒng)、微博系統(tǒng)吸祟,但Javascript是有垃圾回收機制的瑟慈,這就意味著,系統(tǒng)的響應時間是不平滑的(GC垃圾回收會導致系統(tǒng)這一時刻停止工作)屋匕。如果想要構建硬實時應用系統(tǒng)葛碧,Erlang是個不錯的選擇
** 不適合**
CPU使用率較重、IO使用率較輕的應用——如視頻編碼过吻、人工智能等进泼,Node.js的優(yōu)勢無法發(fā)揮
簡單Web應用——此類應用的特點是,流量低纤虽、物理架構簡單乳绕,Node.js無法提供像Ruby的Rails或者Python的Django這樣強大的框架
Node.js的學習指南
對于剛接觸Node.js的新手來說,第一步無非是打好基礎逼纸,你需要弄明白JavaScript 的特性語法和node的基本原理洋措。通過一些博文和書籍的學習,對node.js有了一個基本的了解后杰刽,可以嘗試搭建一個 HTTP 服務器菠发,返回 hello world (使用 HTTP 模塊)王滤;讀取一個 txt 文件,將內容顯示到命令行中(使用 fs 模塊)等等滓鸠。以提高自己的自信心雁乡。
Node.js 的活力所在是npm 上近 7W 的第三方模塊,當你對Node.js已經了解的差不多了糜俗,不妨用 Node.js 的第三方模塊做些好玩的事情踱稍。如搭建一個微博網站;寫一個簡單的爬蟲吩跋;調用一些網站的API做一些好玩的東西等等寞射。對一門技術有了足夠的信心后,此時應該深入了解下 Node.js 核心模塊的用法锌钮。好好看下Node.js 官方 API 文檔桥温。在此基礎上多加實踐。不管是用核心模塊還是外部模塊梁丘,嘗試用 Node.js 解決某個問題或者替換掉以前用其他語言寫過的代碼侵浸。
讀源碼可以先挑一些簡單的只實現某個特定功能的工具模塊的源碼讀,這種模塊的代碼通常在幾百行氛谜,閱讀起來并不是很困難掏觉,但是卻能漲不少的姿勢。比如:underscore (學習 JavaScript 的語法和技巧)值漫。在使用 Node.js 時發(fā)現沒有合適的模塊選擇或者選擇的模塊功能不盡人意澳腹,這個時候你可以嘗試去創(chuàng)建一個模塊或者修改現有的模塊,并且使用 npm 發(fā)布自己的模塊或者去該模塊的 GitHub 上提 PR 杨何。不斷的重復演練酱塔,想學不會都難。對于其它技術危虱,也是如此羊娃。
最后,要明白學習node最關鍵的是學習node的核心埃跷,也就是node本身蕊玷,而不是僅僅糾結于大量彼此沒有緊密聯系的工具和庫,因為他們不能幫助你加深對node本身的理解弥雹,如果你理解了核心垃帅,尤其是核心的概念(未必是語法和實現),理解整個生態(tài)系統(tǒng)的其他工具缅糟,庫挺智,應用也就成竹在胸了。事在人為,把您和大眾區(qū)分開來的不就是理解的深度嗎赦颇?
擴展延伸
沒有人是無師自通二鳄,把一些常用的網站整理下,分享給大家媒怯,也算是對自己的一個總結吧订讼。希望對需要的人能有些幫助。
學習網站
- 極客學院的node專題 --里面的wiki可以是很好的入門資料
- CNode --Node.js專業(yè)中文社區(qū)
- node在線編譯執(zhí)行代碼
- JSER網站關于node的入門教程
- Porschev的node學習筆記--博主一直在更新
- 深入理解JavaScript系列--湯姆大叔的博客
代碼示例
- N-blog--nswbmw的基于node.js的個人博客源碼
- awesome-nodejs--用node寫的很不錯的代碼集合
書籍
有些人不太愛看書扇苞,但一本好書是對一門技術的最系統(tǒng)的解釋欺殿。
- JavaScript 推薦書籍列表
- 《深入淺出Node.js》--豆瓣評分8.7
- 《nodejs入門》--38頁極簡入門
- 《Node.js in Practice》
- 《Node.js the Right Way: Practical, Server-Side JavaScript That Scales》
- 《Node.js Design Patterns》--這幾本是講Node核心的書