编辑推荐

适读人群:使用Node.js的开发人员
  

一本让你真正学会|用好Node高级技术的进阶读物


  

Node.js硬实战:115个核心技巧》精心组织115个已通过测试的例子,并细致剖析保障这些Node应用良好运行的实用技术;采用提出问题/解决问题模式,囊括基于事件的编程、流、集成外部应用和发布等重要话题。

■从基础到进阶的常见使用例子

■设计和编写模块

■测试和调试Node应用

■Node和现有的系统集成


  

内容简介

  

《Node.js硬实战:115个核心技巧》是一本面向实战的Node.js开发进阶指南。作为资深专家,《Node.js硬实战:115个核心技巧》作者独辟蹊径,将着眼点放在Node.js的核心模块和网络应用,通过精心组织的丰富实例,向读者充分展示了Node.js强大的并发处理能力,读者从中可真正掌握Node的核心基础与高级技巧。《Node.js硬实战:115个核心技巧》总共有三部分内容,第一部分是Node.js的基础核心,涉及Buffer、流、网络和进程等相关知识;第二部分是项目实践,涉及测试、Web开发、调试,生产环境等重要话题;第三部分则完整创建了一个Node.js模块。每部分涉及的技术都有详细讲解及注释详尽的示例代码,以帮助读者们更好地理解要点及其应用。

《Node.js硬实战:115个核心技巧》适合有一定JavaScript基础,追求在Node.js上更进一步的开发者。


  

作者简介

承竹,前支付宝前端开发工程师,现唯品会高级开发工程师。爱折腾,对计算机世界充满好奇,喜欢JavaScript语言,致力于成为一个理想中的靠谱软件工程师。徐佶辉,花名慕陶,08年开始工作,现任蚂蚁金服前端开发。在翻译《Node.js硬实战》这《Node.js硬实战:115个核心技巧》的过程中学到了很多,也深深发现这是本介绍node不可多得的好书。

MarcHarter致力于构建大型项目,包括高可用的实时应用、流式接口和其他数据密集型系统。

Young是一位经验丰富的JavaScript开发者,定期在DailyJS博客发表文章。

精彩书评

  NULL

目录

第一部分Node基础

1入门................................................................2

1.1Node入门3

1.1.1为什么使用Node3

1.1.2Node的主要特性5

1.2构建一个Node应用7

1.2.1创建一个新的Node项目8

1.2.2创建一个流的类9

1.2.3使用流10

1.2.4编写测试11

1.3总结13

2全局变量:Node环境...............................................15

2.1模块16

技巧1安装与加载模块16

技巧2创建与管理模块17

技巧3加载一组相关的模块20

技巧4使用路径22

2.2标准I/O以及console对象23

技巧5标准I/O流的读写24

技巧6打印日志消息25

技巧7基准测试27

2.3操作系统与命令行29

技巧8获取平台信息29

技巧9传递命令行参数30

技巧10退出程序31

技巧11响应信号量33

2.4使用timer延迟执行35

技巧12通过setTimeout延迟执行函数35

技巧13通过定时器定时调用回调函数37

技巧14安全的操作异步接口38

2.5总结41

3Buffers:使用比特、字节以及编码..................................43

3.1修改数据编码44

技巧15Buffer转换为其他格式44

技巧16使用Buffers来修改字符串编码46

3.2二进制文件转换为JSON49

技巧17使用Buffer来转换原始数据49

3.3创建你自己的二进制协议65

技巧18创建自己的网络协议65

3.4总结71

4Events:玩转EventEmitter..........................................72

4.1基础用法73

技巧19从EventEmitter继承73

技巧20混合EventEmitter76

4.2异常处理78

技巧21管理异常78

技巧22通过domains管理异常80

4.3高级模式82

技巧23反射82

技巧24探索EventEmitter85

技巧25组织事件名称87

4.4第三方模块以及扩展88

技巧26EventEmitter的替代方案89

4.5总结91

5流:最强大和最容易误解的功能....................................93

5.1流的介绍94

5.1.1流的类型94

5.1.2什么时候使用流94

5.1.3历史95

5.1.4第三方模块中的流96

5.1.5流继承事件97

5.2内置流98

技巧27使用内置的流来实现静态web服务器98

技巧28流的错误处理101

5.3第三方模块和流102

技巧29使用流的第三方模块102

