编辑推荐

适读人群:开发人员和有一些JavaScript基本知识且有兴趣去深入了解如何开发和设计企业级的Node.js应用的软件架构师

?Node.js的开发方式:如何使用正确的思维方式去解决一个Node.js开发设计问题。比如你会学习到,传统设计模式在Node.js开发中的不同体现,或者如何设计提供单一功能的模块。
?一整套解决常见Node.js设计和编码问题的设计模式:你会学习到一整套像“瑞士军刀”一样功能多样、实用的设计模式,让你能即学即用,解决日常遇到的程序开发和设计问题。
?如何编写模块化、高效率的Node.js程序:你将会理解开发大规模并且结构组织合理的Node.js程序的基本方法,并能运用这些方法去解决不属于现有设计模式范畴的新问题。
?真实项目中用到的库和技术:LevelDb、Redis、RabbitMQ、ZMQ及Express等用来作为示例阐述某个设计模式或者方法,让例子更加实用,对生态系统及它解决问题的方法有所了解。

内容简介

Node.js设计模式(第2版)》通过大量示例形象地阐述了Node.js的哲学思想和设计模式。内容主要由六部分组成:Node核心思想、基础设计模式、异步控制流模式、流编程、Node.js的传统设计模式和特有设计模式、通用编程的Web应用以及处理复杂实际问题的高级编程技巧。这是一本值得深入品读的书籍,读者若具备一些软件设计的理论知识会有助于理解书中提出的概念,中级Node.js开发者也会从《Node.js设计模式(第2版)》有所收获。《Node.js设计模式(第2版)》尤其适用于已经接触过Node.js并且想在效率、设计质量和可扩展性方面获得提升的开发者。

作者简介

MarioCasciaro,软件工程硕士学位,软件工程师,企业家,对技术、科学和开源知识充满了热情。他在IBM开始了职业生涯,数年间先后参与很多不同产品的开发,例如TivoliEndpointManager、CognosInsight及SalesConnect。后来,他加入了一个成长中的SaaS公司――D4HTechnologies,负责开发一款实时应急管理的前沿产品。现在,Mario是Sponsorama.com的联合创始人兼CEO,这是一个帮助在线项目募集企业赞助资金的平台。Mario也是Node.jsDesignPatterns(Node.js设计模式)第一版的作者。
翻译成员全部来自陆金所大前端团队,也是公众号大前端工程师的翻译小组成员,他们在公众号与知乎专栏里面也有很多新的技术文章的翻译,此次由寸志老师带队,大家一边在公司进行nodejs项目的推广实践,一边将实践的心得注入到《Node.js设计模式(第2版)》翻译的理解,这是非常难得的结合,相信大家在读的过程中能体会到这一点。

目录

