Understanding node.js 瞎翻译
Posted
结果翻译完了。。发现了译言
当初在挑用哪个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