首先是效能,用起來感覺 Node.js 的效能並沒有想像中那麼好。記憶體佔用差不多和 Ruby 一個等級,比 Python, PHP 要多。在運算效能(即 CPU 使用)上,純運算並沒有太大優勢,但因為可以很好地控制非同步流程,所以整體表現上來看效能要比 PHP 好很多。個人覺得Node.js 在效能方面是有很大的潛力的,因為有許多大型的專案致力於提升JavaScript 虛擬機器的效能-例如各大瀏覽器;同時JavaScript 是一個語法簡單的語言,也是一個語法簡單的語言,也是一個開放標準,不像Python 和PHP 一樣因為顧及相容性,很難進行大的重構來改善效能。
然後是套件管理器和函式庫,Node.js 內建了npm, 因為npm 是個非常好用的套件管理器,因為JavaScript 的編寫門檻低,因為JavaScript 本來就有很多優秀的前端函式庫被移植到了後端,所以NPM 上的套件現在已經多於PyPI 和RubyGems 了,然後遠超PEAR 和Composer. Node.js 的開發中不同於PHP 的一點就是大家都不怕加依賴,每個小需求都去NPM 上找已有的函式庫來實現-而且往往都能找到。所以 Node.js 的開發基本上就是在組合依賴,然後傾向於把一個即使很小的獨立需求寫成一個函式庫,這倒是和 UNIX 的思維比較像。再另一方面,Node.js 社群對開源十分友好,這裡的友好是指大多數的函式庫都是在Github 上開放開發的,而且使用的是非常寬鬆的協議,例如MIT, 不像GPL 那麼具有“攻擊性」。
社區,Node.js 的應用大部分還是Web 後端,而Web 後端相關的庫基本上都是那麼幾個大牛搞起來的,例如express, jshttp, jade, mocha 和koa 就是以TJ 大神為首的四、五個人開發起來的,這倒是個有趣的現象。 ——雖然 TJ 大神最後決定淡出 Node.js 社群。
工具鏈,Node.js 比較年輕,很多好用的工具都是近兩年剛出現的,例如預編譯方言, 單元測試和模擬測試,構建工具等;不敢說有多好,但是要比PHP 好非常多。至於原因,首先很大程度是因為這些函式庫都是既可用於前端又可用於後端的,因為Web 前端的硬需求,讓Node.js 順便得益;然後就是因為JavaScript 靈活而簡單的語法,讓這些工具可以以一些非常巧妙而優雅的方式來實現。至於 IDE, 依然得益於 Web 前端,還是有一些 IDE 可用的——雖然 JavaScript 語言本身不是很利於靜態分析。
語法,我還要再強調一下 JavaScript 的語法簡單而靈活,其中重要的一點是 JSON, JSON 幾乎是目前 Web 領域最通用的資料格式,而在 JavaScript 對 JSON 具有原生的支援! JavaScript 中所有的資料結構都是圍繞著 JSON 的一個超集——Object 展開的,包括數組,函數,物件和類別。當然這樣也帶來一個麻煩,就是因為寫起來限制少,導致不知道該怎麼寫,剛開始學習的時候總免不了反覆重構,才能摸清各種設計模式在不同情況下的優劣,找到適合自己和適合具體專案的寫法,所以可以說Node.js 入門簡單,但要建立大型項目,還是比較考驗開發者的功力的。因為歷史遺留問題,JavaScript 的語法不算優美,不過還好我們有各種預編譯方言,例如 Coffee Script, TypeScript, Dart, LiveScript 以及 ClojureScript, 總有一款適合你。
使用場景,JavaScript 是一個通用的程式語言,Web 前後端自然不必說,來看看其他方面。個人以為Node.js 還是很適合用來寫伺服器工具的,或稱運維工具,因為運維中很多情況是可以異步工作的,JavaScript 又有比較不錯的正則支持,替代bash 和Python 也問題不大;Node.js 只要裝好解釋器,就可以隨便用,不用畏手畏腳地避免引入依賴。而桌面和行動裝置編程,Node.js 有 node-webkit 以及其他各種外殼,雖然目前使用體驗不是很好,但是可以非常顯著地降低開發成本,輕鬆跨平台,想必前途也是光明的。
最後說學習Node.js, 在我看來,學習Node.js 分兩點,一是要理清Node.js 的“基於事件回調的異步IO”,這是Node.js 與其他主流編程語言最不同的一點。然後第二步就是把 NPM 上 Top 100 的庫都看一下,不用細看,只要混個臉熟,知道每個庫是乾嘛的就行了。完成這兩步,那麼恭喜你,已經是個 Node.js 開發者了。