/ 翻译

Understanding node.js 瞎翻译

原文在此

结果翻译完了。。发现了译言

当初在挑用哪个platform的时候,为了了解啥是node.js,恰好看到了此文,觉得不错。所以翻译一下,加深下印象。(就当是免责声明吧)


我介绍给别人Node.js时,一般他们有两种反应;一种是马上“哦!我懂了!”,一种是“哦。。。到底啥玩意儿啊?”

如果你到现在还是后者,那先简单给你介绍一下:

  • 它一个命令行工具,下载tarball,编译然后安装即可;
  • 可以直接在terminal中敲node my_app.js就跑起来一个Javascript的程序;
  • Node里的JS是靠V8引擎(chrome为啥那么快?因为有V8)来解析执行的;
  • Node提供了一套JavaScript的API来访问网络和文件系统;

“但是我可以用ruby、python、php、java等等一大坨工具来做一样甚至更多的事情啊”

对,你说的一点儿也没错!Node并不是万能钥匙。它只是一个工具,至少现在,它没办法完全替代你在用的常规工具。

“说重点!”

来了!Node非常适合一种情况:同时处理多个事情。你是否写过一些代码然后嘀咕“我希望可以并行的跑这些代码”?重点来了!在Node里,所有东西都是并行的,除了你的代码!

“啥?”

没错,everything runs in parallel, except your code. 要理解这句话,想象一下,你的代码是老大,而Node是小弟。

每天,小弟会叫醒嗜睡的老大(这尼玛被砍死的节奏),问他今天有没有啥事儿。老大就会给小弟一堆任务然后继续去睡觉了。小弟拿到任务就去找小小弟们分发任务并且开始愉快地干活了。

一旦某个小弟完成了任务,就会去给老大报告。老大每次只见一个小弟(秘密嘛)并听报告。有时候老大会再给小弟安排后续任务。

这样的生活多美好啊,小弟们并行的把所有事情都做完了,只要报告给老大一个结果就好了。

注:以上显然只是一个简单隐约,毕竟在现实生活中很难找到“非阻塞”的例子。

“碉堡了!别扯淡了,上代码!!!”

额,来了!一个简单的node程序如下:

var fs = require('fs')
  , sys = require('sys');

fs.readFile('treasure-chamber-report.txt', function(report) {
  sys.puts("oh, look at all my money: "+report);
});

fs.writeFile('letter-to-princess.txt', '...', function() {
  sys.puts("can't wait to hear back from her!");
});

代码里给了node两个任务,分别是读和写一个文件,然后sleep(睡觉。。。呵呵)。一旦node完成任务,就callback。但是每次只能有一个callback被执行(小弟报告要排队啊!)。前一个callback结束前,其他的必须排队。顺便说一句,callback被执行的顺序是不保证的。

“所以,我不用担心代码同时访问同一数据结构的问题?”

你说对了!那就是JavaScript单线程/事件循环设计的美妙所在!

“非常好,但是我为什么要用它?”

一个理由是,高效。在web应用中,响应时间一般是所有数据库查询的时间之和*【类似sum(Q1,Q2,Q3,Q4)】。但是用了Node,可以马上同时执行所有查询,把响应时间降到和最慢的那次查询一样。【类似max(Q1,Q2,Q3,Q4)】*

另一个原因是JavaScript。你可以用Node从浏览器一直跑到后端了。JavaScript一直在进步啊。尽管你以前一直在用python、ruby、java、php等等等等,你应该也用过一点点JS对嘛?

最后一个原因就是速度,V8在成为最快动态语言解析器的道路上越走越远(原文楼下有人砸场子,说V8不是最快的,死忠粉速去喷!)。我无法想象有任何一种语言有如此快的进步速度。另外,node的I/O非常轻巧,可以让你最大程度的利用系统I/O。

“所以你是说从现在开始我应该用node写所有的app?”

是也不是。毕竟手里拿着锤子,眼里就只剩钉子。但是如果你在做一个有明确时间点的玩意儿,也许你可以考虑一下:

  • 低响应时间/高并发重要嘛?Node很擅长哦!
  • 工程大嘛?小工程Node无压力。大工程就应该仔细评估了(可用库,改bug的人力或者两条上升流*(?不太对的感觉)*等等)

“Node可以在Windows上跑么?”

不能(其实现在可以了,那时候还不能)。如果你在用Windows,你需要跑一台虚拟机来运行Linux(作者个人推荐VirtualBox,我个人推荐VM)。其实在Windows上运行node正在计划中,但是别等了,上手吧!

“我能通过node直接访问DOM么?”

好问题!不能!DOM是浏览器的玩意儿,谢天谢地的是node用的JS(V8)引擎和那一坨玩意儿没关系。但是,还真有人在这条道路上尝试哦,把DOM做成node模块 -- 让单元测试客户端代码成为可能啊!

“事件驱动编程不是很难么?”

这个要看你牛不牛B!如果你已经轻松搞定AJAX回调和用户在浏览器里面乱点这类事件之间的冲突,那用node一点儿问题也没有。

另外,测试驱动开发,真的可以帮助你做出可维护的设计哦!

“有人先吃螃蟹了么?”

有一个小的/未完成列表,在Node百科(请滑动到“在用Node的公司”)。Yahoo正在用node实验YUI;Plurk正在用它来处理大量的comet*(彗星?)*;Paul Bakaus(jQuery UI框架)在实现一个NB的游戏引擎,其中部分后端用node实现;Joyent则直接雇了Ryan Dahl(Node创始人)并全力投入node开发。

对了,Heroku刚刚宣布(实验性)支持托管node.js咯。

“我从哪里可以学到更多?”

Tim Caswell维护着“如何Node”博客;或者在twitter上粉#node.js;订阅一下邮件列表;到IRC转转并#node.js(对,名字里面带个点)!我不会告诉你我们马上要集到200个赞啦!!

同时我会在debuggable.com持续更新相关文章。

基本就这些吧,差不多了,有疑问尽管提吧!

--fg