一般来说,我向人介绍node.js会引起两种反应:基本明白了或者完全“蒙圈”。如果你属于“蒙圈”的那类人,我在此尝试解释一下node:
它是个命令行工具。你下载安装包,编译它,然后安装((注明:原文比较老,这里只是linux下的安装。windows和IOS都是安装包直接双节安装的,十分方便)
你可以通过在终端输入类似"node my_app.js"的指令来运行你的js程序
js程序运行在V8 js引擎(chrome因v8引擎而运行如此之快)上
node提供了访问网络和文件系统的js接口
你会说:“但是我可以用其他语言做任何事,比如ruby, php, java, …!”
我知道,你是对的。抱歉,node不是替你完成你的任务的神器,它只是一个工具,它并不能完全代替你的常规工具,至少目前是这样
“请说重点”
好的。node非常适合于并发做多件事情。你是否写过一个代码段,并期望这段代码可以并发执行?除了你的代码外,node所有东西也都是并发执行的。
“哈?”
没错,包括你的代码所有东西都是并发执行的。你可以这么理解,你的代码就是国王,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两个任务,读和写一个文件,然后休眠。一旦node完成了任务,回调被触发。不过,在同一时间只能有一个回调被触发。其他回调只能在队列中等待那个回调执行完毕。顺带说一句,这些回调的队列顺序是不确定的。
“所以我完全不用担心很多代码会同时访问统一数据?”
理解正确!那就是js事件驱动、单线程设计之美妙。
“不错,但是我为什么要用它?”
原因之一就是性能。在一个web应用中,你的响应时间主要就是你的数据库查询总耗时。使用node你可以同时完成所有数据查询,将响应耗时降低至与最慢的查询耗时一致。
另一个原因是js。你可以用node在前端后端间分享代码。js正在逐渐发展成为一门真正的通用语言。无论过去你是用python, java, php还是其他语言,你可能总得会一些js,不是吗?
最后的一个原因是速度。v8正不断拉高成为最快动态语言解释器的上限。
“所以你是说从现在开始我应该使用node开发所有的app?”
是,也不是。一旦你开始像使用锤子一样使用node,所有东西都看起来像钉子。但是,如果你正做一件有最终期限的事,你可能会据此做决定:
1、快速响应和高并发重要么?node非常擅长
2、项目多大?小项目是没问题的,大项目需要认真评估(可用的库文件、用以修复bug资源量等等)
“node可以运行在windows上吗”
不行。如果你使用windows,你需要安装运行linux的虚拟机(我推荐 VirtualBox)。Windows支持已经提上议程,但是不要傻傻苦等数月,除非你想提供援手。(注明:原文比较老,现在早就可以运行于windows了)
“用node我可以操作DOM吗?”
不错的问题!不行,DOM是存在于浏览器中的,然而node的js 引擎(v8)已经完全从浏览器环境脱离了。不过,有人正致力于用node模块实现DOM,这项工作很可以让像浏览器端代码单元测试这种工作成为可能。
不管怎样,测试驱动开发可以助你更容易进行易于维护的设计。
“谁在使用node?”
在node维基百科里有个小的不完善的名单。雅虎正在试验基于node的YUI, Plurk网站正在使用node提供云服务,Paul Bakaus正在搭建的意识游戏引擎后端也使用node。Joyent公司雇用node的作者并且引入大量投资进行这项开发。对了,Heroku刚发表了一篇文章《主机支持node.js》。
时间匆忙,翻译水平有限,大家凑合看吧。想看原文(作者Felix Geisendörfer)的,点这里:understanding nodejs