從接觸Node.js到現在,一路摸爬滾打,雖然也談不上精通,但對于如何學習Node.js,還是有一些個人見解的,現在拿出來與大家共勉。一是對自己的總結,二呢也希望能幫助到大家。
本文將包含以下內容:
- 什么是Node.js
- Node.js的應用場景
- Node.js的學習指南
- 擴展延伸
什么是Node.js
Node.js 是一個基于Chrome JavaScript 運行時建立的一個平臺, 用來方便地搭建快速的, 易于擴展的網絡應用。 Node.js 借助事件驅動, 非阻塞 I/O 模型變得輕量和高效,可以完美地處理時時數據, 非常適合 運行在分布式設備 的 數據密集型 的實時應用。通俗點就是 node.js是一個可以讓javascript運行在后端的上下文環境+很多方便的現成庫。
node.js最大的賣點在于完全異步的I/O模型。比于阻塞I/O,異步I/O模型極大提高web服務的并發性,對于I/O密集型應用來說,會有明顯的性能提升。例如對于大量采用Ajax long-polling的網站(典型的如聊天室,知乎的通知推送)能帶來很大的提升;因為每一個的long-polling請求都會占用服務器的連接數,雖然大部分連接處在空閑狀態,但并發性不強的web框架最終會被大量的連接耗死。而node.js的異步I/O模型最適合于處理這樣的情形。
單線程不僅沒有降低吞吐率(因為異步),也遠離了死鎖等同步不當導致的問題。node.js可以通過多進程來提高并發能力;其次單進程多線程的程序往往在內存中共享數據,而內存不能跨機器訪問,因此限制了擴展到集群的能力。但是因為異步也帶來的一些問題:層層嵌套的回調,異常難以處理。由于程序的模型變成了異步,node.js的代碼風格亦偏函數式,對此沒有經驗的需要一定的時間來適應。因為node.js是基于javascript的,對于想成為全棧道同學,是個很不錯的選擇。
目前使用Nodejs的公司有 LinkedIn, Yahoo, Paypal, eBay, Walmart,Groupon 還有很多的中小型公司,國內的公司如雪球、淘寶、網易、百度等也都有很多項目運行在 Node.js 之上。
Node.js的應用場景
-
** 適合 **
JSON APIs——構建一個Rest/JSON API服務,Node.js可以充分發揮其非阻塞IO模型以及JavaScript對JSON的功能支持(如JSON.stringfy函數)單頁面、多Ajax請求應用——如Gmail,前端有大量的異步請求,需要服務后端有極高的響應速度
基于Node.js開發Unix命令行工具——Node.js可以大量生產子進程,并以流的方式輸出,這使得它非常適合做Unix命令行工具
流式數據——傳統的Web應用,通常會將HTTP請求和響應看成是原子事件。而Node.js會充分利用流式數據這個特點,構建非常酷的應用。如實時文件上傳系統transloadit
準實時應用系統——如聊天系統、微博系統,但Javascript是有垃圾回收機制的,這就意味著,系統的響應時間是不平滑的(GC垃圾回收會導致系統這一時刻停止工作)。如果想要構建硬實時應用系統,Erlang是個不錯的選擇
-
** 不適合**
CPU使用率較重、IO使用率較輕的應用——如視頻編碼、人工智能等,Node.js的優勢無法發揮簡單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 時發現沒有合適的模塊選擇或者選擇的模塊功能不盡人意,這個時候你可以嘗試去創建一個模塊或者修改現有的模塊,并且使用 npm 發布自己的模塊或者去該模塊的 GitHub 上提 PR 。不斷的重復演練,想學不會都難。對于其它技術,也是如此。
最后,要明白學習node最關鍵的是學習node的核心,也就是node本身,而不是僅僅糾結于大量彼此沒有緊密聯系的工具和庫,因為他們不能幫助你加深對node本身的理解,如果你理解了核心,尤其是核心的概念(未必是語法和實現),理解整個生態系統的其他工具,庫,應用也就成竹在胸了。事在人為,把您和大眾區分開來的不就是理解的深度嗎?
擴展延伸
沒有人是無師自通,把一些常用的網站整理下,分享給大家,也算是對自己的一個總結吧。希望對需要的人能有些幫助。
學習網站
極客學院的node專題 --里面的wiki可以是很好的入門資料
CNode --Node.js專業中文社區
node在線編譯執行代碼
JSER網站關于node的入門教程
Porschev的node學習筆記--博主一直在更新
深入理解JavaScript系列--湯姆大叔的博客
代碼示例
N-blog--nswbmw的基于node.js的個人博客源碼
awesome-nodejs--用node寫的很不錯的代碼集合
書籍
有些人不太愛看書,但一本好書是對一門技術的最系統的解釋。
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核心的書
文/吳白(簡書作者)原文鏈接:http://www.lxweimin.com/p/babf69a03276著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。