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

fmms 12年前
     <p> <a href="/misc/goto?guid=4958198272522378090">袁锋</a>,花名苏千,淘宝网数据产品部资深 Web 开发工程师,CNode.org 社区核心成员。长期致力于 Nodejs 在国内的推广,并积极推动 Nodejs 在淘宝网内部的商业化应用,在 Nodejs 的 Web 开发领域具有丰富经验。曾就职于金山软件公司,同时也是知名 Chrome 插件 FaWave 的开发者之一。袁锋在 QCon 杭州2011大会上做了名为《Nodejs, 脱离了浏览器的 Javascript》的演讲,有关幻灯片可以在此<a href="/misc/goto?guid=4958198273280259221">下载</a>。会后,InfoQ 中文站对其进行了采访。</p>    <p> InfoQ:Node.js 目前同时维护着两个版本,你推荐哪个版本?这两个版本分别适用于哪些场景?</p>    <blockquote>     <p>正式项目还是推荐使用稳定版本0.4.x,稳定版本 api 是不会变化的,0.5.x 的更新速度惊人,而且 api 也不断在变化。0.5.x 及以上版本增加了 child_process.fork, cluster, http.ClientRequest.setTimeout, zlib 等等新功能和模块,同时对 windows 支持良好,可以直接在 windows 上运行。详细变化说明可以查看:<a href="/misc/goto?guid=4958198274023115627">https://github.com/joyent/node/wiki/API-changes-between-v0.4-and-v0.6</a>。</p>     <p>如果你可以同时兼容你的项目任务,又能把握 nodejs 的快速变化,不妨可以在你的新项目中使用0.5.x,下一个稳定版本0.6.x 很快就出来了。</p>    </blockquote>    <p> InfoQ:你主要使用 Node 技术开发了哪些应用?会遇到哪些问题,如何解决?</p>    <blockquote>     <p>目前我基于 nodejs 开发过:</p>     <ul>      <li>淘 job:<a href="/misc/goto?guid=4958198274768776313">http://taojob.tbdata.org/</a></li>      <li>网址还原:<a href="/misc/goto?guid=4958198275511952243">http://urlrar.cnodejs.net/</a>,用于 Chrome 微博客户端 FaWave 解析短网址。</li>      <li>淘宝指数:<a href="/misc/goto?guid=4958198276245734131">http://shu.taobao.com/</a>,免费的数据分享平台。</li>     </ul>     <p> 除了传统 web 应用会遇到的问题外,开发中我遇到过比较常见的问题:</p>     <ul>      <li>nodejs 访问 mysql 返回的数据出现编码问题:使用没有中文编码问题的 node-mysql 模块,连接数据库时设置一下编码 db.query ("SET NAMES utf8");</li>      <li>异步调用中无法捕获异常:监听 process 的 uncaughtException 事件来处理异常,缺点是无法向触发此异常的 request 返回错误响应。 <a href="/misc/goto?guid=4958198276992865972">http://nodejs.org/docs/latest/api/process.html#event_uncaughtException_</a></li>      <li>使用的第三方模块出现未在文档中说明的问题:可以到模块项目的 issue 列表查看是否已有使用者报告此 bug,看看作者的回复,一般好的第三方模块都会快速响应你提交的 issue。同时你也可以查看源代码,修复此问题,并提交你的修改,为此模块做出贡献,这在 nodejs 的第三方模块中是常见的做法。</li>      <li>单进程无法完全利用 CPU 资源:Cluster:<a href="/misc/goto?guid=4958198277735587270">https://github.com/LearnBoost/cluster</a> 可以很好地解决多核利用问题,而 nodejs 0.6+ 以上版本将直接支持 cluster 参数启动。关于多进程同时监听同一端口的问题,可以查看 <a href="/misc/goto?guid=4958198278471334354">http://cnodejs.org/blog/?p=3471</a></li>     </ul>    </blockquote>    <p> InfoQ:Node.js 对于熟悉 JS 的前端工程师来说可能比较容易上手,如果是习惯了传统语言如 Java 的后台工程师想学习 Node.js,你有哪些建议?</p>    <blockquote>     <p>虽然前端工程师对 javascript 很熟悉,但是 nodejs 是应用服务器端的,所以 Java 的后端工程师会更加容易理解 nodejs 相关术语和 api 说明。</p>     <p>可以从个人小项目入手,学习 javascript,文档可以查看 MDN:<a href="/misc/goto?guid=4958198279216019302">http://developer.mozilla.org</a> ;nodejs 有一本非常好的免费电子入门书:The Node Beginner Book <a href="/misc/goto?guid=4958198279953158833">http://nodebeginner.org/</a></p>     <p>nodejs 是全新的平台,没有任何历史包袱。not now,when?</p>    </blockquote>    <p> InfoQ:Node.js 的异步调用使得代码结构与传统有所不同,新手可能会不适应,你怎么看这个问题,有较好的解决办法吗?</p>    <blockquote>     <p>关于异步调用代码嵌套问题,已经在 nodejs 社区讨论过许多,相关文章也有各种解决方案:</p>     <ul>      <li><a href="/misc/goto?guid=4958198280698396313">http://howtonode.org/control-flow</a></li>      <li><a href="/misc/goto?guid=4958198281439607009">http://bjouhier.wordpress.com/2011/04/04/currying-the-callback-or-the-essence-of-futures/</a></li>      <li><a href="/misc/goto?guid=4958198282177360220">http://howtonode.org/step-of-conductor</a></li>     </ul>     <p><a href="/misc/goto?guid=4958198282914079670">老赵</a>的 Jscex <a href="/misc/goto?guid=4958198283656906544">https://github.com/JeffreyZhao/jscex</a> 和<a href="/misc/goto?guid=4958198284397657790">朴灵</a>的 EventProxy <a href="/misc/goto?guid=4958198285143964320">https://github.com/JacksonTian/eventproxy</a> 是两种完全不同的解决方案。</p>     <p>其实异步代码嵌套问题只是刚接触 nodejs 的同学害怕的问题,一旦你真的要去面对它和解决它的时候,会发现这些问题都是有适合你的办法,很好地处理的。</p>    </blockquote>    <p> InfoQ:JS 语言的面向对象实现采用了原型模式,较之其他动态语言如 Ruby,显得比较另类,不少 JS 前端框架都提供了自己的 OOP 封装,对于 Node.js 来说,你会推荐哪些 OOP 模块?或者直接用 ES5 的新特性来解决?</p>    <blockquote>     <p>按照 javascript 原型模式就可以了。</p>     <p>同时 nodejs 提供了继承辅助方法 util.inherits <a href="/misc/goto?guid=4958198285888607308">http://nodejs.org/docs/latest/api/util.html#util.inherits</a></p>    </blockquote>    <p> InfoQ:目前 Node.js 提供的官方模块有限,NPM 上有很多第三方的模块,在使用时是否要考虑其可靠性?</p>    <blockquote>     <p>模块稳定性必须要考虑的,我选择模块的时候,会非常关注模块 github 上面的活跃度和 issue 的处理跟进情况。</p>     <p>找模块一般可以从官方 modules 列表入手:<a href="/misc/goto?guid=4958198286625652804">https://github.com/joyent/node/wiki/modules</a></p>    </blockquote>    <p> InfoQ:介绍一下你们的 Node app engine 和 Node 开发大赛的近况?</p>    <blockquote>     <p>Node app engine 目前是邀请内测中,用户可以在 App Engine 中部署发布 Node.js 应用,并提供 mongoDB 数据库存储。</p>     <p>目前的 nodejs 版本为0.5.5。支持代码在线编辑,支持自定义域名绑定;除了因安全问题考虑屏蔽的模块外,热门的第三方模块和一切纯 javascript 实现的模块都支持。</p>     <p>Nodejs 开发大赛目前有14个项目参加,将于11月6号开始评选。参赛项目及后续情况可以关注 <a href="/misc/goto?guid=4958198287370541428">http://cnodejs.org/blog</a></p>     <div id="come_from">      <br /> 来自:      <a id="link_source2" href="/misc/goto?guid=4958198288109995436" target="_blank">InfoQ</a>     </div>    </blockquote>