專家觀點 - 袁鋒談Node.js開發技巧

fmms 13年前發布 | 34K 次閱讀 JavaScript

袁鋒,花名蘇千,淘寶網數據產品部資深 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 開發過:

除了傳統 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 社區討論過許多,相關文章也有各種解決方案:

老趙的 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

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!