第1章欢迎来到Node.js平台
Node.js的哲学思想
小核心
小模块
小接触面
简单和实用
认识Node.js6和ES2015
let和const关键字
箭头函数
类语法
增强的对象字面量
Map和Set集合
WeakMap和WeakSet集合
模板字面量
其他ES2015特性
Reactor模式
I/O是缓慢的
阻塞I/O
非阻塞I/O
事件多路分解器
Reactor模式简介
Node.js-libuv的非阻塞I/O引擎
Node.js的秘诀
总结
第2章Node.js基础设计模式
回调模式
CPS(ContinuationPassingStyle
同步或异步
Node.js回调约定
模块系统及其模式
揭示模块模式
Node.js模块解释
模块定义模式
观察者模式
EventEmitter类
创建和使用EventEmitter
传播错误
使任何对象可观察
同步和异步事件
EventEmitter与回调
组合回调和EventEmitter
总结
第3章异步控制流模式之回调函数
异步编程的困难
创建一个简单的网络蜘蛛
回调地狱
使用纯JavaScript
回调规则
应用回调规则
顺序执行
并行执行
有限制的并行执行
async库
顺序执行
并行执行
有限制的并行执行
总结
xiv
第4章异步控制流模式之ES2015+
promise
什么是promise
Promises/A+实现
Node.js风格函数的promise化
顺序执行
并行执行
有限制的并行执行
在公共API中暴露callback和promise
generator
generator基础
generator的异步控制流
顺序执行
并行执行
有限制的并行执行
使用Babel的asyncawait
安装和运行Babel
比较
总结
第5章流编程
流的重要性
缓冲和流
空间效率
时间效率
组合性
开始学习流
流的分类
可读流
可写流
双向流(Duplexstream)
变换流
使用管道拼接流
使用流处理异步流程
顺序执行
无序并行执行
无序有限制的并行执行
顺序并行执行
xv
管道模式
组合流
复制流
合并流
复用和分解
总结
第6章设计模式
工厂模式
创建对象的通用接口
一种封装的机制
构建一个简单的代码分析器
可组合的工厂函数
扩展
揭示构造函数
只读事件触发器
扩展
代理模式
实现代理模式的方法
不同方法的比较
创建日志记录的写入流
生态系统中的代理模式――函数钩子与面向行为编程(AOP)
ES2015中的Proxy对象
扩展
装饰者模式(Decorator)
实现装饰者模式的方法
装饰一个LevelUP数据库
扩展
适配器模式(Adapter)
通过文件系统API来使用LevelUP数据库
扩展
策略模式(Strategy)
支持多种格式的配置对象
扩展
状态模式
实现一个基本的自动防故障套接字
模板模式(Template)
配置管理器模板
xvi
扩展
中间件(Middleware)
Express中的中间件
设计模式中的中间件
为?MQ创建中间件框架
在Koa中使用生成器的中间件
命令模式(Command)
灵活的设计模式
总结
第7章连接模块
模块和依赖
Node.js中最常见的依赖
内聚和耦合
有状态的模块
连接模块模式
硬编码依赖
依赖注入
服务定位器
依赖注入容器
连接插件
插件作为包
扩展点
插件控制与应用程序控制的扩展
实现注销插件
总结
第8章通用JavaScript的Web应用程序
与浏览器端共享代码
共享模块
Webpack简介
Webpack的魔力
Webpack的优点
使用ES2015和Webpack
跨平台开发基础
运行时代码分支
构建时代码分支
模块交换
xvii
用于跨平台开发的设计模式
React介绍
第一个React组件
JSX是什么
配置Webpack以实现JSX转换
在浏览器中渲染
React路由库
创建通用JavaScript应用程序
创建可用的组件
服务端渲染
通用渲染和路由
通用数据检索
总结
第9章高级异步编程技巧
需要异步初始化的模块
规范解决方案
预初始化队列
题外话
异步批处理和缓存
实现没有缓存或批处理的服务器
异步请求批处理
异步请求缓存
使用promise进行批处理和缓存
运行CPU绑定的任务
解决子集和问题
交叉使用setImmediate
使用多进程
总结
第10章扩展与架构模式
应用程序扩展介绍
扩展Node.js应用程序
可扩展性的三个维度
克隆和负载均衡
集群模块
处理有状态通信
使用反向代理进行扩展
xviii
使用服务注册表
对等负载均衡
分解复杂的应用程序
单体式架构
微服务架构
微服务架构中的集成模式
总结
第11章消息传递与集成模式
消息系统的基础
单向和请求/应答模式
消息类型
异步消息和队列
对等或基于代理的消息
发布/订阅模式
构建简约的实时聊天应用程序
使用Redis作为消息代理
使用?MQ对等发布/订阅
持久订阅者
管道和任务分配模式
MQ扇出/扇入模式
使用AMQP实现管道和竞争消费者模式
请求/应答模式
关联标识符
返回地址
总结

精彩书摘

  《Node.js设计模式(第2版)》:
  依赖连接当然是软件工程中最有偏见的主题之一,但是在本章中,我们尽可能客观地分析最重要的一些连接模式。我们梳理了一些关于单例对象和Node.js中的实例最常见的疑问,学习了如何使用硬编码的依赖(DI)和服务定位器连接模块。同时我们练习了实现身份验证服务器的每种技术,由此我们能够明辨每种方法的优缺点。
  在本章的第2节中,我们了解了应用程序如何支持插件,最重要的是,我们如何将这些插件连接到主应用程序中。我们在本章的第1节中用了相同的技术,但是从另一个角度对其进行分析。我们体会到了插件能够访问主应用程序的正确服务有多重要,可能会影响其功能。
  在本章后面,对于应用程序我们从解耦水平,可重用性和简单性方面考虑来选择一个最佳方案,这应该不难。也可以考虑在同一个应用程序中使用多种模式。例如,可以使用硬编码的依赖作为主要技术,然后在连接插件时使用定位服务器。我们现在可以做的事情真的没有限制,因为我们知道每种方法的最佳用例。
  到目前为止,我们的分析主要集中在高度通用和可定制的模式上,从下一章开始,我们将会解决更具体的技术问题,例如探讨解决CPU绑定任务、异步缓存和与浏览器共享代码等有关问题的具体方法。
  ……

前言/序言

前言
很多人认为Node.js的出现是Web开发领域十年内最大的变化,它就像是游戏规则的改变者。之所以被喜爱不仅是因为技术上的出众能力,同时也因为它带给Web开发新的思维方式。
首先,Node.js应用是使用JavaScript语言编写的,而JavaScript又是唯一被绝大多数Web浏览器原生支持的编程语言。该特性使得单语言应用栈以及服务端、客户端代码共享成为可能。Node.js本身也促进了JavaScript语言的兴起和发展。人们意识到,在服务端使用JavaScript并不像在浏览器端使用它那样糟糕,并且人们将慢慢喜欢上它的编程思维和它混合的天性,即面向对象和函数式编程的结合。

其次,单线程和异步架构也是Node.js带来的革命性变化。除了性能和可扩展性方面的明显优势外,其改变了开发者处理程序并发和并行的方式。队列取代了互斥锁,回调函数和事件
机制取代了多线程,因果关系取代了同步性。

最后也是最重要的一点,Node.js拥有一套完整的生态系统:npm包管理器、不断增长的模块数量、热情活跃的开发社区,以及基于简单、实用主义和极端模块化而产生的独特文化。然而,因为这些特性,Node.js开发给人一种与其他服务端语言开发非常不一样的感受,刚开始接触Node.js的开发者,会经常困惑于如何有效地解决一些最常见的设计和代码编写问题。
常见的问题有:“如何组织代码?”“设计这个系统的最好方法是什么?”“怎样使我的程序更加模块化?”“我该怎样高效实现大量的异步调用?”“我该如何确保我的程序随着规模增大会一直稳定运行,不会崩溃?”或者更简单的问题,“Node.js开发的正确方式是什么?”幸运的是,Node.js已经成为一个非常成熟的开发平台,以上大部分问题都能通过设计模式、被证明有效的编码技巧或者他人提供的经验来解决。《Node.js设计模式(第2版)》的目的就是指导你学习并掌握Node.js开发的一些设计模式、编码技巧和实践经验,告诉你解决这些常见问题的有效方法并教会你如何从这些方法出发,解决你自己遇到的特定问题。通过阅读《Node.js设计模式(第2版)》,你将掌握以下这些内容:
?Node.js的开发方式
如何使用正确的思维方式去解决一个Node.js开发设计问题。比如你会学习到,传统设计模式在Node.js开发中的不同体现,或者如何设计提供单一功能的模块。
?一整套解决常见Node.js设计和编码问题的设计模式
你会学习到一整套像“瑞士军刀”一样功能多样、实用的设计模式,并且你能即学即用,解决日常遇到的程序开发和设计问题。
?如何编写模块化、高效率的Node.js程序
你将会了解开发大规模并且结构组织合理的Node.js程序的基本方法,并能运用这些方法去解决不属于现有设计模式范畴的新问题。
在《Node.js设计模式(第2版)》中,你会看到一些真实项目中用到的库和技术,比如LevelDb、Redis、RabbitMQ、ZMQ及Express等。这些会用来作为示例阐述某个设计模式或者方法,除了让例子更加实用外,它们同时会让你对Node.js的生态系统以及它解决问题的一套方法有所了解。无论你正使用或打算在你的工作、非正式项目或者开源项目中使用Node.js,认识和使用众所周知的设计模式和技术能够让你通过一种通用的语言和他人共享你的代码和设计,不仅如此,这还会帮助你更好地了解Node.js的未来,以及知道如何为其发展贡献自己的一份力量。


各章介绍
第1章,欢迎来到Node.js平台,本章通过讲解Node.js本身核心的设计模式来介绍Node.js程序的设计,包括Node.js的生态系统、编程思想,以及Node.jsV6版本、ES2015和Reactor模
式的简单介绍。

第2章,Node.js基础设计模式,开始介绍Node.js异步编程和设计模式,讨论和比较了回调函数与事件触发器(观察者模式)。本章还介绍了Node.js的模块系统和相关模块的设计模式。
第3章,异步控制流模式之回调函数,介绍了系列用于有效处理Node.js中的异步控制流的模式和技术。这一章将教你怎样使用纯JavaScript和异步库来缓解“回调地狱”的问题。
第4章,异步控制流模式之ES2015+,介绍了Promise、Generator和async-await的异步控制流的探索进展。
第5章,流编程,深度挖掘Node.js中最重要的模式之一:流。本章将向你展示如何处理数据流交换及如何将它们组合成不同的布局。
第6章,设计模式,本章涉及一个有争议的话题:Node.js的传统设计模式。介绍了最流行的传统设计模式,并展示了它们在Node.js中的应用。同时也介绍了一些JavaScript和Node.js中独有的新设计模式。
第7章,连接模块,分析了将多个模块关联到一个应用程序中的不同解决方案。在本章中我们将学习几个设计模式,例如依赖注入容器和服务定位器。
第8章,通用JavaScript的Web应用程序,探讨了现代JavaScriptWeb应用最有趣的功能之一:前、后端代码共享。本章我们将学习通用的JavaScript基本原则,通过使用React、Webpack
和Babel来构建一个简单的Web应用程序。
第9章,高级异步编程技巧,本章展示怎样使用直接可用的解决方案来解决一些常见的编码和设计问题。
第10章,扩展和架构模式,介绍扩展Node.js应用的基本技术和模式。
第11章,消息传递与集成模式,提出了最重要的消息传递模式,介绍如何构建和集成使用ZMQ和AMQP的复杂的分布式系统。你需要为《Node.js设计模式(第2版)》准备什么为了试验代码,需要安装Node.js第6版(或更高版本)和npm3(或更高版本)。一些例子还要求使用转码器,例如Babel。还需要熟悉命令提示符,了解如何安装npm包,还要了解怎样运行Node.js应用。还需要有一个文本编辑器来编写代码和一个现代浏览器进行测试。

适合读者
Node.js设计模式(第2版)》适合于已经接触过Node.js并且想在效率、设计质量和可扩展性方面获得提升的开发者。由于《Node.js设计模式(第2版)》也包含一些基本概念,因此你只需要通过一些基本例子了解相关技术即可。中级
Node.js的开发者也会从《Node.js设计模式(第2版)》有所收获。具备一些软件设计理论背景知识也会有助于理解《Node.js设计模式(第2版)》提出的概念。
Node.js设计模式(第2版)》假定你有Web应用开发、JavaScript、Web服务、数据库和数据结构的相关知识。


约定
在《Node.js设计模式(第2版)》中,你会发现许多文本样式,这些样式用于区分不同种类的信息。下面是一些这些样式的例子和它们表示的含义。
代码块设置如下:
constzmq=require('zmq')
constsink=zmq.socket('pull');
sink.bindSync("tcp://*:5001");
sink.on('message',buffer=>{
console.log(`Messagefromworker:${buffer.toString()}`);
});
当希望读者特别注意代码块的特定部分时,以粗体显示该部分:
functionproduce(){
//...
variationsStream(alphabet,maxLength)
.on('data',combination=>{
//...
constmsg={searchHash:searchHash,variations:batch};
channel.sendToQueue('jobs_queue',newBuffer(JSON.stringify(msg)));
//...
})
//...
}
任何命令行输入或输出设置如下:
nodereplier
noderequestor
新术语和重要词汇会以粗体显示。


其他推荐