袁锋,花名苏千,淘宝网数据产品部资深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
活动推荐:
2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。
评论