5.4使用流基类105

技巧30正确地从流的基类继承105

技巧31实现一个可读流107

技巧32实现一个可写流111

技巧33使用双工流转换和接收数据113

技巧34使用转换流解析数据114

5.5高级模式和优化118

技巧35流的优化118

技巧36使用老的流API121

技巧37基于功能的流适配123

技巧38测试流125

5.6总结128

6文件系统:通过异步和同步的方法处理文件.........................129

6.1fs模块概述130

6.1.1POSIX文件系统包装器130

6.1.2流132

6.1.3批量文件操作133

6.1.4文件监视133

6.1.5同步的替代方案133

技巧39读取配置文件134

技巧40使用文件描述136

技巧41使用文件锁137

技巧42递归文件操作142

技巧43编写文件数据库147

技巧44监视文件以及文件夹151

6.2总结154

7网络:Node真正的“Hello,World”................................156

7.1Node中的网络156

7.1.1网络技术157

7.1.2Node网络模块161

7.1.3非阻塞网络和线程池162

7.2TCP客户端和服务端163

技巧45创建TCP服务端和客户端163

技巧46使用客户端测试TCP服务端165

技巧47改进实时性低的应用168

7.3UDP客户端和服务端170

技巧48通过UDP传输文件170

技巧49UDP客户端服务应用174

7.4HTTP客户端和服务端179

技巧50HTTP服务器179

技巧51重定向181

技巧52HTTP代理186

7.5创建DNS请求189

技巧53创建DNS请求189

7.6加密191

技巧54一个加密的TCP服务器192

技巧55加密的Web服务器和客户端196

7.7总结198

8子进程:利用Node整合外部应用程序..............................200

8.1执行外部应用程序202

技巧56执行外部应用程序202

8.1.1路径和Path的环境变量203

8.1.2执行外部程序时候出现的异常204

技巧57流和外部应用程序205

8.1.3外部应用程序的串联调用206

技巧58在shell中执行命令208

8.1.4安全性和shell命令执行209

技巧59分离子进程210

8.1.5父进程和子进程之间的I/O处理211

8.1.6引用计数和子进程213

8.2执行Node程序213

技巧60执行Node程序214

技巧61ForkingNode模块216

技巧62运行作业218

8.2.1工作池220

8.2.2使用池模块222

8.3同步运行223

技巧63同步子进程223

8.4总结227

第二部分实践中的技巧

9网络:构建精简的网络应用.........................................230

9.1前端技术231

技巧64快速的静态网站服务器231

技巧65在Node中使用DOM236

技巧66在浏览器端使用Node模块238

9.2服务端技术241

技巧67Express路由分离241

技巧68自动重启服务器245

技巧69配置web应用248

技巧70优雅地处理错误253

技巧71RESTfulweb应用257

技巧72使用自定义的中间件267

技巧73使用事件进行解耦273

技巧74使用WebSockets来处理sessions276

技巧75升级Express3到4281

9.3web应用程序的测试285

技巧76测试路由286

技巧77为中间件注入创建seams288

技巧78测试依赖远程服务的应用291

9.4全栈框架297

9.5实时服务299

9.6总结300

10测试:编写健壮代码的关键.........................................301

10.1Node测试的相关介绍303

10.2使用断言编写简单的测试304

技巧79用内置的模块编写测试305

技巧80编写验证异常的测试308

技巧81创建自定义的断言312

10.3测试装置314

技巧82使用一个测试装置组织测试314

10.4测试框架318

技巧83使用Mocha编写测试319

技巧84使用Mocha测试web应用323

技巧85万能测试协议(TAP)328

10.5测试工具331

技巧86持续集成331

技巧87数据库装置335

10.6扩展阅读343

10.7总结343

11调试:用于发现和解决问题.........................................344

11.1内省345

11.1.1显式异常345

11.1.2隐藏的异常346

11.1.3错误事件346

11.1.4错误参数347

技巧88处理未捕获的异常348

技巧89检查我们的Node代码351

11.2问题的调试352

技巧90使用Node内置的调试器352

技巧91使用NodeInspector359

技巧92对Node应用进行性能分析361

技巧93内存泄漏的调试365

技巧94使用REPL来检测运行中的程序370

技巧95跟踪系统调用377

11.3总结381

12生产环境中的Node:安全地部署应用程序..........................382

12.1部署383

