转载自http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb

当我向人们介绍node.js时,通常会得到两种反应,一种人马上就能了解,另一种则是非常困惑。

如果你是第二种人,请看一下我对node的解释:

  • 它是一个命令行工具。你可以通过下载源码压缩包,编译并安装;
  • 它能让你在你的终端上运行JavaScript程序,只需要输入"node my_app.js";
  • V8 javascript引擎(Google Chrome的脚本引擎,保证了Chrome的快速运行)负责执行JS文件;
  • Node 提供了一个JavaScript API用于访问网络和文件系统。

“但是我用ruby、python、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两个任务,分别是读和写一个文件,然后就sleep了。一旦node完成一个任务,就调用回调函数。但是每次只能调用一个回调函数。在该回调函数执行完之前,其他回调函数必须排队等待。此外,我们无法确定回调函数的执行顺序。

“所以我不用担心数据的并发访问问题?”

对!这正是JavaScript单线程和事件循环设计的美妙之处。

“很好,但我为啥要用它?”

一个原因是执行效率。在一个web应用中,你的总响应时间通常是数据库查询时间的总和。使用node,你可以同时进行所有的查询,将响应时间减少到执行最慢查询的时间。

另一个原因是Javascript。你可以使用node实现浏览器和后端共享代码。JavaScript正在逐步成为一个通用编程语言。无论你过去使用python、ruby、java还是php……你或多或少都用过JS,不是吗?

最后一个原因是运行速度。V8正在持续地提高运行速度以成为最快的动态语言解释器之一。我找不到任何其他语言像JavaScript这样如此激进地提高运行速度。此外,node的I/O工具非常地轻,使你可以尽可能完全利用系统的I/O能力。

“所以你是说将来我应该一直用node编写我的所有程序?”

是又不是。只使用一种编程语言和工具会让我们的眼光变得狭窄。(原文:当你开始挥舞node大锤时,一切事物在你眼里都像是一个钉子)但是如果你面临某个任务的deadline时,你可以基于如下的分析进行选择:

  • 低响应时间和高并发是否重要?Node非常擅长这个;
  • 工程的规模有多大?小工程还好。大工程则需要认真评估。(可用的库,修正bug和并行开发的资源等)

“node可以在Windows上运行么?”

不行,如果你用的是windows,你需要运行linux的虚拟机。支持Windows是node的开发计划之一。但是不要为此而等待。(PS:这篇文章是2010年写的,现在已经有支持windows的node了)

“我可以通过node访问DOM么?”

好问题!不行,DOM是浏览器的一个接口,node的JS引擎(V8)则完全从那些混乱中分离出来了。但是,有些人在实现DOM的node模块,这将使浏览器端代码的单元测试成为可能。

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

这取决于你过去的经验了。如果你已经学过浏览器的AJAX调用和用户事件模型,那么使用node完全不是问题。另外,测试驱动开发可以帮助你进行可维护的设计。

“谁在用node?”

这是一个不完整清单。node wiki(滚动到"Companies using Node")Yahoo正在尝试将node用在YUI上,Plurk正在使用它做大规模评论(原文:massive comet,怀疑是笔误),Paul Bakaus(jQUery UI作者)正在制作一个牛逼的游戏引擎,其中在后端用到了node。Joyent聘请了Ryan Dahl(node创始人)并让其担任主要开发。

噢,Heroku刚宣布支持node.js主机。

“我去哪了解更多信息?”

Time Caswell 的博客How To Node。在twitter上Follow#nodejs。订阅这些邮件清单。加入IRC channel, #node.js。

此外,我也将继续在debuggable.com发表文章。

了解node.js的更多相关文章

  1. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  2. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  3. Node.js:进程、子进程与cluster多核处理模块

    1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...

  4. Node.js:理解stream

    Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...

  5. Node.js:Buffer浅谈

    Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...

  6. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  7. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

  8. Node.js入门(一)

    一.Node.js本质上是js的运行环境. 二.可以解析js代码(没有浏览器安全级的限制): 提供系统级的API:1.文件的读写 2.进程的管理 3.网络通信 三.可以关注的四个网站: 1.https ...

  9. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

  10. Node.js入门

    开始之前,安利一本正在看的书<站在两个世界的边缘>,作者程浩,上帝丢给他太多理想,却忘了给他完成理想的时间.OK,有兴趣的可以看一看. node.js如标题一样,我也是刚开始接触,大家一起 ...

随机推荐

  1. 工作流软件如何成为未来web的支柱

    此文作者是 Kevin Lindquist,工作流平台Decisions的营销负责人,原文发表于VB上. Web 3.0 正在敲门,但是开门的人你永远都想不到:工作流软件. 传统上工作流软件是企业级的 ...

  2. chrome浏览器默认样式覆盖input背景

    问题描述:input表单添加了背景图片,结果自动填充是,编程了一个淡黄色矩形方框. 解决方案:网上查询了很多的解决方式,基本都不管用,这里我简单说两个. 1.去除黄色背景 input:-webkit- ...

  3. PS字体工具字体显示不出来

    显示一个小点:搜索了各种答案,扩大字号(最大72)更改前景色和背景色,最正确的解释就是分辨率太低,我发现分辨率是1,一般的设置成300,1分辨率情况下可以在图层那选择文字图层,然后按ctrl+t,拉大 ...

  4. 天草(初级+中级+高级)VIP和黑鹰VIP破解教程(全部iso下载地址)

    以下就是我收集的教程地址,之前我收集到的都是一课一课下载的,虽然这样,我也下载完了天草的全部课程.这里分享的是在一起的iso文件,比起一课课下载爽多了.~~ 还有这些教程都是从零起点开始教的,不用担心 ...

  5. Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderListener(Maven工程)

    Eclipse中tomcat部署工程启动后报错: 严重: Error configuring application listener of class org.springframework.web ...

  6. C++静态变量对象的建立和删除,兼论MFC开始运行的起点(全局对象)

    看了不少C++书,当讲到静态变量的时候,总是以int成员来举例,是啊,这样很好理解.但是如果这个静态变量是一个对象行不行呢?不仅行,有时候还非常必要,而且别有洞天. 比如: // .h 文件 clas ...

  7. sharepoint 2010 如何创建文档库内容类型content type

    转:http://biancheng.dnbcw.info/linux/441643.html 这次主要是记录下,如何来创建文档内容类型,例如新建文档的时候,可以选择不同模板,有word,excel文 ...

  8. (转载)MySql按日期进行统计(前一天、本周、某一天)

    (转载)http://www.yovisun.com/mysql-date-statistics.html 在mysql数据库中,常常会遇到统计当天的内容.例如,在user表中,日期字段为:log_t ...

  9. 《C语言程序设计现代方法》第2章 C语言基本概念

    C语言的基本概念 第一个C程序例子. /* pun.c */ #include <stdio.h> int main(void) { printf("To C, or not t ...

  10. JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)

    利用节点间的层次关系获取节点: 上一节讲了3中获取的方式: * ※※一.绝对获取,获取元素的3种方式:-Element * 1.getElementById(): 通过标签中的id属性值获来取该标签对 ...