专家观点——袁锋谈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

你可能感兴趣的:(专家观点——袁锋谈Node.js开发技巧)