技巧96将Node程序部署到云端383

技巧97使用Apache和Ngnix部署Node程序389

技巧98在80端口上安全地运行Node程序392

技巧99保持Node进程一直运行394

技巧100在生产环境中使用WebSockets396

12.2Node程序的缓存和扩展性402

技巧101HTTP缓存402

技巧102为程序的路由和扩展使用Node代理404

技巧103使用集群保持程序的扩展性和弹性408

12.3维护413

技巧104包的优化413

技巧105日志和日志服务415

12.4更多关于Node程序的扩展性和弹性的备注418

12.5总结419

第三部分编写模块

13编写模块,掌握Node的所有.......................................422

13.1头脑风暴424

13.1.1更快的斐波那契模块424

技巧106计划编写我们的模块425

技巧107验证我们模块的想法427

13.2创建package.json文件433

技巧108创建package.json文件433

技巧109依赖处理436

技巧110语义化版本号441

13.3用户体验444

技巧111添加可执行脚本444

技巧112在本地测试模块446

技巧113在不同版本Node中测试448

13.4发布451

技巧114发布模块451

技巧115使用私有模块453

13.5总结455

A社区................................................................457

精彩书摘

译者序

JavaScript从它诞生以来就在浏览器应用中发挥着愈来愈重要的作用,同时,热爱JavaScript的人们一直在努力地将其应用在服务器领域。2009年,RyanDahl带来了Node.js,从那个时候开始,JavaScript社区出现了前所未有的繁荣。现在,Node.js对开发者来说,几乎已经是家喻户晓的了。对于传统的服务器端开发者们而言,Node.js带来了浏览器端使用已久的异步编程相关的概念,而对于前端开发者们来说,Node.js则是带来了编写服务端程序方面的挑战。当我们这些对Node.js一知半解的开发者野心勃勃想要征服Node.js时,我们需要一个经验满满的导师来指引我们前行。

我很幸运地有这样一个机会接触到这《Node.js硬实战:115个核心技巧》,并且承担起翻译的任务。我第一次阅读原著时就感觉,它是一本可以胜任Node.js导师这个角色的书籍。作者认真负责地介绍了Node.js相关的方方面面,并且附带了相当详细的例子来帮助读者快速地理解其中的要点。我相信,对于想要学习Node.js的开发者来说,《Node.js硬实战:115个核心技巧》会是一个相当好的选择。翻译书的过程,也是一个学习的过程,原谅我们水平有限,书中翻译内容难免有疏漏。

当这《Node.js硬实战:115个核心技巧》差不多翻译完成的时候,我发现已经用了好长的时间,Node.js技术更新得相当快,我相信小部分内容的细节上和现在的应用可能会出现些许差异,还请读者们谅解。

最后,在此对支持《Node.js硬实战:115个核心技巧》翻译工作的所有人们表示感谢,尤其是耐心容忍我们一再推迟交稿的编辑,真的非常感谢。

衷心希望《Node.js硬实战:115个核心技巧》能够对您有所帮助,请享受Node.js给您带来的一切,谢谢。

在你手中的是一本将带你进入了解Node旅程的书。在接下来看到的页面中,AlexYoung和MareHarter会帮助你深刻地把握Node的核心模块、网络应用等。

网络应用,是Node.js光芒闪耀的地方。亲爱的读者,你可能已经很清楚这一点,我敢说,这就是你购买《Node.js硬实战:115个核心技巧》的原因!对于读了序的这少部分人,让我来告诉你们,这一切是如何开始的。

在一开始的时候,有一个C10K的问题,这个问题是这样的:如果你要在现代的硬件中处理10000个并发连接,你会怎么做?

你可以看到,操作系统处理大量的网络连接在持续很长一段时间里都是很糟糕的。硬件在很多方面很糟糕,软件在另外一些方面也很糟糕,当硬件和软件集成在一起的时候……语言学家暂时还没有合适的词语,单纯用糟糕来形容对这一切并不公平。幸运的是,技术是一个进步的故事,硬件越来越好,软件越来越智能。操作系统,如用户软件等,在管理大量的网络连接上有了很大的进步。

在很久以前,我们征服了C10K问题,现在目标转移了,我们已经把眼光投向了C100K、C500K、C1M问题。一旦我们轻松地跨越这些界限时,我完全相信,C10M会是下一个问题。

