内容简介
《深入浅出Node.js》从不同的视角介绍了 Node 内在的特点和结构。由首章Node 介绍为索引,涉及Node 的各个方面,主要内容包含模块机制的揭示、异步I/O 实现原理的展现、异步编程的探讨、内存控制的介绍、二进制数据Buffer 的细节、Node 中的网络编程基础、Node 中的Web 开发、进程间的消息传递、Node 测试以及通过Node 构建产品需要的注意事项。附录介绍了Node 的安装、调试、编码规范和NPM 仓库等事宜。
《深入浅出Node.js》适合想深入了解 Node 的人员阅读。
作者简介
朴灵,真名田永强,文艺型码农,就职于阿里巴巴数据平台,工程师,Node.js布道者,写了多篇文章介绍Node.js的细节。活跃于CNode社区,是线下会议NodeParty的组织者和JSConf China(沪JS和京JS)的组织者之一。热爱开源,多个Node.js模块的作者。
内页插图
精彩书评
Node.js让JavaScript在服务器端焕发生机,这是一本带着文艺调调的好看的技术书,书中详细阐述了Node.js的方方面面。如果你是前端工程师,这会是你迈向全端工程师的关键一步。
——玉伯,支付宝高级技术专家
通过学习Node.js,你可以接触到新的开发模式与协作思想。通过阅读这本书,你可以在软件开发领域获得广泛而又有深度的收获!所以,我很推荐这本书!
——庄表伟
从未读过这么让人想一翻到底的Node.js技术读物,看完 “内存控制”这一章后,重新写代码的时候,仿佛都能看到V8是如何进行垃圾回收的。如果你还在纠结callback带来的}}}}}}}嵌套问题,那么推荐你阅读“异步编程”这一章,保证让你大开眼界。世界上本没有嵌套回调,写的人多了,也便有了}}}}}}}。JavaScript已经不仅仅是在浏览器上运行的玩具语言, 它正在通过Node.js进军所有领域。
阅读本书,开启你人生的Node节点吧。
——Python发烧友,阿里巴巴数据平台技术专家
目录
第1章 Node简介
1.1 Node的诞生历程
1.2 Node的命名与起源
1.2.1 为什么是JavaScript
1.2.2 为什么叫Node
1.3 Node给JavaScript带来的意义
1.4 Node的特点
1.4.1 异步I/O
1.4.2 事件与回调函数
1.4.3 单线程
1.4.4 跨平台
1.5 Node的应用场景
1.5.1 I/O密集型
1.5.2 是否不擅长CPU密集型业务
1.5.3 与遗留系统和平共处
1.5.4 分布式应用
1.6 Node的使用者
1.7 参考资源
第2章 模块机制
2.1 CommonJS规范
2.1.1 CommonJS的出发点
2.1.2 CommonJS的模块规范
2.2 Node的模块实现
2.2.1 优先从缓存加载
2.2.2 路径分析和文件定位
2.2.3 模块编译
2.3 核心模块
2.3.1 JavaScript核心模块的编译过程
2.3.2 C/C++核心模块的编译过程
2.3.3 核心模块的引入流程
2.3.4 编写核心模块
2.4 C/C++扩展模块
2.4.1 前提条件
2.4.2 C/C++扩展模块的编写
2.4.3 C/C++扩展模块的编译
2.4.4 C/C++扩展模块的加载
2.5 模块调用栈
2.6 包与NPM
2.6.1 包结构
2.6.2 包描述文件与NPM
2.6.3 NPM常用功能
2.6.4 局域NPM
2.6.5 NPM潜在问题
2.7 前后端共用模块
2.7.1 模块的侧重点
2.7.2 AMD规范
2.7.3 CMD规范
2.7.4 兼容多种模块规范
2.8 总结
2.9 参考资源
第3章 异步I/O
3.1 为什么要异步I/O
3.1.1 用户体验
3.1.2 资源分配
3.2 异步I/O实现现状
3.2.1 异步I/O与非阻塞I/O
3.2.2 理想的非阻塞异步I/O
3.2.3 现实的异步I/O
3.3 Node的异步I/O
3.3.1 事件循环
3.3.2 观察者
3.3.3 请求对象
3.3.4 执行回调
3.3.5 小结
3.4 非I/O的异步API
3.4.1 定时器
3.4.2 process.nextTick()
3.4.3 setImmediate()
3.5 事件驱动与高性能服务器
3.6 总结
3.7 参考资源
第4章 异步编程
4.1 函数式编程
4.1.1 高阶函数
4.1.2 偏函数用法
4.2 异步编程的优势与难点
4.2.1 优势
4.2.2 难点
4.3 异步编程解决方案
4.3.1 事件发布/订阅模式
4.3.2 Promise/Deferred模式
4.3.3 流程控制库
4.4 异步并发控制
4.4.1 bagpipe的解决方案
4.4.2 async的解决方案
4.5 总结
4.6 参考资源
第5章 内存控制
5.1 V8的垃圾回收机制与内存限制
5.1.1 Node与V8
5.1.2 V8的内存限制
5.1.3 V8的对象分配
5.1.4 V8的垃圾回收机制
5.1.5 查看垃圾回收日志
5.2 高效使用内存
5.2.1 作用域
5.2.2 闭包
5.2.3 小结
5.3 内存指标
5.3.1 查看内存使用情况
5.3.2 堆外内存
5.3.3 小结
5.4 内存泄漏
5.4.1 慎将内存当做缓存
5.4.2 关注队列状态
5.5 内存泄漏排查
5.5.1 node-heapdump
5.5.2 node-memwatch
5.5.3 小结
5.6 大内存应用
5.7 总结
5.8 参考资源
第6章 理解Buffer
6.1 Buffer结构
6.1.1 模块结构
6.1.2 Buffer对象
6.1.3 Buffer内存分配
6.2 Buffer的转换
6.2.1 字符串转Buffer
6.2.2 Buffer转字符串
6.2.3 Buffer不支持的编码类型
6.3 Buffer的拼接
6.3.1 乱码是如何产生的
6.3.2 setEncoding()与string_decoder()
6.3.3 正确拼接Buffer
6.4 Buffer与性能
6.5 总结
6.6 参考资源
第7章 网络编程
7.1 构建TCP服务
7.1.1 TCP
7.1.2 创建TCP服务器端
7.1.3 TCP服务的事件
7.2 构建UDP服务
7.2.1 创建UDP套接字
7.2.2 创建UDP服务器端
7.2.3 创建UDP客户端
7.2.4 UDP套接字事件
7.3 构建HTTP服务
7.3.1 HTTP
7.3.2 http模块
7.3.3 HTTP客户端
7.4 构建WebSocket服务
7.4.1 WebSocket握手
7.4.2 WebSocket数据传输
7.4.3 小结
7.5 网络服务与安全
7.5.1 TLS/SSL
7.5.2 TLS服务
7.5.3 HTTPS服务
7.6 总结
7.7 参考资源
第8章 构建Web应用
8.1 基础功能
8.1.1 请求方法
8.1.2 路径解析
8.1.3 查询字符串
8.1.4 Cookie
8.1.5 Session
8.1.6 缓存
8.1.7 Basic认证
8.2 数据上传
8.2.1 表单数据
8.2.2 其他格式
8.2.3 附件上传
8.2.4 数据上传与安全
8.3 路由解析
8.3.1 文件路径型
8.3.2 MVC
8.3.3 RESTful
8.4 中间件
8.4.1 异常处理
8.4.2 中间件与性能
8.4.3 小结
8.5 页面渲染
8.5.1 内容响应
8.5.2 视图渲染
8.5.3 模板
8.5.4 Bigpipe
8.6 总结
8.7 参考资源
第9章 玩转进程
9.1 服务模型的变迁
9.1.1 石器时代:同步
9.1.2 青铜时代:复制进程
9.1.3 白银时代:多线程
9.1.4 黄金时代:事件驱动
9.2 多进程架构
9.2.1 创建子进程
9.2.2 进程间通信
9.2.3 句柄传递
9.2.4 小结
9.3 集群稳定之路
9.3.1 进程事件
9.3.2 自动重启
9.3.3 负载均衡
9.3.4 状态共享
9.4 Cluster模块
9.4.1 Cluster工作原理
9.4.2 Cluster事件
9.5 总结
9.6 参考资源
第10章 测试
10.1 单元测试
10.1.1 单元测试的意义
10.1.2 单元测试介绍
10.1.3 工程化与自动化
10.1.4 小结
10.2 性能测试
10.2.1 基准测试
10.2.2 压力测试
10.2.3 基准测试驱动开发
10.2.4 测试数据与业务数据的转换
10.3 总结
10.4 参考资源
第11章 产品化
11.1 项目工程化
11.1.1 目录结构
11.1.2 构建工具
11.1.3 编码规范
11.1.4 代码审查
11.2 部署流程
11.2.1 部署环境
11.2.2 部署操作
11.3 性能
11.3.1 动静分离
11.3.2 启用缓存
11.3.3 多进程架构
11.3.4 读写分离
11.4 日志
11.4.1 访问日志
11.4.2 异常日志
11.4.3 日志与数据库
11.4.4 分割日志
11.4.5 小结
11.5 监控报警
11.5.1 监控
11.5.2 报警的实现
11.5.3 监控系统的稳定性
11.6 稳定性
11.7 异构共存
11.8 总结
11.9 参考资源
附录A 安装Node
A.1 Windows系统下的Node安装
A.2 Mac系统下Node的安装
A.3 Linux系统下Node的安装
A.4 总结
A.5 参考资源
附录B 调试Node
B.1 Debugger
B.2 Node Inspector
B.2.1 安装Node Inspector
B.2.2 错误堆栈
B.3 总结
附录C Node编码规范
C.1 根源
C.2 编码规范
C.2.1 空格与格式
C.2.2 命名规范
C.2.3 比较操作
C.2.4 字面量
C.2.5 作用域
C.2.6 数组与对象
C.2.7 异步
C.2.8 类与模块
C.2.9 注解规范
C.3 最佳实践
C.3.1 冲突的解决原则
C.3.2 给编辑器设置检测工具
C.3.3 版本控制中的hook
C.3.4 持续集成
C.4 总结
C.5 参考资源
附录D 搭建局域NPM仓库
D.1 NPM仓库的安装
D.1.1 安装Erlang和CouchDB
D.1.2 搭建NPM仓库
D.2 高阶应用
D.2.1 镜像仓库
D.2.2 私有模块应用
D.2.3 纯私有仓库
D.3 总结
D.4 参考资源
精彩书摘
1 Node简介
Node应该是如今最火热的技术了,从本章开始,我们将逐步揭示它的诸多细节。
1.1 Node的诞生历程
NodelJ,3诞生历程如下所示。
2009年3月,RyanDahl在其博客上宣布准备基于V8创建一个轻量级的Web务器并提供一套库。
2009年5月,RyanDalai在GitHub上发布了最初的版本。
2009年12月和2010年4月,两届JSConfJ(会都安排了Node的讲座。
2010年年底,Node获得硅谷云计算服务商Joyent公司的资助,其创始人Joyent公司全职负责Node的发展。
2011年7月,Node在微软的支持下发布了其Windows版本。
2011年1lYl,Node超越RubyonRails,成为GitHub上关注度最高的项目(随后被Bootstrap项目超越,目前仍居第二)。
2012年1月底,RyanDahl在~Node架构设计满意的情况下,将掌门人的身份转交给IsaacZ.Schlueter,自己转向一些研究项目。IsaacZSchlueter是Node的包管理器NPM的作者,之后Node的版本发布和bug修复等工作由他接手。截至笔者执笔之曰(2013年7月13日),发布的Node稳定版为v0.10.13,非稳定版为v0.11.4,NPM的官方模块数达到34943个,模块的周下载量为1479万次。
随后,Node的发布计划主要集中在性能提升上,在v0.14之后,正式发布vI.O版本。
1.2 Node的命名与起源
在Node的官方网站之外,N0dc具有很多别称:Nodejs、NodeJS、Node.is等。本书在写作过程中遵循官方的说法,将会一直使用Node这个名字,但是在当前语境之外,为了与其余表示节点的技术或名词相区别,均可以带上is表明它是Node。在听到这些词汇时,应该意识到,它们说的是一码事。除了本书的封面和此处会用到N0dejs外,其余地方都会以Node作为正式称谓。
Node名字的来由,其实跟它的起源是有密切关系的。
1.2.1 为什么是JavaScript
RvanDahl是一名资深的C/C++程序员,在创造出N0de之前,他的主要工作都是围绕高性能we服务器进行的。经历过一些尝试和失败之后,他找到了设计高性能,WebH~务器的几个要点:事件驱动、非阻塞I/O。
所以RvanDahl最初的目标是写一个基于事件驱动、非阻塞I/O的Web服务器,以达到更高的性能,提供Apache等服务器之外的选择。他提到,大多数人不设计一种更简单和更有效率的程序的主要原因是他们用到了阻塞I/O的库。写作Node的时候,RyanDahl~评估过C、Lua、Haskell、Ruby等语言作为备选实现,结论为:C的开发门槛高,可以预见不会有太多的开发者能将它用于日常的业务开发,所以舍弃它;RyanDahl觉得自己还不足够玩转Haskell,所以舍弃它;Lua自身已经含有很多阻塞I/0库,为其构建非阻塞I/O库也不能改变人们继续使用阻塞I/0库的习惯,所以也舍弃它;而Ruby的虚拟机由于性能不好而落选。
相比之下,JavaSCriptt:gC的开发门槛要低,比Lua的历史包袱要少。尽管服务器端JavaScript存在已经很多年了,但是后端部分一直没有市场,可以说历史包袱为零,为其导人非阻塞I/0库没有额外阻力。另外,JavaScript4览器中有广泛的事件驱动方面的应用,暗合RyanDahl喜好基于事件驱动的需求。当时,第二次浏览器大战也渐渐分出高下,Chrome浏览器的JavaSCript引擎V8摘得性能第一的桂冠,而EL其基于新BSD许可证发布,自然受到RyanDahl的欢迎。考虑到高性能、符合事件驱动、没有历史包袱这3个主要原因.JavaScript成N(Node~J实现语言。
1.2.2 为什么叫Node
起初,RyanDahl称他的项目为web.js,就是一个We服务器,但是项目的发展超过了他最初单纯开发一个Web服务器的想法,变成了构建网络应用的一个基础框架,这样可以在它的基础上构建更多的东西,诸如服务器、客户端、命令行工具等。Node为一个强制不共享任何资源的单线程、单进程系统,包含十分适宜网络的库,为构建大型分布式应用程序提供基础设施,其目标也是成为一个构建快速、可伸缩的网络应用平台。它自身非常简单,通过通信协议来组织许多N0de,非常容易通过扩展来达成构建大型网络应用的目的。每一个Node进程都构成这个网络应用中的一个节点,这是它名字所含意义的真谛
……
前言/序言
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天的时间里仓促完成了JavaSc
深入浅出Node.js 电子书 下载 mobi epub pdf txt