专家观点——袁锋谈 Node.js 开发技巧

  • 袁锋

2011 年 11 月 8 日

话题:Web框架JavaScript社区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 开发过:

除了传统 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

Web框架JavaScript社区Node.js语言 & 开发架构