專家觀點 - 袁鋒談Node.js開發技巧
袁鋒,花名蘇千,淘寶網數據產品部資深 Web 開發工程師,CNode.org 社區核心成員。長期致力于 Nodejs 在國內的推廣,并積極推動 Nodejs 在淘寶網內部的商業化應用,在 Nodejs 的 Web 開發領域具有豐富經驗。曾就職于金山軟件公司,同時也是知名 Chrome 插件 FaWave 的開發者之一。袁鋒在 QCon 杭州2011大會上做了名為《Nodejs, 脫離了瀏覽器的 Javascript》的演講,有關幻燈片可以在此下載。會后,InfoQ 中文站對其進行了采訪。
InfoQ:Node.js 目前同時維護著兩個版本,你推薦哪個版本?這兩個版本分別適用于哪些場景?
正式項目還是推薦使用穩定版本0.4.x,穩定版本 api 是不會變化的,0.5.x 的更新速度驚人,而且 api 也不斷在變化。0.5.x 及以上版本增加了 child_process.fork, cluster, http.ClientRequest.setTimeout, zlib 等等新功能和模塊,同時對 windows 支持良好,可以直接在 windows 上運行。詳細變化說明可以查看:https://github.com/joyent/node/wiki/API-changes-between-v0.4-and-v0.6。
如果你可以同時兼容你的項目任務,又能把握 nodejs 的快速變化,不妨可以在你的新項目中使用0.5.x,下一個穩定版本0.6.x 很快就出來了。
InfoQ:你主要使用 Node 技術開發了哪些應用?會遇到哪些問題,如何解決?
目前我基于 nodejs 開發過:
- 淘 job:http://taojob.tbdata.org/
- 網址還原:http://urlrar.cnodejs.net/,用于 Chrome 微博客戶端 FaWave 解析短網址。
- 淘寶指數:http://shu.taobao.com/,免費的數據分享平臺。
除了傳統 web 應用會遇到的問題外,開發中我遇到過比較常見的問題:
- nodejs 訪問 mysql 返回的數據出現編碼問題:使用沒有中文編碼問題的 node-mysql 模塊,連接數據庫時設置一下編碼 db.query ("SET NAMES utf8");
- 異步調用中無法捕獲異常:監聽 process 的 uncaughtException 事件來處理異常,缺點是無法向觸發此異常的 request 返回錯誤響應。 http://nodejs.org/docs/latest/api/process.html#event_uncaughtException_
- 使用的第三方模塊出現未在文檔中說明的問題:可以到模塊項目的 issue 列表查看是否已有使用者報告此 bug,看看作者的回復,一般好的第三方模塊都會快速響應你提交的 issue。同時你也可以查看源代碼,修復此問題,并提交你的修改,為此模塊做出貢獻,這在 nodejs 的第三方模塊中是常見的做法。
- 單進程無法完全利用 CPU 資源:Cluster:https://github.com/LearnBoost/cluster 可以很好地解決多核利用問題,而 nodejs 0.6+ 以上版本將直接支持 cluster 參數啟動。關于多進程同時監聽同一端口的問題,可以查看 http://cnodejs.org/blog/?p=3471
InfoQ:Node.js 對于熟悉 JS 的前端工程師來說可能比較容易上手,如果是習慣了傳統語言如 Java 的后臺工程師想學習 Node.js,你有哪些建議?
雖然前端工程師對 javascript 很熟悉,但是 nodejs 是應用服務器端的,所以 Java 的后端工程師會更加容易理解 nodejs 相關術語和 api 說明。
可以從個人小項目入手,學習 javascript,文檔可以查看 MDN:http://developer.mozilla.org ;nodejs 有一本非常好的免費電子入門書:The Node Beginner Book http://nodebeginner.org/
nodejs 是全新的平臺,沒有任何歷史包袱。not now,when?
InfoQ:Node.js 的異步調用使得代碼結構與傳統有所不同,新手可能會不適應,你怎么看這個問題,有較好的解決辦法嗎?
關于異步調用代碼嵌套問題,已經在 nodejs 社區討論過許多,相關文章也有各種解決方案:
- http://howtonode.org/control-flow
- http://bjouhier.wordpress.com/2011/04/04/currying-the-callback-or-the-essence-of-futures/
- http://howtonode.org/step-of-conductor
老趙的 Jscex https://github.com/JeffreyZhao/jscex 和樸靈的 EventProxy https://github.com/JacksonTian/eventproxy 是兩種完全不同的解決方案。
其實異步代碼嵌套問題只是剛接觸 nodejs 的同學害怕的問題,一旦你真的要去面對它和解決它的時候,會發現這些問題都是有適合你的辦法,很好地處理的。
InfoQ:JS 語言的面向對象實現采用了原型模式,較之其他動態語言如 Ruby,顯得比較另類,不少 JS 前端框架都提供了自己的 OOP 封裝,對于 Node.js 來說,你會推薦哪些 OOP 模塊?或者直接用 ES5 的新特性來解決?
按照 javascript 原型模式就可以了。
同時 nodejs 提供了繼承輔助方法 util.inherits http://nodejs.org/docs/latest/api/util.html#util.inherits
InfoQ:目前 Node.js 提供的官方模塊有限,NPM 上有很多第三方的模塊,在使用時是否要考慮其可靠性?
模塊穩定性必須要考慮的,我選擇模塊的時候,會非常關注模塊 github 上面的活躍度和 issue 的處理跟進情況。
找模塊一般可以從官方 modules 列表入手:https://github.com/joyent/node/wiki/modules
InfoQ:介紹一下你們的 Node app engine 和 Node 開發大賽的近況?
Node app engine 目前是邀請內測中,用戶可以在 App Engine 中部署發布 Node.js 應用,并提供 mongoDB 數據庫存儲。
目前的 nodejs 版本為0.5.5。支持代碼在線編輯,支持自定義域名綁定;除了因安全問題考慮屏蔽的模塊外,熱門的第三方模塊和一切純 javascript 實現的模塊都支持。
Nodejs 開發大賽目前有14個項目參加,將于11月6號開始評選。參賽項目及后續情況可以關注 http://cnodejs.org/blog
來自: InfoQ