Node.js是这个并发性不断增长的故事的一部分,它的未来是光明的。我们生活在一个日益互联的世界,这个世界需要一个强大的工具来连接一切。我相信Node.js会是那个强大的工具,我希望,在读完这《Node.js硬实战:115个核心技巧》时,你会有同样的感受。

BenNoordhuis

Cofounder,StrongLoop,Inc.

致谢

我们要感谢很多人,没有他们的帮助和支持,这《Node.js硬实战:115个核心技巧》不可能完成。

感谢ManningEarlyAccessProgram(MEAP)的在作者在线论坛发布评论和纠正的读者们。

感谢那些在书的各个阶段提供了宝贵反馈意见的技术评审们:AlexGarrett、BrianFalk、ChrisJoakim、ChristophWalcher、DanielBretoi、DominicPettifer、DylanScott、FernandoMonteiroKobayashi、GavinWhyte、GregorZurowski、HaythamSamad、JTMarshall、KevinBaister、LuisGutierrez、MichaelPiscatello、PhilippeCharrière、RockLee、ShijuVarghese和ToddWilliams。

感谢帮助我们每一步的Manning团队,尤其是我们的开发编辑CynthiaKane、编辑BenjaminBerg、校对KatieTennant,以及其他在幕后工作的人们。

特别感谢BenNoordhuis为《Node.js硬实战:115个核心技巧》写序,还有ValentinCrettaz和MichaelLevin在书出版前仔细的技术校对。

AlexYoung

如果没有DailyJS社区的鼓励,我没法完成这样的一《Node.js硬实战:115个核心技巧》。感谢近几年来和我分享模块和类库的每一个人:没有你们就无法跟上Node.js社区的脚步。同时也要感谢我的同事允许让我在生产环境中使用Node.js。最后,感谢Yuka让我相信我自己可以从事创业和写书这些如此疯狂的事情。

MarcHarter

我要感谢BenNoordhuis、IsaacSchlueter,还有TimothyFontaine,为了他们关于Node的各种IRC讨论:你们了解底层系统,以一种深刻的方式支持和影响着Node,从你们身上我们获益匪浅。另外,我要感谢和我一起写书的Alex,似乎很难能有像我这样和Alex一起写书的机会,更加有趣的是他是一个在美国中西部的使用英语的人。最后我要感谢的是我的妻子,她让这一切变得可能,我由衷地说一句,你是如此可爱,谢谢你。

关于《Node.js硬实战:115个核心技巧

《Node.js硬实战》提供给读者来深入了解Node的核心模块和包系统。我们相信这是成为一个多产和自信的Node开发者的基础。不幸的是,因为巨大并且充满活力的第三方生态系统几乎为所有的任务提供了预置好的模块,所以小小的核心很容易被错过。在这《Node.js硬实战:115个核心技巧》中,我们在官方文档的基础上来进一步实践和深入。我们想要读者能够仔细分析和研究他们编写的项目以及项目所包含的第三方模块的内部工作。

这《Node.js硬实战:115个核心技巧》不是一本Node的入门级别的读物。入门的话,我们建议阅读Manning的《Node实战》(Node.jsInAction)。这《Node.js硬实战:115个核心技巧》的受众是那些对Node有一定经验,正在寻求更进一步的读者。建议有一定的JavaScript基础的读者,最好也熟悉Windows、OSX或者Linux命令行的读者阅读。

同时,我们注意到很多Node开发者有来自客户端的JavaScript开发背景。因此,我们会花一些时间来解释一些不大熟悉的概念,如处理二进制数据、底层网络和文件系统的工作,以及和主机操作系统进行交互——所有这些都使用Node来作为教学指南。

章节路线图

这《Node.js硬实战:115个核心技巧》共分为三部分。

第一部分包括了Node的核心基础,我们关注于那些可能用到的Node核心模块(非第三方模块)。第1章简要概述了Node的目的和意义。第2到第8章每一章内容会深入Node核心的不同方面,从Buffers到流,从网络到子进程。

第二部分内容关注于真实世界的开发技巧。第9到第12章的内容,将帮助你掌握4种非常实用的技能——测试、Web开发、调试以及在生产环境运行Node。除了Node核心模块之外,这些章节的内容也会包括许多第三方模块的使用。

第三部分将指引你以一种直接的方式来创建自己的Node模块,使用npm命令的各种方法来处理打包、运行、测试、基准测试和共享模块。它同时也包括进行有效的项目版本化的有用提示。

