本书从不同的视角介绍了 Node 内在的特点和结构。由首章Node 介绍为索引,涉及Node 的各个方面,主要内容包含模块机制的揭示、异步I/O 实现原理的展现、异步编程的探讨、内存控制的介绍、二进制数据Buffer 的细节、Node 中的网络编程基础、Node 中的Web 开发、进程间的消息传递、Node 测试以及通过Node 构建产品需要的注意事项。的附录介绍了Node 的安装、调试、编码规范和NPM 仓库等事宜。
本书适合想深入了解 Node 的人员阅读。
本深度讲解Node的图书
源码级别探寻过Node的实现原理
一线Node开发者真实的经验
朴灵
真名田永强,文艺型码农,就职于数据平台,博学工程师,Node.js布道者,写了多篇文章介绍Node.js的细节。活跃于CNode社区,是线下会议NodeParty的组织者和JSConf China(沪JS和京JS)的组织者之一。热爱开源,多个Node.js模块的作者。叩首问路,码梦为生。
第1章 Node简介1
1.1 Node的诞生历程1
1.2 Node的命名与起源1
1.2.1 为什么是JavaScript2
1.2.2 为什么叫Node2
1.3 Node给JavaScript带来的意义2
1.4 Node的特点4
1.4.1 异步I/O4
1.4.2 事件与回调函数6
1.4.3 单线程7
1.4.4 跨平台7
1.5 Node的应用场景8
1.5.1 I/O密集型8
1.5.2 是否不擅长CPU密集型业务8
1.5.3 与遗留系统和平共处10
1.5.4 分布式应用10
1.6 Node的使用者10
1.7 参考资源11
第2章 模块机制12
2.1 CommonJS规范13
2.1.1 CommonJS的出发点13
2.1.2 CommonJS的模块规范14
2.2 Node的模块实现15
2.2.1 优先从缓存加载16
2.2.2 路径分析和文件定位16
2.2.3 模块编译18
2.3 核心模块20
2.3.1 JavaScript核心模块的编译过程21
2.3.2 C/C++核心模块的编译过程22
2.3.3 核心模块的引入流程25
2.3.4 编写核心模块25
2.4 C/C++扩展模块27
2.4.1 前提条件28
2.4.2 C/C++扩展模块的编写29
2.4.3 C/C++扩展模块的编译30
2.4.4 C/C++扩展模块的加载31
2.5 模块调用栈32
2.6 包与NPM33
2.6.1 包结构34
2.6.2 包描述文件与NPM34
2.6.3 NPM常用功能37
2.6.4 局域NPM42
2.6.5 NPM潜在问题43
2.7 前后端共用模块44
2.7.1 模块的侧重点44
2.7.2 AMD规范44
2.7.3 CMD规范45
2.7.4 兼容多种模块规范45
2.8 总结46
2.9 参考资源46
第3章 异步I/O47
3.1 为什么要异步I/O47
3.1.1 用户体验48
3.1.2 资源分配49
3.2 异步I/O实现现状50
3.2.1 异步I/O与非阻塞I/O50
3.2.2 理想的非阻塞异步I/O54
3.2.3 现实的异步I/O54
3.3 Node的异步I/O56
3.3.1 事件循环56
3.3.2 观察者56
3.3.3 请求对象57
3.3.4 执行回调59
3.3.5 小结60
3.4 非I/O的异步API60
3.4.1 定时器60
3.4.2 process.nextTick()61
3.4.3 setImmediate()62
3.5 事件驱动与高性能服务器63
3.6 总结65
3.7 参考资源65
第4章 异步编程66
4.1 函数式编程66
4.1.1 高阶函数66
4.1.2 偏函数用法67
4.2 异步编程的优势与难点68
4.2.1 优势69
4.2.2 难点70
4.3 异步编程解决方案74
4.3.1 事件/订阅模式74
4.3.2 Promise/Deferred模式82
4.3.3 流程控制库93
4.4 异步并发控制105
4.4.1 bagpipe的解决方案105
4.4.2 async的解决方案109
4.5 总结110
4.6 参考资源110
第5章 内存控制111
5.1 V8的垃圾回收机制与内存限制111
5.1.1 Node与V8112
5.1.2 V8的内存限制112
5.1.3 V8的对象分配112
5.1.4 V8的垃圾回收机制113
5.1.5 查看垃圾回收日志119
5.2 高效使用内存121
5.2.1 作用域121
5.2.2 闭包123
5.2.3 小结124
5.3 内存指标124
5.3.1 查看内存使用情况124
5.3.2 堆外内存126
5.3.3 小结127
5.4 内存泄漏127
5.4.1 慎将内存当做缓存127
5.4.2 关注队列状态130
5.5 内存泄漏排查130
5.5.1 node-heapdump131
5.5.2 node-memwatch132
5.5.3 小结135
5.6 大内存应用135
5.7 总结136
5.8 参考资源136
第6章 理解Buffer137
6.1 Buffer结构137
6.1.1 模块结构137
6.1.2 Buffer对象138
6.1.3 Buffer内存分配139
6.2 Buffer的转换141
6.2.1 字符串转Buffer141
6.2.2 Buffer转字符串142
6.2.3 Buffer不支持的编码类型142
6.3 Buffer的拼接143
6.3.1 乱码是如何产生的144
6.3.2 setEncoding()与string_decoder()144
6.3.3 正确拼接Buffer145
6.4 Buffer与性能146
6.5 总结149
6.6 参考资源149
第7章 网络编程150
7.1 构建TCP服务150
7.1.1 TCP150
7.1.2 创建TCP服务器端151
7.1.3 TCP服务的事件153
7.2 构建UDP服务154
7.2.1 创建UDP套接字154
7.2.2 创建UDP服务器端154
7.2.3 创建UDP客户端155
7.2.4 UDP套接字事件155
7.3 构建HTTP服务155
7.3.1 HTTP156
7.3.2 http模块157
7.3.3 HTTP客户端161
7.4 构建WebSocket服务163
7.4.1 WebSocket握手164
7.4.2 WebSocket数据传输167
7.4.3 小结169
7.5 网络服务与安全169
7.5.1 TLS/SSL170
7.5.2 TLS服务172
7.5.3 HTTPS服务173
7.6 总结175
7.7 参考资源176
第8章 构建Web应用177
8.1 基础功能177
8.1.1 请求方法178
8.1.2 路径解析179
8.1.3 查询字符串180
8.1.4 Cookie181
8.1.5 Session184
8.1.6 缓存190
8.1.7 Basic认证193
8.2 数据上传195
8.2.1 表单数据195
8.2.2 其他格式196
8.2.3 附件上传197
8.2.4 数据上传与安全199
8.3 路由解析201
8.3.1 文件路径型202
8.3.2 MVC202
8.3.3 RESTful207
8.4 中间件210
8.4.1 异常处理214
8.4.2 中间件与性能215
8.4.3 小结216
8.5 页面渲染217
8.5.1 内容响应217
8.5.2 视图渲染219
8.5.3 模板220
8.5.4 Bigpipe231
8.6 总结235
8.7 参考资源235
第9章 玩转进程236
9.1 服务模型的变迁236
9.1.1 石器时代:同步236
9.1.2 青铜时代:复制进程237
9.1.3 白银时代:多线程237
9.1.4 黄金时代:事件驱动237
9.2 多进程架构238
9.2.1 创建子进程239
9.2.2 进程间通信240
9.2.3 句柄传递242
9.2.4 小结247
9.3 集群稳定之路248
9.3.1 进程事件248
9.3.2 自动重启249
9.3.3 负载均衡254
9.3.4 状态共享255
9.4 Cluster模块257
9.4.1 Cluster工作原理258
9.4.2 Cluster事件259
9.5 总结259
9.6 参考资源260
第10章 测试261
10.1 单元测试261
10.1.1 单元测试的意义261
10.1.2 单元测试介绍263
10.1.3 工程化与自动化276
10.1.4 小结277
10.2 性能测试278
10.2.1 基准测试278
10.2.2 压力测试280
10.2.3 基准测试驱动开发281
10.2.4 测试数据与业务数据的转换283
10.3 总结284
10.4 参考资源284
第11章 产品化285
11.1 项目工程化285
11.1.1 目录结构285
11.1.2 构建工具286
11.1.3 编码规范289
11.1.4 代码审查289
11.2 部署流程290
11.2.1 部署环境291
11.2.2 部署操作291
11.3 性能293
11.3.1 动静分离293
11.3.2 启用缓存294
11.3.3 多进程架构294
11.3.4 读写分离295
11.4 日志295
11.4.1 访问日志295
11.4.2 异常日志296
11.4.3 日志与数据库299
11.4.4 分割日志299
11.4.5 小结299
11.5 监控报警299
11.5.1 监控300
11.5.2 报警的实现302
11.5.3 监控系统的稳定性303
11.6 稳定性303
11.7 异构共存304
11.8 总结305
11.9 参考资源305
附录A 安装Node306
A.1 Windows系统下的Node安装306
A.2 Mac系统下Node的安装307
A.3 Linux系统下Node的安装308
A.4 总结309
A.5 参考资源309
附录B 调试Node310
B.1 Debugger310
B.2 Node Inspector311
B.2.1 安装Node Inspector312
B.2.2 错误堆栈312
B.3 总结313
附录C Node编码规范314
C.1 根源314
C.2 编码规范315
C.2.1 空格与格式315
C.2.2 命名规范317
C.2.3 比较操作318
C.2.4 字面量318
C.2.5 作用域318
C.2.6 数组与对象319
C.2.7 异步320
C.2.8 类与模块320
C.2.9 注解规范321
C.3 实践321
C.3.1 冲突的解决原则321
C.3.2 给编辑器设置检测工具321
C.3.3 版本控制中的hook322
C.3.4 持续集成322
C.4 总结322
C.5 参考资源323
附录D 搭建局域NPM仓库324
D.1 NPM仓库的安装325
D.1.1 安装Erlang和CouchDB325
D.1.2 搭建NPM仓库326
D.2 高阶应用328
D.2.1 镜像仓库328
D.2.2 私有模块应用328
D.2.3 纯私有仓库329
D.3 总结331
D.4 参考资源332
2006年至今,我们时常可以看到JavaScript的新闻,刚开始只是JavaScript引擎性能的提升,到后来发现很多是来自HTML5和Node创造的奇迹。如果只看表面,很容易让人感觉这又是一颗卫星。这种现象让人觉得不可信,所以出现了以下各种版本的误解。
? Node肯定是几个前端工程师在实验室里捣鼓出来的。
? 为了后端而后端,有意思吗?
? 怎么又发明了一门新语言?
? JavaScript承担的责任太重了。
? 直觉上,JavaScript不应该运行在后端。
? 前端工程师要逆袭了。
一方面,大家看到JavaScript在各个地方放出异彩,其他语言的开发者既羡慕它的成果,又担心它对当前所从事的语言造成冲击;另一方面,人们还是有JavaScript只能做前端脚本的定势思维。究其原因,还是因为人们缺乏历史观层次上的认知,所以会产生一些莫须有的惴惴不安。
1995年,JavaScript随网景公司的Netscape Navigator 2.0,它最早命名为LiveScript,随后更名为JavaScript。它出自如今的Mozilla公司的CTO——Brendan Eich之手,其产生来源于网景公司的Netscape Navigator浏览器需要一种脚本语言来协助浏览器做一些简单的动态操作。当时网景公司与Sun公司合作密切,不懂技术的管理层希望得到一个Java的脚本版语言,以期能像Java一样风靡。Brendan Eich原本进入网景公司是希望做Scheme语言的开发,但是却接到了一个不喜欢的任务,但迫于当时形势,不得不完成此事,于是JavaScript之父在10天的时间里仓促完成了JavaScript的设计,当时的项目代号是Mocha,名字叫LiveScript。
这门语言除了看起来像Java外,本质与Java语言相去甚远,管理层期望的Java Script其实借鉴了C、Scheme、Self、Java的设计。尽管仓促,但是这门语言还是借鉴了其他语言的不少优点,如函数式、原型链继承等。处于Java阴影下的这门语言获得了它最终的名字:JavaScript。至今,仍然还有许多人分不清Java与JavaScript的关系,就像分不清雷锋与雷峰塔一样。
虽然JavaScript的产生与Netscape Navigator浏览器的需求有关系,但它并非只是设计出来用于浏览器前端的。早在1994年,网景公司就公布了其Netscape Enterprise Server中的一种服务器端脚本实现,它的名字叫LiveWire,是最早的服务器端JavaScript,甚至早于浏览器中的JavaScript公布。对于这门图灵完备的语言,网景早就开始尝试将它用在后端。
随后,微软在及时次浏览器大战时,于1996年的IE 3.0中也包含了它的脚本语言:JScript。基于商标的原因,它叫JScript,但是与JavaScript兼容。在1997年年初,微软在它的服务器IIS 3.0中也包含了JScript,这就是我们在ASP中能使用的脚本语言。鉴于微软处处与网景针锋相对,出于保护自己的目的,网景公司推进了JavaScript的标准化进程,于1996年11月将JavaScript递交给ECMA国际标准组织,在1997年7月公布了及时个版本,是为ECMA-262号标准,又称ECMAScript。
可以看到,JavaScript一早就能运行在前后端,但风云变幻,在前后端各自的待遇却不尽相同。伴随着Java、PHP、.NET等服务器端技术的风靡,与前端浏览器中的JavaScript越来越重要相比,服务器端JavaScript逐渐式微。只剩下Rhino、SpiderMonkey用于工具。
然而,这个世界是变化的。及时次浏览器大战落幕后的JavaScript的世界有些平静,但依然在萌生一些变化。Google对Ajax的应用让JavaScript变得越来越重要。Firefox的掀起了对IE的反攻,迎来了第二次浏览器大战,竞争令JavaScript的性能不断提升,Chrome的加入令它高潮迭出。CommonJS规范的提出,不断在完善JavaScript。ECMAScript标准的不断推进,令语言更加精炼简洁,不停地去芜存菁。
浏览器端JavaScript在Web应用中盛行,甚至让人们忘掉了JavaScript可以在服务器端运行这码事。但是,服务器端JavaScript现在回来了,因为Node诞生了。Node的诞生离不开上述的历史契机,服务器端JavaScript在漫长的历史中长期停滞留下空白,但Node重新将这个领域激活。Ryan Dahl基于对高性能Web服务器的探索,无意间促成了服务器端JavaScript领域的焕然一新。Node凭借V8的高性能和异步I/O模型将JavaScript重新推向了一个高潮。现在,Node不仅满足JavaScript同时运行在前后端,而且性能还十分高效。与传统印象中的不同,它甚至可比于当前的高效脚本语言。
奇妙的反应还在继续,前后端要跨语言开发的现状已经开始改变,因为语言堆栈的不同,开发者的分工也进行了细分:前端工程师和后端工程师。专业技能因为分工而精进,但也将技能变为专利,似乎前端工程师不能进行后端开发,后端工程师搞不定前端开发,犹如树立的墙。但Node的出现令这种分工的界限又开始模糊了。同时一些后端工程师也关注到Node,他们甚至不关心前后端语言是否一致,而是赤裸裸地表示对Node高性能的垂涎,如实时、高并发等。
大量的前后端工程师加入了Node的开发阵营,GitHub上JavaScript是最活跃的开发语言,NPM社区第三方模块恐怖的增长速度和下载量都昭示着这个过程不可逆,在这里吼一声万能的NPM,总能找到你需要的解决方案。很多不断涌现的项目和创意都因为Node和前端开发能共用一种语言而独特。换言之,Node的本意是提供一个高性能的面向网络的执行平台,但无意间促成了JavaScript社区的繁荣,并进而形成强大的生态系统。
本书目的
目前,还没有一本书将Node自身结构介绍出来,大多停留在Node介绍或者框架、库的使用层面上,本书希望从不同的视角揭示Node自己内在的特点和结构。也许你已经用过Node进行相关的开发,在使用了Node带来的欣喜后,还能在阅读本书时,发出一句"哦,原来Node是这样的",这就是本书的简单寄望。
对于Node初学者,目前市面上也已经有Node相关的入门书,它们可以快速地领你进入Node开发之旅。在了解了这些基本过程后,想了解更多Node知识的好奇心,会领你来阅读本书的。
阅读建议
本书并非按照顺序递进式介绍,如第2章是从代码组织结构看待Node,第3章是从运行结构看Node,第4章则是从编程结构看Node,第5章则是Node中内存结构的揭示,第6章谈及的是Node中的数据在I/O流中的结构或状态,第7章是Node在网络服务角度的介绍,第8章是Node在HTTP上的展现,第9章讨论了Node的单机集群结构,第10章是从单元测试和性能测试的角度去关注Node,第11章虽然已经脱离了Node编码的范畴,但是站在产品化的角度看待Node,也会颇有收获。
下面是各章的详细介绍。
第1章:这一章简要介绍了Node,从中可以了解Node的发展历程及其带来的影响和价值。
第2章:这一章介绍了Node的模块机制,从中可以了解到Node是如何实现CommonJS模块和包规范的。在这一章中,我们详细解释了模块在引用过程中的编译、加载规则。另外,我们还能读到更深度的关于Node自身源代码的组织架构。
第3章:这一章展示了在Node中我们将异步I/O作为主要设计理念的原因。另外,还会介绍到异步I/O的详细实现过程。
第4章:这一章主要介绍异步编程,其中有常见的异步编程问题介绍,也有详细的解决方案。在这一章中,我们可以接触到Promise、事件、高阶函数是如何进行流程控制的。
第5章:这一章主要介绍了Node中的内存控制,主要内容有垃圾回收、内存限制、查看内存、内存泄漏、大内存应用等细节。
第6章:这一章介绍了前端JavaScript里不能遇到的Buffer。由于Node中会涉及频繁的网络和磁盘I/O,处理字节流数据会是很常见的行为,这部分场景与纯粹的前端开发不同。
第7章:这一章介绍了Node支持的TCP、UDP、HTTP编程,还附赠了WebSocket与TLS、HTTPS的介绍。
第8章:这一章介绍了构建Web应用的过程中用到的大多数技术细节,如数据处理、路由、MVC、模板、RESTful等
第9章:这一章介绍了Node的多进程技术,以及如何借助多进程的方式来提升应用的可用性和性能。
第10章:这一章介绍了Node的单元测试和性能测试技巧。
第11章:"行百里者半九十",完成产品开发的代码编写后,才完成了项目的及时步。这一章介绍了将Node产品化所需要注意到的细节,如项目工程化、代码部署、日志、性能、监控报警、稳定性、异构共存等。
附录A:详细介绍了Node的安装步骤。
附录B:讨论了Node的调试技巧。
附录C:探讨了团队实践或多人协作过程中需要关注的编码规范问题,它可以很好地规避一些低级的、明显的错误。
附录D:作为企业开发者,必须关注模块仓库的搭建管理。在这一章中,我们介绍了如何通过搭建私有NPM来解决企业隐私安全等方面的问题。
Node.js让JavaScript在服务器端焕发生机,这是一本带着文艺调调的好看的技术书,书中详细阐述了Node.js的方方面面。如果你是前端工程师,这会是你迈向全端工程师的关键一步。
——玉伯,支付宝高级技术专家
通过学习Node.js,你可以接触到的开发模式与协作思想。通过阅读这本书,你可以在软件开发领域获得广泛而又有深度的收获!所以,我很推荐这本书!
——庄表伟
从未读过这么让人想一翻到底的Node.js技术读物,看完 "内存控制"这一章后,重新写代码的时候,仿佛都能看到V8是如何进行垃圾回收的。如果你还在纠结callback带来的}}}}}}}嵌套问题,那么推荐你阅读"异步编程"这一章,保障让你大开眼界。世界上本没有嵌套回调,写的人多了,也便有了}}}}}}}。JavaScript已经不仅仅是在浏览器上运行的玩具语言, 它正在通过Node.js进军所有领域。
阅读本书,开启你人生的及时个Node节点吧。
——Python发烧友,数据平台技术专家
对node.js编程思想讲解很深入,非常值得一读
从去年开始关注nodejs,开始先买了《深入浅出nodejs》,觉得后面还是有点深,平时课程也多,没有太多的时间来研究,都是平常花时间关注,了解一下,自己看了很多理论,但是没有实践过,一看到这本书有预定,马上就加了群然后预定了此书,书到了,虽然被压邹了一点,但是完全不影响他的质量,很好的一本书,不论是在内容,还是排版上面,都做得非常优秀,虽然也有点不足的地方需要去改进,但是对于刚刚开始写书的他们来说,已经很好了,希望大家支持他们,希望大家给他们动力。让他们越写越好,让node.js被更多的人知道,让更多的公司去招node.js人才,这样我们就有很…
这本书适合有一定开发经验的人看。对一些常用的功能做了细致的剖析。对深入理解node很有帮助
感觉还不错,讲的知识由浅入深。尤其对于没有node变成经验的人说,还不错
自我感觉这本书不适合对nodejs一点也不懂的初学者,因为他讲的内部的原理比较多!适合那些对nodejs的开发比较熟悉的、想要深入理解的人
打开看了一章就感受到了 非同凡响... 放枕边了. 谢谢node大神的技术分享
node.js是一门蛮新的技术来的,暂时还没有机会用到,先留着,以后可以慢慢看。
书是好书,关键纸张和印刷太烂,图灵的书貌似都很粗糙,味也大,一读就头晕,我强烈建议图灵纸张好点不行吗?
书还不错,会仔细看完,希望对自己的技术提升有帮助
这本书老师早就推荐了,一直没有卖。最近在搞前端开发,买来看看。
很多基礎的觀念建立,可建立紮實編程基礎觀念
书印刷很不错,纸质挺好。这是一本注重思想的书。
本书在Node当前的书籍中绝对的佼佼者。推荐大家阅读。针对每个知识点深度挖掘一下会让自己知识体系更完整。
非常好的一本深入学习node的书籍,来来回回我已经看了五六遍了。每次都有新的收货
书的质量不错 写得也很详细 各个知识点都有涉及
隔了好久给忘了,看了下前三章都是讲原理,好难懂啊,为了升职加薪拼了
借了图书馆的书,弄不见了,买了一本还的,感觉不太适合初学者
包装没问题,内容还没看,期待对自己的学业能够起到促进作用。
就是有点过时了,node更新很快,出版时间有点早
学学node对自己入门后台思想还是非常不错的
一口气看完了三章,讲解很清晰,原理很透彻,有顿然醒悟的感觉。非常好的一本书,值得推荐。
刚学node的时候,资料选择比较少,这本还行。有的地方就比较粗略了。总体来说还行。结合其他文档看更好。
纸质很好,很适合入门。先讲一些基础,后来就会给项目实战。很不错,很亲和的一本书,但是有点小贵
从基础介绍Node.js,对于以前没了解过的是一本不错的书
本书不适合初学者,建议初学者看《Node.js开发指南》。
一直是自学的 整体框架的话只了解一部分 数没有特别厚 不过内容还算不错 值得拥有
Node.js是热门的技术,是初学者的好帮手
内容讲的很赞,用简单的实例讲解了Node的原理。很容易理解。
这本书的内容以理论为主 适合想要从理论层面进阶的nodejs开发者。初学者的话 可能会读的比较吃力 最终不知所云,建议先从nodrjs实战开始。先练代码 再回头来研读此书 方能理解作者的经验之谈。
适合有一定Javascript开发经验的人阅读的一本书。从Node.js的底层原理到开发应用都讲得很清楚。是非常适合需要学习Node.js开发的人阅读的书籍。