基本信息
- 原书名:Node: Up and Running, Scalable Server-Side Code with JavaScript
- 原出版社: O'Reilly Media; 1 edition
- 作者: (英)Tom Hughes-Croucher Mike Wilson
- 译者: 郑达韡
- 丛书名: 图灵程序设计丛书
- 出版社:人民邮电出版社
- ISBN:9787115306180
- 上架时间:2013-2-27
- 出版日期:2013 年2月
- 开本:16开
- 页码:180
- 版次:1-1
- 所属分类:计算机 > 软件与程序设计 > 网络编程
编辑推荐
介绍
Node.js正迅速成为 Web开发社区里最有影响力的技术。本书的目标是让开发人员有效地了解如何入手试用 Node。
本书读者应该对 JavaScript及编程有一定程度的了解。除了详细介绍 Node提供的
API外,我们还将花大量篇幅来介绍服务器事件驱动开发的重要概念。
通过阅读本书,你不但能够了解 Node平台本身,还能掌握 Node为快速高效地构建高扩展性网站和服务所提供的多个重要模块。
排版约定
本书使用了下列排版约定。
?楷体 表示新术语。
?等宽字体 表示程序片段,也表示在正文中出现的变量、函数名、数据库、数据类型、环境变量、语句和关键字等。
?加粗等宽字体 表示用户的输入。
内容简介
作译者
Mike Wilson 程序员,系统架构师和管理员。曾与许多世界一流公司开展过合作,包括迪士尼、微软和麦当劳。他有多年网络开发经验,从小企业网站到百万用户在线的大型MMO服务器集群,他都曾设计并构建过。在闲暇时间,Mike会更新他的个人博客(http://www.alwaysgetbetter.com),在论坛上发表文章,以及尝试新的框架和软件。
郑达韡 技术爱好者,热衷于编写Linux服务器端程序。自从接触Node.js,便爱不释手。翻译此书也是作为对开源社区的一点贡献,希望本书能够帮助中国开发者,并且吸引更多人来使用Node.js。个人主页:http://zdwalter.info。
目录
第一部分 基础入门
第1 章 Node.js 简介 3
1.1 安装Node.js 4
1.2 开始写代码 7
1.2.1 Node REPL 7
1.2.2 编写首个服务器程序 9
1.3 为什么选择Node 11
1.3.1 高性能Web 服务器 11
1.3.2 专业的JavaScript 12
1.3.3 浏览器之战 2.0 13
第2 章 编写有趣的应用 15
2.1 创建一个聊天服务器 15
2.2 我们也来编写个Twitter 23
第3 章 编写健壮的Node 程序 33
3.1 事件循环 33
3.2 模式 39
3.3 编写产品代码 44
3.3.1 差错处理 45
3.3.2 使用多处理器 46
前言
Node.js正迅速成为 Web开发社区里最有影响力的技术。本书的目标是让开发人员有效地了解如何入手试用 Node。
本书读者应该对 JavaScript及编程有一定程度的了解。除了详细介绍 Node提供的 API外,我们还将花大量篇幅来介绍服务器事件驱动开发的重要概念。
通过阅读本书,你不但能够了解 Node平台本身,还能掌握 Node为快速高效地构建高扩展性网站和服务所提供的多个重要模块。
排版约定
本书使用了下列排版约定。
楷体 表示新术语。
等宽字体 表示程序片段,也表示在正文中出现的变量、函数名、数据库、数据类型、环境变量、语句和关键字等。
加粗等宽字体 表示用户的输入。
这个图标表示警告或警示。
使用代码示例
本书用于帮助你完成工作。通常,你可以在程序或文档中使用本书提供的代码。除非你重新发布我们的大量代码,否则不需要联系我们来获得许可。比如,在程序中使用本书代码的一些片段是无需我们许可的,但是出售或再分发 O’Reilly的图书示例光盘显然是需要授权的。引用本书或引用示例代码来回答问题是不需要授权的,但是将本书的大量示例代码整合到你自己的产品文档必须得到授权。
我们希望你在使用时声明引用信息,但不强求。引用信息通常包括书名、作者、出版社和 ISBN。例如: “Node: Up and Running by Tom Hughes-Croucher and Mike Wilson (O’Reilly). Copyright 2012 Tom Hughes-Croucher and Mike Wilson, 978-1-449-39858-3.”
如果你认为对示例代码的使用需要授权,请通过邮箱 permissions@oreilly.com联系我们。
Safari?在线图书
在线图书是应需而变的数字图书馆。它能够让你非常轻松地搜索 7500多种技术性和创新性参考书以及视频,以便快速地找到需要的答案。
订阅后就可以访问在线图书馆内的所有页面和视频。可以在手机或其他移动设备上阅读,还能在新书上市之前抢先阅读,也能够看到还在创作中的书稿并向作者反馈意见。复制粘贴代码示例、放入收藏夹、下载部分章节、标记关键点、做笔记甚至打印页面等有用的功能可以节省大量时间。
这本书英文版也在其中。欲访问本书的英文版电子版,或者由 O’Reilly或其他出版社出版的相关图书,请到 http://my.safaribooksonline.com免费注册。
我们的联系方式
请将有关此书的意见及问题发给出版商:美国:
序言
2008年,我在寻找一个新的编程平台来做网站。我并不是想要一门新的语言,实际上,语言自身的细节对我来说并不重要。我真正关心的是,该语言能否提供先进的推送功能并集成到网站中来,就像我在 Gmail中看到的那样——能够从服务器端把数据主动推送给用户,而不是采用不断轮询拉取数据的方式。现有的平台都把服务器作为接受请求然后返回相应内容的设备。要把事件推送到浏览器,平台需要能够持续处理大量打开的网络连接,而这其中有许多连接其实是空闲的。
Google在 2008年年末推出了 Chrome浏览器和崭新的 JavaScript引擎 V8。这是一个为了更快的 Web体验而专门制作的更快的 avaScript引擎, V8让 Web应用大大提速了。突然之间, Google、Apple、Mozilla和微软之间的 JavaScript军备竞赛就开始了。再加上 Doug Crockford的 JavaScript: The Good Parts一书的面世,把 JavaScript从一门人人轻视的语言一下变成了重要的语言。
于是,我有了个主意: JavaScript结合非阻塞 socket!因为 JavaScript并没有现成的 socket库,所以我可以勇做第一人,来推介这个崭新且大有前途的接口。只要把 V8接上我的非阻塞 C代码,我就能把它完成。我终止了当时承接的工作,开始全力实现这个想法。当我编写好并发布了最初的版本后,立刻就有用户开始反馈 bug,然后我开始不停地处理这些 bug,就这样,不知不觉过去了 3年。
实践证明, JavaScript与非阻塞 socket配合得相当完美。开始我并不敢肯定这一点,但闭包让所有事情变得可能。只需要简单的几行 JavaScript代码,就可以构建出非常复杂的非阻塞服务器。我最初还担心,系统会过于小众,但很快我就放心了,因为世界各地的黑客们纷纷开始为其编写程序库。唯一的事件循环队列和纯粹的非阻塞接口让程序库不必增加昂贵的线程,就能添加越来越多的复杂功能。
在 Node中,用户会发现系统在默认情况下就能很好地扩展。因为其核心系统做出的选择是,不允许系统中的任何部分做出太坏的事情来(比如堵塞当前线程),所以整体性能也不会太差。如果以能够处理的流量作为计量, Node的方法要比传统的阻塞式操作好上一个数量级。
现在, Node已经在全球被众多公司所使用,包括创业公司、 Voxer、Uber,以及沃尔玛、微软这样的知名公司。可以说,每天通过 Node处理的请求数以亿计。随着越来越多的人参与到本项目中来,可用的第三方模块和扩展增长迅猛,而且质量也不断提升。虽然我曾建议将 Node用于关键任务应用,但现在,即便是要求最苛刻的服务器系统,我也会热诚地推荐使用 Node。
本书探讨了 Node及许多第三方模块,并给出了指导练习,旨在带你深入浅出地了解 Node。通过学习本书,你不但能够熟悉 JavaScript的基本操作,还能逐渐开始构建复杂、交互式的网站。如果你曾经使用过其他服务器端 Web框架,你会震惊于用 Node这么容易就能编写一个服务器!
——Ryan Dahl,Node.js的创建者
Brendan Eich序
1995年 4月,我加入了 Netscape公司,负责“把 Scheme添加到浏览器里”。一两个月后,这个任务却演变成了“创造一门看起来像 Java的脚本语言”。更糟糕的是,当时正在商议把 Java添加到 Netscape里,所以 Netscape的一部分人对是否需要一门“第二语言”表示怀疑。同时,另外一部分人想要的是类似 PHP的东西,也就是为公司计划发布的服务器产品 LiveWire写的一门 HTML模板语言。
于是,在 1995年 5月,我用 10天时间开发了 Mocha原型(代码名称是 Marc An-dreessen挑选的)。当时, Marc、Rick Schell(Netscape的工程副总裁)和 Sun公司的 Bill Joy这几位高层管理者都支持我继续做下去,以消除人们对 Java之后“第二语言”的怀疑。(极具讽刺的是, Java几乎已在浏览器世界里绝迹了,而 JavaScript则成为 Web客户端的主导。)
为了消除一切疑虑,我需要在 10天内拿出一个能演示的原型。当时我日以继夜地工作,结果引入了一些设计语言的错误(其中一些重复了 LISP演变过程中的设计错误),但最终还是赶在期限前完成了演示。
人们很惊讶,我竟然用不到两周的时间就完成了一门语言的编译器和运行环境。其实自从大三那年由物理专业转到数学 /计算机科学专业起,我已经积累了十多年的经验。我一直很喜欢形式语言和自动机理论,并出于兴趣编写了自己的语言解析器和解析器生成器。在 Silicon Graphics的时候,我编写的网络监控工具包含了包头匹配、协议描述语言和编译器。此外,我还是 C和 Unix的忠实粉丝。所以,弄出 Mocha只不过是一件需要持续工作与专注的事情。
1995年秋天, Netscape市场部把 Mocha改名为 LiveScript,好让它和服务器产品 LiveWire的名字相匹配。 1995年 12月初, Netscape和 Sun最终签订一份商标使用许可协议,由创始人 Bill Joy代表 Sun公司签字生效, LiveScript正式改名为 JavaScript(JS)。
因为有 LiveWire服务器的计划,我在头 10天里实现了一个字节码编译器和解释器,同时还有反编译器和运行时程序(内置我们今天熟悉的 JS对象和函数: Object、 Array、Function等)。对于一个小巧的客户端脚本来说,字节码有点大材小用了,因为 LiveWire产品里包含了一种特性,即能够保存编译好的字节码以供服务器端应用更快地启动。
最终,与 Netscape其他大部分业务一样, Netscape的服务器端 JavaScript产品也失败了,因为微软把 IE浏览器绑定在 Windows里,并进入了 Netscape原本想开拓的浏览器之外的服务器市场。而绑定在 Windows里的 IE是免费的,因此商业用户不再需要单独购买付费浏览器证书了。
尽管 LiveWire失败了,但早在 1995年我们就已经看到端到端 JavaScript编程的吸引力。用户也看到了这个趋势,但这段历史只有一小部分人知道。今天, Node.js避开了 LiveWire当年的致命错误:把堵塞式输入 /输出包含在内,并在服务器端使用多进程模型,因而可扩展性并不是很好。
2009年的 JSConf EU大会上, Ryan展示了 Node.js。我为能够了解 Node而感到欣慰,也很高兴它能够很好地实现彻底使用 JavaScript的愿景,特别是它能从底层构建起整个非阻塞 I/O系统。 Ryan和其他核心成员在保持内核精致方面做得很好。 Isaac及所有模块所有者共同构建起的优秀模块系统分担了内核的压力,所以它不会太过臃肿。此外,围绕 Node代码成长起来的社区也很出色。
结果,这就诞生了一个有趣高效的系统,它不仅能够构建服务器端,而且能够适应日益提高的产能,还可以很方便地进行 JavaScript客户端程序开发,并能够促进代码重用和进化。如果没有 Node,JavaScript将只能绑定在 Web客户端上,其备受指责的文档对象模型以及其他一些历史遗留问题将会日益突出。 Node帮助 JavaScript摆脱了客户端的限制。
媒体评论
——Ryan Dahl,Node.js的创建者
“本书很好地诠释了Node的精髓,并讲述了如何用它构建交互式网络应用和网站。Node棒极了,而本书就是关于Node的很好的指南,请尽情享受阅读的乐趣吧!”
——Brendan Eich,JavaScript的创建者
书摘
Node.js简介
Node功能强大,特别是它能在浏览器以外运行 JavaScript。本书将阐述这一功能为何如此重要,以及使用 Node的好处。首先来概述一下这些特性。
很多人将 JavaScript用在前端网站应用开发上。 Node.js将这一流行编程语言扩展到了更多的领域,特别是后端网站服务器开发。 Node有几个重要的特性值得我们关注。
Node是对高性能 V8引擎的封装( V8是 Google Chrome浏览器的 JavaScript引擎),通过提供一系列优化的 API类库,使 V8在浏览器之外依然能高效运行。比如,在服务器端开发程序常常需要处理二进制文件, JavaScript语言本身对此支持得不好,因此 V8也如此,而 Node的 Buffer类库提供了轻松操作二进制数据的方法。使用 Node,除了可以直接操作 V8的 JavaScript运行时状态,还能在开发上得到更多益处。
Node的一大特性是对高性能的追求。首先, V8采用了编译领域的一些最新技术,使得用 JavaScript等高级语言编写的代码在运行效率上能够接近用 C等底层语言编写的代码,并且开发成本有所降低。
其次, Node利用了 JavaScript的事件驱动( event-driven)特性来构建高度可扩展的服务器程序。 Node采用了事件循环(event loop)架构,让开发高效的服务器程序变得简单和安全。对比其他构建高性能服务器的架构, Node既保证了性能,又降低了开发难度。这是一个极其重要的特性。大家都知道开发多线程并行程序很困难,而且非常容易出错。 Node却巧妙地回避了这一难题,并且保持着令人惊讶的高性能。当然,任何方法都存在利弊得失,在后续章节中,将会详细讨论 Node在这其中是如何取舍的。
Node提供了一系列“非阻塞”函数库来支持事件循环特性。比如,把文件系统或数据库操作封装成事件驱动形式的函数接口。当对文件系统发起请求时,程序不需要闲置等待硬盘把文件读取出来。就像在浏览器中 onclick事件被触发后会自动调用代码一样,非阻塞函数会在它获得文件内容后通知 Node中的程序。这种方式让访问慢资源变得简单可扩展,这对 JavaScript程序员来说可谓驾轻就熟,甚至普通人也很容易掌握。
Node的强大特性还包括能在服务器端运行 JavaScript,尽管这样的特性并非 Node所独有。如果想在主流浏览器上运行自己的应用,我们除了 JavaScript之外没有什么其他选择。那么要想同一份代码在浏览器客户端和服务器间共享,也只能选择 JavaScript。现在出现了越来越多用 JavaScript编写的复杂网页应用(如 Gmail),如果能把越多的代码共享到服务器上运行,那么开发的成本也会越低。 Node为服务器端共享网页的 JavaScript代码铺平了道路,这是 PHP、Java、Ruby或 Python等其他编程语言无法提供的。虽然也有其他平台提供了在服务器端使用 JavaScript的手段,但 Node已经先声夺人,迅速成为这个领域的主流平台。
除了可以用 Node现有的库来构建应用外,开发者也可以轻松为其扩展新的库,这实在令人欣喜。正因为 Node很容易扩展,在 Node项目对外发布后,其社区便迅速涌现出大量扩展库。其中许多是连接数据库或其他软件的驱动接口,还有相当一部分是独立有用的软件。
Node社区也是非常值得称赞的。虽然其社区非常年轻,但已经罕见地受到许多开发者的热情关注。初学者和专家们都聚集在此项目上,使用它并反馈贡献到社区中,致力于把 Node社区建设成每个人都能够在其中快乐地探索、分享知识并获得支持的地方。
1.1安装 Node.js
安装 Node.js是极其简单的事情。 Node能够运行在 Windows、Linux、Mac,以及 Solaris和 BSD等其他 POSIX系统上。 Node.js能够在以下两个地址获得:项目官方主页( http://nodejs.org)和 GitHub代码库( http://github.com/joyent/node)。你可以优先选择 Node主页上提供的稳定发布版。包含最新特性的版本托管在 GitHub上,供核心开发团队使用。任何人想获得一份拷贝也能从 GitHub上下载。虽然这些新特性通常很炫,但它们没有稳定版本那么可靠。
让我们从安装 Node.js开始。首先要从 Node主页下载最新发布的版本。在 Node主页上,找到下载的链接。本书印刷时的稳定发布版本是 0.6.131。Node主页提供了 Windows和 Mac的安装程序,以及源代码包。如果你在使用 Linux,可以选择从源代码安装,也可以使用常见的包管理程序( apt-get、yum等)。
Node.js版本号依照 C的习惯:主版本 .次版本 .补丁。稳定版本的次版本号是偶数,开发版本的次版本号是奇数。虽然不知道 Node什么时候会到达 1.0版本,但可以认定是在 Windows和 Unix版本合并成一个版本同时发布时。
如果你使用安装包,可以直接跳到 1.2节。若你采用源代码安装,需要首先进行解压。使用 tar命令,带上 xzf参数。 x参数表示解压(而不是压缩),z参数告诉 tar用 GZIP算法进行解压, f表示根据最后一个参数的文件名来解压(见例 1-1)。
例 1-1代码解压
enki:Downloads $ tar xzf node-v0.6.6.tar.gz enki:Downloads $ cd node-v0.6.6 enki:node-v0.6.6 $ ls AUTHORS Makefile common.gypi doc test BSDmakefile Makefile-gyp configure lib tools ChangeLog README.md configure-gyp node.gyp vcbuild.bat LICENSE benchmark deps src wscript enki:node-v0.6.6 $
下一步是根据你的系统进行配置。 Node.js安装采用 configure/make方法。 configure程序将扫描你的系统,查找 Node依赖库的路径。 Node通常需要很少的依赖库。安装需要 Python 2.4或更高版本,如果你想使用传输层安全( TLS)或加密(如 SHA1),Node将需要 OpenSSL开发库。运行 configure程序将提示你缺少哪些依赖库(参见例 1-2)。
例 1-2Node安装的配置