首先是性能,用起來感覺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 開發者了。