整《Node.js硬实战:115个核心技巧》有115个技巧,每一部分包括了一个特定的Node.js主题或者任务,包括了实际

问题、解决方案和讨论部分。

代码约定和下载

在《Node.js硬实战:115个核心技巧》中的所有代码都是像这样的固定宽度的字体,如fixed-widthfontlikethis,以和周边其他文本内容区分开来。在很多列表中,代码中的关键概念会有相应的注解,带有编号的符号有时候可以帮助在文本中找到其他额外关于代码的有用信息。

这《Node.js硬实战:115个核心技巧》的代码风格基于GoogleJavaScript的编码风格1。这意味着我们把var声明独立开来,使用驼峰式来命名函数和变量,并且通常都带分号。我们的风格是在Node社区使用的多种JavaScript代码风格的混合。

大部分书中所示的代码可以以不同的形式在伴随着书的示例源代码中找到。示例源代码可以免费地从博文视点网站上下载:www.broadview.com.cn,也可以在Github上关注:

https://github.com/alexyoung/nodeinpractice。

读者在线服务

购买《Node.js硬实战》并注册账号,你可以在上边对《Node.js硬实战:115个核心技巧》进行评论、提交勘误或者咨询问题,从编辑或者其他用户那里获得帮助。

关于封面插图

《Node.js硬实战》的封面插图的标题是“来自Ayvalik的年轻人”,Ayvalik是在土耳其爱琴海岸的一个小镇。这个插图是从奥斯曼帝国在1802年1月1日发布的伦敦OldBond街的WilliamMiller创作的一系列服饰中获取的。标题页在整个集合中丢失了,我们已经无法追溯其日期。在书的内容表格中带有英文和法文标识,每个插图都有两位艺术家的名字。两百年之后,你一定会惊讶地发现,他们的艺术作品竟让计算机编程的书变得如此优雅、有魅力。

这一图片系列是由Manning的一位编辑在Manhattan的西第二十六街Garage的一个跳蚤市场购买的。卖家是一个在土耳其Ankara的美国人,交易就发生在他正要收摊的时候。Manning的编辑身上并没有足够的现金,信用卡和支票都被礼貌地拒绝了。当天晚上卖家就要坐飞机回Ankara,好像没有希望了。结果是怎么解决的?仅仅只是握手,一个老式的verbal协议。卖家简单地提出将钱电汇给他就好,编辑带着一张写了银行信息的纸和胳膊下的公事包就走了。当然,第二天我们就把钱汇过去了。我们依旧很感谢这个陌生人对我们的信任。这是很久前的一段回忆。

在Manning的我们,为自己的创意和突破,以及基于带回来的两个世纪前的照片集的计算机书籍封面能如此丰富多彩而庆幸。

前言/序言

当Node在2009年出现的时候,我们知道有一些东西不一样了。在服务端JavaScript并不是什么新鲜的东西。事实上,服务端的JavaScript几乎和客户端的JavaScript存在的时间一样长。Node中,JavaScript运行时的速度,再加上基于事件的并行,这些很多熟悉JavaScript程序员都熟悉的东西,确实是让人感到不可抗拒。不仅仅是像我们这样背景的客户端JavaScript开发者——Node吸引了从系统层面到各种服务端开发、PHP、Ruby或者Java的开发者们。我们都可以发现自己身处于这变化中。

在那个时候,Node有很多变化,我们受困于它,但是在这个过程中也学习了很多东西。从一开始,Node关注于一个小的、低级别的核心库,来为大量多样化并且增长的用户提供足够的功能。值得庆幸的是,因为早期的一些设计决定,今天大量多样化的用户空间还存在着。Node现在更加稳定,并且在许多初创企业和已成功企业生产环境中使用。

当Manning联系我们来编写一本中级的、关于Node的书时,我们想到了在过去和常见陷阱做斗争时,以及在Node社区中获得的经验教训。尽管我们非常喜欢那些提供给开发人员的大量真正优秀的第三方模块,但是,我们留意到越来越少的开发人员接触到Node核心基础的教学。所以我们着手编写了《Node.js硬实战》,来以一种深入和彻底的方式,探索Node的根源和基础,并且解决很多我们个人遇见过的,或者看到他人处理过的问题。


其他推荐