本文是对Felix Geisendörfer大神的Understanding node.js的一个翻译,主要是最近发现node.js这个东西似乎确实很强力,虽然不知道自己理解对不对,但是感觉,node.js和go里面最方便的一点就是把多线程以及web后端开发搞的更加容易了。下面正文开始,顺便说下本文主要自己学习的以及标题取得都挺洋气的就保留了,翻译水平不好,见谅啊=_,=,顺便说下,想学的同学可以去这里看看The Node Beginner Book
在我将node.js介绍给别人后,他们大多数有两种反应,一种是马上就了解了,另一种则觉得非常的疑惑。如果你是第二种人,那么我将试图这样来解释node.js是什么
- node.js是一种命令行工具,你下载tar包,编译,安装源代码
- node.js可以让你在终端直接一句
node my_app.js
直接运行你的JavaScript程序 - node.js使用V8引擎(就是那个让Google的Chrome能run的飞快的东西)解析执行JS脚本
- node.js提供了通过JavaScript访问网络和文件系统的API
“But I can do everything I need in: ruby, python, php, java, … !”
嗯,你说的是对的。node不是一个会跑来帮你把事情做完的独角兽(嗯原文freaking unicorn),它只是 一个工具,并且至少目前没办法替代你现在日常用的东西。
“Get to the point!”
node在你需要同时做几件事情的时候是很好用的。你肯定写过一些代码,然后想让他们并行,那么我告诉你,在node里面,除了你的代码之外所有的东西都是并行运行的。
“Huh?”
恩恩,就是这样滴啦,除了你的代码以外的东西,都是并行运行的。怎么来理解呢,我们先想象你的代码就是一个国王,而node就是国王的士兵。
故事的开始是国王的士兵把国王给叫起来,问他有没有啥事给他干,然后呢,国王列了一个清单给他的士兵,然后继续睡觉去了-,-……
士兵收到任务后,就把任务分给了其他的士兵一起来完成。
士兵完成了他的工作后,士兵就在国王家门口排队等着汇报结果了。国王呢,每次只能看一个士兵的结果,有时候还会给那个士兵更多的事情去做。
Life is good!所以说呢,国王的士兵并行的吧所有的任务搞完了,但是呢国王每次只会看一个结果,所以国王可以关注所有的结果。
故事简单,但是要是直接找个差不多的东西来说明下非阻塞(non-blocking)还是挺难的。
“That’s fantastic, but could you quit the silly metaphor and speak geek to me?”
恩恩,故事讲完了,我们来看点干货,看看node.js的程序是个啥样1
2
3
4
5
6
7
8
9
10var 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读文件和写文件这两个事儿,然后呢就去睡觉了。
一旦node完成一个事儿了,就调用回调函数了,但是呢一次只能有一个回调函数执行,其他的回调函数才会继续。而且无法保证回调函数的顺序。
“So I don’t have to worry about code accessing the same data structures at the same time?”
恩恩,这就是JavaScript单线程/事件循环设计的美妙之处了。
“Very nice, but why should I use it?”
一个原因是高效。一个web应用,主要的响应时间一般来说也就是所有的数据库查询时间总和,用node,你可以让他一次执行所有的查询,这样就将执行的时间缩短到了最慢的那个查询的时间。
另外一个原因就是JavaScript了,可以使用node共享前段和后端的代码。而且JavaScript也在慢慢的变成一个更为通用的语言,不管你用python,ruby,java,php还是神马的,你咋都要搞点点JS的东西吧。
最后一个原因就是速度,目前V8是世界上最快的动态语言解释器之一,我无法想象还有什么语言能够像JavaScript现在一样追求速度。另外,node提供了一个轻量级的I/O能够让你尽可能的的利用系统的I/O资源。
“So you are saying I should write all my apps in node from now on?”
既是,也不是,一旦你开始耍node这把锤子,所有东西都开始看上去象是颗钉子了,但是如果你做的事情是有一个期限的,那么你还要考虑下面的东西:
- 对你来说,低响应时间和高并发是否那么重要?因为node非常擅长这个。
- 你的项目有多大?小的项目妥妥的,大的项目就要仔细的评估了(已有的库,修复bug的资源等各种问题了(原文里面有个upstream-,-不知道咋翻译了))。
“Does node run on Windows?”
呀,作者写的有点旧了-,-现在支持windows,去node.js下个setup妥妥的,原文就懒得翻译了=_,=
“Can I access the DOM in node?”
好问题啊!DOM肯定是木有滴,DOM是一个浏览器才有的东西,幸好node用的V8是一个完全剥离了这些乱七八糟东西的好东西啊。但是啊,还有些家伙实现了一个DOM的node module,这个东西也实现了一些例如客户端代码单元测试的一些很酷的东西。
“Isn’t event driven programming really hard?”
这就取决于你了,要是你知道怎么玩AJAX和浏览器里面的用户事件,用node肯定不成问题,而且TDD可以让你实现可维护性高的设计。
“Who is using it?”
恩恩,这个东西,在node wiki(翻到“使用Node的公司(原文Companies using Node)”)是有一个正在不断增加的列表的。Yahoo用node搞了个YUI,Plurk用来搞massive comet(这个真不知道是啥东西了-,-大坨的彗星?还是大坨的东西-,-…)还有Paul Bakaus搞的游戏引擎(mind-blowing game engine)里面也有一部分node后端。Joyent雇了node的创造者Ryan Dahl,并且大大滴赞助了node的开发,以及heroku也将会支持node。
“Where can I learn more?”
Tim Caswell写了一个非常棒的How To Node博客,在twitter上follow下#nodejs,或者订阅邮件列表。或者IRC上的#node.js
(恩恩,点点在名字里面的)频道,我们要超200 lurker-mark(这啥意思-,-?)了XDDDDD
当然我(那是原文作者-,-)也还会继续在我的博客debuggable.com写文章滴。
最后欢迎大家订阅我的微信公众号 Little Code
- 公众号主要发一些开发相关的技术文章
- 谈谈自己对技术的理解,经验
- 也许会谈谈人生的感悟
- 本人不是很高产,但是力求保证质量和原创