本章内容 Node.js是什么 服务端JavaScript Node的异步和事件触发本质 Node为谁而生 Node程序示例 Node.js是什么? 你很可能已经有所耳闻,甚至已经用上了,你也有可能对它很好奇。现在Node还很年轻(它的首次亮相是在2009年),却非常流行。它在Github受关注项目排行榜上位列第二(https://github.com/joyent/node),在Google小组(http://groups.google.com/group/nodejs)和IRC频道(http://webchat.freenode.net/?channels=node.js)中都有很多追随者,并且社区同仁们在NPM包管理网站(http://npmjs.org)上发布的模块多达15 000 多个。所有这些都足以表明这个平台的强大吸引力。 Node创始人Ryan Dahl 2009年柏林JSCONF的网站上有Node创始人Ryan Dahl第一次介绍Node的视频:http://jsconf.eu/2009/video_nodejs_by_ryan_dahl.html 。 官网上(http://www.nodejs.org)给Node下的定义是:“一个搭建在Chrome JavaScript运行时上的平台,用于构建高速、可伸缩的网络程序。Node.js采用的事件驱动、非阻塞I/O模型,使它既轻量又高效,并成为构建运行在分布式设备上的数据密集型实时程序的完美选择。” 我们在本章中会看到下面这些概念: 为什么JavaScript对服务端开发很重要; 浏览器如何用JavaScript处理I/O; Node在服务端如何处理I/O; DIRT程序是什么意思,为什么适于用Node开发; 几个基础的Node程序示例。 我们先把视线转到JavaScript上…… 1.1 构建于JavaScript之上 无论好坏,JavaScript都是世界上最流行的编程语言 。只要你做过Web程序,就肯定遇到过JavaScript。JavaScript几乎遍布于Web上的每个角落,所以它已经实现了Java在20世纪90年代“一次编写,处处运行”的梦想。 在2005年Ajax革命前后,JavaScript从一门“写着玩儿”的语言变成了一种被人们用来编写真正的、重要的程序的语言。这些程序中比较引人注目的先行者是Google地图和Gmail,但现在类似的Web应用有一大堆,从Twitter到Facebook,再到GitHub。 自从2008年年末Google Chrome发布以来,得益于浏览器厂商(Mozilla、微软、苹果、Opera和谷歌)的白热化竞争,JavaScript的性能以不可思议的速度得到了大幅提升。现代化JavaScript虚拟机的性能正改变着可以构建在Web上的应用类型。 一个很有说服力的、坦率地说是令人震惊的例子是jslinux, 一个运行在JavaScript中的PC模拟器,它能加载Linux内核,可以利用终端会话与其交互,还能编译C程序,而这一切都是在浏览器中完成的。 在服务器端编程,Node使用的是为Google Chrome提供动力的V8虚拟机。V8让Node在性能上得到了巨大的提升,因为它去掉了中间环节,执行的不是字节码,用的也不是解释器,而是直接编译成了本地机器码。Node在服务器端使用JavaScript还有其他好处。 开发人员用一种语言就能编写整个Web应用,这可以减少开发客户端和服务端时所需的语言切换。这样代码可以在客户端和服务端中共享,比如在表单校验或游戏逻辑中使用同样一段代码。 JSON是目前非常流行的数据交换格式,并且还是JavaScript原生的。 有些NoSQL数据库中用的就是JavaScript语言(比如CouchDB和MongoDB),所以跟它们简直是天作之合(比如MongoDB的管理和查询语言都是JavaScript;CouchDB的map/reduce也是JavaScript)。 JavaScript是一门编译目标语言,现在有很多可以编译成JavaScript的语言 。 Node用的虚拟机(V8)会紧跟ECMAScript标准。 换句话说,在Node中如果想用新的JavaScript语言特性,不用等到所有浏览器都支持。 JavaScript竟然成了一种引人瞩目的编写服务端应用的语言,之前谁能料到呢?基于前面提到的覆盖范围、性能和其他特性,Node已经赚足了眼球。但JavaScript只是整幅拼图中的一块;Node使用JavaScript的方式则更为有趣。为了理解Node环境,我们先看看你最熟悉的JavaScript环境:浏览器。